python - 是否有与 R 中的 mahalanobis() 函数等效的 Python?如果没有,我该如何实现?

标签 python r mahalanobis

我在 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/

相关文章:

r - 优化/并行化 R - 处理在 R 中计算 SPI 的大数据集

python - 具有不确定点的最近邻

python - Flask中的Stripe Checkout流程如何携带userID这样的变量?

python - Python 中的单位转换

python - 基于列表对 Python 3.x 数据框进行子集化

r - 尽管试图保留属性,但仍会丢失属性

python - 'PyDevTerminalInteractiveShell' 对象没有属性 'has_readline'

r - 通过 JDBC 连接到 R 中的 S3 Athena

r - 使用 R 进行多变量异常值概率检测

python - 使用 Mahalanobis 距离进行多元异常值去除