本文主要是介绍Mahalanobis距离的计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
20210306 -
0.引言
通过scipy的距离库[1],可以方便的计算向量空间中两个点的距离,例如欧式距离,cos距离等,使用方法可以见[2]。而这个函数cdist
在计算该距离的时候,通过集中方法,结果上却稍有不同,在这里记录一下,主要研究在数据量比较大的时候如何计算,如果仅仅是两个点的距离,直接使用from scipy.spatial.distance import mahalanobis
即可,这要是为什么要引入cdist
的原因。
1. cdist
如果是使用cdist的话,使用方法跟欧式距离没有什么区别,但是当参数输入不对的时候,例如输入两个1-d数组,而且指定协方差矩阵的逆,依然不能得到结果,会报错说第二个矩阵应该是大矩阵,不然无法求出协方差矩阵;如果是第二个参数指定了具体的原始矩阵,能够得出结果,此时第一个参数是均值,本质上这样计算就是为了计算,这个矩阵和第一个参数的距离结果。但是结果跟其他的几个方法也不太一样。
所以,暂时还是放弃这种方法,官方文档上关于这部分也没有具体距离,暂时就不看了。
2. 第三方的代码方法
这里选取了两种方法,一种是针对数据量比较少的情况下, 直接来进行计算即可;另一种如果是数据量比较大,那么就需要利用一些矩阵计算的方法来计算整个结果,不然就太慢了。
2.1 依赖scipy的距离函数来计算
def mahalanobis_distances(df, axis=0):'''Returns a pandas Series with Mahalanobis distances for each sample on theaxis.Note: does not work well when # of observations < # of dimensionsWill either return NaN in answeror (in the extreme case) fail with a Singular Matrix LinAlgErrorArgs:df: pandas DataFrame with columns to run diagnostics onaxis: 0 to find outlier rows, 1 to find outlier columns'''df = df.transpose() if axis == 1 else dfmeans = df.mean()try:inv_cov = np.linalg.inv(df.cov())except LinAlgError:return pd.Series([np.NAN] * len(df.index), df.index,name='Mahalanobis')dists = []for i, sample in df.iterrows():dists.append(mahalanobis(sample, means, inv_cov))return pd.Series(dists, df.index, name='Mahalanobis')
上述代码来源于[3],整体思路还是比较简单的,利用已有的两个一维向量的计算库;但是如果是比较大的数据量的话,通过这种方式来计算,会非常耗时,之前的时候我测试既往的数据量就发现了。
2.2 矩阵计算方式
目前没有具体去看代码的公式是什么意思,但是通过计算之后,我对比和前面代码的结果,两个是一样的。
#create function to calculate Mahalanobis distance
def mahalanobis(x=None, data=None, cov=None):x_mu = x - np.mean(data)if not cov:cov = np.cov(data.values.T)inv_covmat = np.linalg.inv(cov)left = np.dot(x_mu, inv_covmat)mahal = np.dot(left, x_mu.T)return mahal.diagonal()
代码来源于文章[4],上述代码的具体工作方式是这样的:x
是实际上要计算距离的矩阵,而data
是提供均值和协方差矩阵的来源。所以计算的时候,一定要注意,而且这里这个代码实际上是针对DataFrame来实现的,参数如果是numpy的数组的话要进行一些修改。
参考
[1]scipy.spatial.distance.cdist
[2]numpy的相关使用方法
[3]Python scipy.spatial.distance.mahalanobis() Examples
[4]How to Calculate Mahalanobis Distance in Python
这篇关于Mahalanobis距离的计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!