Numpy在计算标准化马哈拉诺比斯距离时声明无效值

时间:2013-04-19 04:38:19

标签: python numpy scipy

注意

这是我的数据挖掘课程中的家庭作业。

我将把相关的代码片段放在这篇SO帖子上,但你可以在http://pastebin.com/CzNFbLJ2找到我的整个程序

我可以在http://archive.ics.uci.edu/ml/datasets/Iris

找到我用于此程序的数据集

所以我得到:RuntimeWarning:在sqrt中遇到无效值   return np.sqrt(m)

我试图找到给定虹膜数据集的平均Mahalanobis距离(对于原始数据集和标准化数据集)。错误只发生在数据集的规范化版本上,这让我想知道我是否错误地理解了规范化意味着什么(在代码和数学上)。

我认为归一化意味着向量的每个分量除以它的向量长度(导致向量加起来为1)。我发现了这个问题How to normalize a 2-dimensional numpy array in python less verbose?并认为它符合我的规范化概念。但是现在我的代码报告了规范化数据集上的Mahalanobis距离是NAN

def mahalanobis(data):
   import numpy as np;
   import scipy.spatial.distance;
   avg   = 0
   count = 0

   covar = np.cov(data, rowvar=0);
   invcovar = np.linalg.inv(covar)

   for i in range(len(data)):
      for j in range(i + 1, len(data)):
         if(j == len(data)):
            break
         avg += scipy.spatial.distance.mahalanobis(data[i], data[j], invcovar)
         count += 1
   return avg / count


def normalize(data):
   import numpy as np
   row_sums = data.sum(axis=1)
   norm_data = np.zeros((50, 4))
   for i, (row, row_sum) in enumerate(zip(data, row_sums)):
      norm_data[i,:] = row / row_sum
   return norm_data

3 个答案:

答案 0 :(得分:4)

可能为时已晚,但请查看我们的教科书“数据挖掘简介”中的第64-65页。有一个名为“规范化或标准化”的部分,它解释了Hearne正在寻找的规范化数据的概念。

基本上,标准化数据集x'=(x - mean(x))/ standardDeviation(x)

因为我看到你正在使用python,所以这是使用SciPy的方法:

normalizedData = (data - data.mean(axis=0)) / data.std(axis=0, ddof=1)

来源:http://mail.scipy.org/pipermail/numpy-discussion/2011-April/056023.html

答案 1 :(得分:3)

您可以使用pdist()进行距离计算而不使用for循环:

from sklearn import datasets
iris = datasets.load_iris()
from scipy.spatial.distance import pdist, squareform
print squareform(pdist(iris.data, 'mahalanobis'))

答案 2 :(得分:2)

在此上下文中的归一化可能意味着减去均值和缩放,因此数据具有单位协方差矩阵。

但是,要将数据集中的每个向量缩放到单位范数,请使用:norm_data=data/np.sqrt(np.sum(data*data,1))[:,None]

你需要除以每个向量的L2范数,这意味着平方每个元素的值,然后取总和的平方根。广播允许您避免显式编码循环(请参阅您引用的问题的答案:https://stackoverflow.com/a/8904762/1149913)。