Расстояние Махаланобиса возвращает NaN в Pytorch - PullRequest
0 голосов
/ 18 октября 2018

Я тестирую новые метрики для измерения расстояния между весовыми матрицами в Pytorch, сейчас я пытаюсь использовать Mahalanobis.Для этого я преобразую каждую матрицу в вектор и затем объединяю ее в одну матрицу, а затем использую эту матрицу для вычисления расстояния Махаланобиса между любыми двумя строками этой матрицы.Проблема в том, что некоторые из них дают мне отрицательные результаты, а квадратный корень из отрицательного числа приводит меня к NaN.

Я знаю, что ковариационная матрица должна быть положительно определена, я полагаю, что я все испортил, или, может быть, мойИдея использования махаланобиса в этом случае невозможна?

Вот код, который я использую, где я передаю ему X с формой (64,121), то есть 64 (11x11) матрицы

def _mahalanobis(X):
    VI = torch.inverse(cov(X)) #covariance matrix
    total_dist = 0
    for i,v in enumerate(X):
        dist = 0
        for j,u in enumerate(X):
            if i == j:
                continue
            x = (v-u).unsqueeze(0).t()
            y = (v - u).unsqueeze(0)

            dist = torch.sqrt(torch.mm(torch.mm(y,VI),x))

            total_dist +=dist
            print(dist)
    return total_dist


## Returns the covariance matrix of m
    def cov(m, rowvar=False):

        if m.dim() > 2:
            raise ValueError('m has more than 2 dimensions')
        if m.dim() < 2:
            m = m.view(1, -1)
        if not rowvar and m.size(0) != 1:
            m = m.t()
        # m = m.type(torch.double)  # uncomment this line if desired
        fact = 1.0 / (m.size(1) - 1)
        m -= torch.mean(m, dim=1, keepdim=True)
        mt = m.t()  # if complex: mt = m.t().conj()
        return fact * m.matmul(mt).squeeze()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...