2015-04-23 8 views
2

У меня есть следующий код в R, который вычисляет расстояние mahalanobis в наборе данных Iris и возвращает числовой вектор с 150 значениями, один для каждого наблюдения в наборе данных.Есть ли эквивалент Python функции mahalanobis() в R? Если нет, как я могу его реализовать?

x=read.csv("Iris Data.csv") 
mean<-colMeans(x) 
Sx<-cov(x) 
D2<-mahalanobis(x,mean,Sx) 

Я пытался реализовать то же самое в Python, используя «scipy.spatial.distance.mahalanobis (U, V, VI)» функцию, но, кажется, эта функция принимает только одномерные массивы в качестве параметров.

ответ

1

Я использовал набор данных Iris от R, я полагаю, это то же самое, что вы используете.

Во-первых, это мой R эталоном для сравнения:

x <- read.csv("IrisData.csv") 
x <- x[,c(2,3,4,5)] 
mean<-colMeans(x) 
Sx<-cov(x) 
D2<-mahalanobis(x,mean,Sx) 

Затем в питона вы можете использовать:

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.ix[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 является квадрат Махаланобиса расстояние.

+0

Это именно то, что я искал. Я не очень хорошо разбираюсь в Python, но я боролся с этим. Благодаря тонну! – jose14

+0

Не могли бы вы также предложить, как использовать расстояния Махаланобис, чтобы выполнить обнаружение извне? Как мы можем определить пороговое значение расстояний, чтобы обнаружить выбросы? – jose14

+0

Вы можете использовать $ (1- \ alpha) $ процентиль $ \ chi^2 $ распределения в качестве порога. См. Здесь (очень много!) Описательный ответ о статистических аспектах расстояния Махаланобис: http://stats.stackexchange.com/questions/62092/bottom-to-top-explanation-of-the-mahalanobis-distance –