注意:
这是我的数据挖掘课上的家庭作业。
我将在此 SO 帖子中放置相关代码片段,但您可以在http://pastebin.com/CzNFbLJ2找到我的整个程序
我用于这个程序的数据集可以在http://archive.ics.uci.edu/ml/datasets/Iris找到
所以我得到:RuntimeWarning:sqrt return np.sqrt(m) 中遇到的无效值
我试图找到给定虹膜数据集的平均马氏距离(对于原始数据集和标准化数据集)。该错误仅发生在数据集的规范化版本上,这让我想知道我是否错误地理解了规范化的含义(无论是在代码中还是在数学上)。
我认为归一化意味着向量的每个分量都除以它的向量长度(导致向量加起来为 1)。我发现了这个 SO question How to normalize a 2-dimensional numpy array in python less verbose?并认为它符合我的规范化概念。但是现在我的代码报告说标准化数据集上的马氏距离是 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