我正在测试新的指标来测量 Pytorch 中权重矩阵之间的距离,现在我正在尝试使用 Mahalanobis。为此,我将每个矩阵重塑为一个向量,然后将其连接为一个矩阵,然后使用该矩阵计算该矩阵任意两行之间的马氏距离。问题是其中一些给我带来了负面结果,而负面的平方根则让我感到 NaN。
我知道协方差矩阵必须是正定义的,我想我搞砸了,或者我在这种情况下使用 mahalanobis 的想法是不可能的?
这是我正在使用的代码,我向它传递了一个形状为 (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()