当前位置: 首页 > 知识库问答 >
问题:

Numpy在计算标准化马氏距离时声明该无效值

印成天
2023-03-14

这是我在数据挖掘课上的家庭作业。

我将把相关的代码片段放在这篇文章中,但是你可以在http://pastebin.com/CzNFbLJ2

我用于此程序的数据集可以在以下位置找到:http://archive.ics.uci.edu/ml/datasets/Iris

所以我得到:运行时间警告:在sqrt返回np.sqrt(m)中遇到无效值

我试图找到给定iris数据集的平均马氏距离(对于原始数据集和规范化数据集)。这个错误只发生在数据集的规范化版本上,这让我怀疑我是否错误地理解了规范化的含义(在代码和数学上)。

我认为规范化意味着向量的每个分量都被它的向量长度所除(使向量加起来等于1)。我发现这样一个问题:如何在python中规范化一个不太冗长的二维numpy数组?认为这符合我的正常化理念。但现在,我的代码报告,规范化数据集上的马氏距离为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个答案

应涵容
2023-03-14

在这种情况下,规范化可能意味着减去均值和缩放,因此数据具有单位协方差矩阵。

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

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

丌官寒
2023-03-14

您可以使用pdist()在不使用for循环的情况下进行距离计算:

from sklearn import datasets
iris = datasets.load_iris()
from scipy.spatial.distance import pdist, squareform
print squareform(pdist(iris.data, 'mahalanobis'))
松越
2023-03-14

可能太晚了,但请查看我们的教科书“数据挖掘导论”第64-65页。有一节叫做“规范化或标准化”,它解释了Hearne正在寻找的规范化数据的概念。

基本上,标准化数据集x'=(x-平均值(x))/标准偏差(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

 类似资料:
  • 我正在寻找NumPy方法来计算两个Numpy数组(x和y)之间的Mahalanobis距离。下面的代码可以正确地计算相同的使用cdist函数的西皮。因为这个函数在我的情况下计算不必要的matix,我想要更直接的方法来计算它只使用NumPy。 我的审判: 有人能纠正这个方法吗? 下面是它的公式: http://docs.scipy.org/doc/scipy-0.14.0/reference/gen

  • 问题内容: 继一些在线调查(1,2,numpy的,SciPy的,scikit,数学),我已经找到了计算的几种方法 在Python欧氏距离 : 我想知道是否有人可以就 效率* 和 精度 方面认为上述哪一项( 或我未找到的其他任何 理由)提供最佳见解。如果有人知道任何的 资源(S) ,其中讨论的主题,这也将是巨大的。 *** __ 的 背景下 ,我在有趣的是,在计算对数元组之间的欧氏距离,例如之间的距

  • 问题内容: 我对如何尽可能快地以numpy计算距离有疑问, 结果在以下时间: 虽然最后一个给出的是sqrt((VVm-VVs)^ 2 +(HHm-HHs)^ 2),而其他的给出的是(VVm-VVs)^ 2 +(HHm-HHs)^ 2,但这并不是很重要,因为否则在我的代码中,我将为每个i取R [i ,:]的最小值,而sqrt无论如何都不会影响最小值,(如果我对距离感兴趣,我只需取sqrt(value

  • 我需要计算存储在csr稀疏矩阵和一些点列表中的所有点之间的欧氏距离。对我来说,将csr转换为稠密的csr会更容易,但由于内存不足,我无法将其转换为稠密的csr,因此我需要将其保留为csr。 例如,我有一个数据\u csr稀疏矩阵(csr和稠密视图): 这个中心点列表: 使用包,data_csr和中心之间的欧几里德距离数组将像下面这样。因此,在center的每行中,总共6个点中的每一个点都是根据da

  • 我想写一个函数来计算中的坐标与中的每个坐标之间的欧氏距离,并通过列生成维度行的距离数组(其中是中的坐标数,是中的坐标数)。 NB:为了简单起见,我不想使用任何其他库。 运行该函数将生成: 我一直在试着运行下面的程序 但我得到以下错误: 非常感谢。

  • 问题内容: 我正在尝试使用Haversine公式来计算由纬度和经度标识的一长串位置的距离矩阵,该公式采用两个坐标对的元组来产生距离: 我可以使用嵌套的for循环计算所有点之间的距离,如下所示: 使用一个简单的函数: 但是考虑到时间的复杂性,这需要花费相当长的时间,大约需要20秒才能获得500点,而且我的清单要长得多。这让我着眼于矢量化,并且遇到了((docs)),但无法弄清楚如何在这种情况下应用它