我正在测试新的度量标准以测量Pytorch中权重矩阵之间的距离,现在我正在尝试使用Mahalanobis。为此,我将每个矩阵重塑为一个向量,然后合并为一个矩阵,然后使用该矩阵计算该矩阵的任意两行之间的马哈拉诺比斯距离。问题是其中一些使我得到负面结果,而负数的平方根会抛出NaN。
我知道协方差矩阵必须是正定义的,我想我正在搞乱,或者在这种情况下我可能无法使用马哈拉诺比斯的想法?
这是我正在使用的代码,在其中将形状为(64,121)的X传递给它,即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()