首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从零开始在python中实现Mahalanobis距离

从零开始在python中实现Mahalanobis距离
EN

Stack Overflow用户
提问于 2019-08-13 09:50:58
回答 2查看 2.3K关注 0票数 1

我正在从零开始实现Mahalanobis,但是出现了一个错误。Mahalanobis距离公式是

我向下面的代码提供了错误-

代码语言:javascript
复制
from math import*
from decimal import Decimal
import numpy as np

def mahalanobis(x, y, cov=None):
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    y_minus_mn = y - y_mean
    x_minus_mn_with_transpose =np.transpose(x- x_mean)
    Covariance = covar(x, y)
    inv_covmat = np.linalg.inv(Covariance)
    x_minus_mn = x - x_mean
    D_square = np.dot( x_minus_mn_with_transpose, inv_covmat, x_minus_mn)
    return D_square

def covar(x, y):
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    Cov_numerator = sum(((a - x_mean)*(b - y_mean)) for a, b in zip(x, y))
    Cov_denomerator = len(x) - 1
    Covariance = (Cov_numerator / Cov_denomerator)
    return  Covariance

import pandas as pd

filepath = 'https://raw.githubusercontent.com/selva86/datasets/master/diamonds.csv'
df = pd.read_csv(filepath).iloc[:, [0,4,6]]
df.head()

X = df[['carat', 'depth', 'price']].head(500).values.tolist
Y =df[['carat', 'depth', 'price']].values.tolist

mahalanobis(X, Y)

错误-下图

请帮帮忙。有没有人能检查和纠正我的代码?

EN

回答 2

Stack Overflow用户

发布于 2019-08-13 10:32:16

代码语言:javascript
复制
X = df[['carat', 'depth', 'price']].head(500).values.tolist
Y =df[['carat', 'depth', 'price']].values.tolist

.tolist

这是功能。我觉得你需要:

.tolist()

票数 2
EN

Stack Overflow用户

发布于 2019-08-13 10:51:00

您的代码中有一些错误,我将指出。

  1. 使用np.cov计算协方差当您使用numpy数组时,不要重新实现所有
  2. np.dot的第三个参数是输出,所以您应该编写D_square = np.dot(np.dot(x_minus_mn, inv_covmat), np.transpose(x_minus_mn))而不是D_square = np.dot( x_minus_mn_with_transpose, inv_covmat, x_minus_mn)
  3. 使用X = df[['carat', 'depth', 'price']].head(500).values.tolist代替X = np.asarray(df[['carat', 'depth', 'price']].head(500).values)。如果您使用的是numpy,那么只使用numpy数组,而不是列表。

下面是您提供的代码的修改版本

代码语言:javascript
复制
import numpy as np

def mahalanobis(x, y, cov=None):
    x_mean = np.mean(x)
    Covariance = np.cov(np.transpose(y))
    inv_covmat = np.linalg.inv(Covariance)
    x_minus_mn = x - x_mean
    D_square = np.dot(np.dot(x_minus_mn, inv_covmat), np.transpose(x_minus_mn))
    return D_square

import pandas as pd

filepath = 'https://raw.githubusercontent.com/selva86/datasets/master/diamonds.csv'
df = pd.read_csv(filepath).iloc[:, [0,4,6]]
df.head()

X = np.asarray(df[['carat', 'depth', 'price']].head(500).values)
Y =np.asarray(df[['carat', 'depth', 'price']].values)

mahalanobis(X, Y)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57475242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档