Я тестирую новые метрики для измерения расстояния между весовыми матрицами в 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()