我在 R 中有以下代码,用于计算 Iris 数据集上的 mahalanobis 距离,并返回一个具有 150 个值的数值向量,数据集中的每个观察值一个。
x=read.csv("Iris Data.csv")
mean<-colMeans(x)
Sx<-cov(x)
D2<-mahalanobis(x,mean,Sx)
我尝试使用 'scipy.spatial.distance.mahalanobis(u, v, VI)' 函数在 Python 中实现相同的功能,但该函数似乎仅将一维数组作为参数。
最佳答案
我使用了来自 R 的 Iris 数据集,我想它与您使用的相同。
首先,这些是我的 R 基准,用于比较:
x <- read.csv("IrisData.csv")
x <- x[,c(2,3,4,5)]
mean<-colMeans(x)
Sx<-cov(x)
D2<-mahalanobis(x,mean,Sx)
然后,在python中你可以使用:from scipy.spatial.distance import mahalanobis
import scipy as sp
import pandas as pd
x = pd.read_csv('IrisData.csv')
x = x.ix[:,1:]
Sx = x.cov().values
Sx = sp.linalg.inv(Sx)
mean = x.mean().values
def mahalanobisR(X,meanCol,IC):
m = []
for i in range(X.shape[0]):
m.append(mahalanobis(X.iloc[i,:],meanCol,IC) ** 2)
return(m)
mR = mahalanobisR(x,mean,Sx)
我定义了一个函数,所以你可以在其他集合中使用它,(注意我使用 pandas DataFrames 作为输入)比较结果:
在 R
> D2[c(1,2,3,4,5)]
[1] 2.134468 2.849119 2.081339 2.452382 2.462155
在 Python 中:In [43]: mR[0:5]
Out[45]:
[2.1344679233248431,
2.8491186861585733,
2.0813386639577991,
2.4523816316796712,
2.4621545347140477]
请注意,您在 R 中得到的是平方马哈拉诺比斯距离。
关于python - 是否有与 R 中的 mahalanobis() 函数等效的 Python?如果没有,我该如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29817090/