【问题标题】:Working Example for Mahalanobis Distance Measure马氏距离测量的工作示例
【发布时间】:2023-03-12 07:36:01
【问题描述】:

我需要测量两个 n 维向量之间的距离。看来马氏距离在这里是一个不错的选择,所以我想尝试一下。

我的代码如下所示:

import numpy as np
import scipy.spatial.distance.mahalanobis

x = [19, 8, 0, 0, 2, 1, 0, 0, 18, 0, 1673, 9, 218]
y = [17, 6, 0, 0, 1, 2, 0, 0, 8, 0, 984, 9, 30]
scipy.spatial.distance.mahalanobis(x,y,np.linalg.inv(np.cov(x,y)))

但我收到此错误消息:

/usr/lib/python2.7/dist-packages/scipy/spatial/distance.pyc in mahalanobis(u, v, VI)
    498     v = np.asarray(v, order='c')
    499     VI = np.asarray(VI, order='c')
--> 500     return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum())
    501 
    502 def chebyshev(u, v):

ValueError: matrices are not aligned

Scipy Doc 说,VI 是协方差矩阵的逆矩阵,我认为 np.cov 是协方差矩阵,np.linalg.inv 是矩阵的逆矩阵...

但我知道这里有什么问题(矩阵未对齐):矩阵 VI 的尺寸错误(2x2 而不是 13x13)。 所以可能的解决方案是这样做:

VI = np.linalg.inv(np.cov(np.vstack((x,y)).T))

但不幸的是np.cov(np.vstack((x,y)).T)的det为0,这意味着逆矩阵不存在。

那么当我什至无法计算协方差矩阵时,如何使用马氏距离测量?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    您确定 Mahalanobis Distance 适合您的应用吗?根据Wikipedia,您需要一组点来生成协方差矩阵,而不仅仅是两个向量。然后你可以计算向量到集合中心的距离。

    【讨论】:

    • 当我阅读 wp 时,我看到:为了使用马氏距离将测试点分类为属于 N 类之一,首先估计每个类的协方差矩阵,通常基于样本已知属于每个类。然后,给定一个测试样本,计算到每个类别的马氏距离,并将测试点归类为马氏距离最小的那个类别。所以问题是我需要更多的向量来比较?所以可以说我有他们喜欢 x = [a,b, ..., n]; a = [0, ..., z];那么它会工作吗?
    【解决方案2】:

    您没有用于计算协方差的样本集。您可能只想要这里的欧几里得距离 (np.linalg.norm(x-y))。您要实现的目标是什么?

    【讨论】:

    • 我目前使用欧几里得距离,也就是平方差之和。但我想将结果与其他距离测量值进行比较,看看什么最适合我的程序。
    • 当然,没关系。您可以在两个任意向量上使用一些距离度量(欧几里得(ssd 是欧几里得的平方)、L1 范数等),但 Mahalabonis 距离是统计得出的,需要从一组数据点中学习协方差矩阵。当您没有或不能(即在没有数据的情况下)对分布 x 和 y 可能来自的任何假设时,欧几里得距离可以看作是 Mahalabonis 距离的一个特例。您可以只使用任意 spd 矩阵,但这没有意义。
    • 好的,所以更好的方法:首先用欧几里得距离找到我所有数据点之间的距离,然后通过某种算法进行聚类,例如基于邻接矩阵,现在我有了集群,可以用 mahalanobis 决定新数据点是否属于任何集群?
    • 如果不全面了解您正在做的事情,我无法说出正确的方法是什么。
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2016-04-21
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多