马哈拉诺比斯距离返回火炬NaN

时间:2018-10-18 06:23:04

标签: python matrix distance pytorch mahalanobis

我正在测试新的度量标准以测量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()

0 个答案:

没有答案