注:
これは、データ マイニング クラスの宿題です。
関連するコード スニペットをこの SO 投稿に載せますが、私のプログラム全体はhttp://pastebin.com/CzNFbLJ2にあります。
このプログラムで使用しているデータセットは、http://archive.ics.uci.edu/ml/datasets/Irisにあります。
だから私は得ています: RuntimeWarning: sqrt return np.sqrt(m) で無効な値が見つかりました
指定されたアイリス データセットの平均マハラノビス距離を見つけようとしています (未加工のデータセットと正規化されたデータセットの両方)。エラーはデータセットの正規化されたバージョンでのみ発生しているため、正規化の意味を (コードと数学の両方で) 間違って理解しているのではないかと考えています。
正規化とは、ベクトルの各コンポーネントがそのベクトルの長さで除算されることを意味すると考えました (ベクトルの合計が 1 になります)。私はこのSOの質問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