私のコード:
from numpy import *
def pca(orig_data):
data = array(orig_data)
data = (data - data.mean(axis=0)) / data.std(axis=0)
u, s, v = linalg.svd(data)
print s #should be s**2 instead!
print v
def load_iris(path):
lines = []
with open(path) as input_file:
lines = input_file.readlines()
data = []
for line in lines:
cur_line = line.rstrip().split(',')
cur_line = cur_line[:-1]
cur_line = [float(elem) for elem in cur_line]
data.append(array(cur_line))
return array(data)
if __name__ == '__main__':
data = load_iris('iris.data')
pca(data)
アイリス データセット: http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
出力:
[ 20.89551896 11.75513248 4.7013819 1.75816839]
[[ 0.52237162 -0.26335492 0.58125401 0.56561105]
[-0.37231836 -0.92555649 -0.02109478 -0.06541577]
[ 0.72101681 -0.24203288 -0.14089226 -0.6338014 ]
[ 0.26199559 -0.12413481 -0.80115427 0.52354627]]
望ましい出力:
固有値 -[2.9108 0.9212 0.1474 0.0206]
主成分 -Same as I got but transposed
大丈夫だと思い ます
また、linalg.eig 関数の出力はどうなっていますか? ウィキペディアの PCA の説明によると、次のようになっています。
cov_mat = cov(orig_data)
val, vec = linalg.eig(cov_mat)
print val
しかし、オンラインで見つけたチュートリアルの出力とは実際には一致しません。さらに、4 つの次元がある場合、eig のように 150 ではなく、4 つの固有値を持つべきだと考えました。私は何か間違ったことをしていますか?
編集: データセット内の要素の数である 150 だけ値が異なることに気付きました。また、固有値は、次元数 (この場合は 4) に等しくなるように追加する必要があります。私が理解できないのは、この違いがなぜ起こっているのかということです。単純に固有値を で割ると、len(data)
必要な結果が得られますが、その理由がわかりません。いずれにせよ、固有値の比率は変更されませんが、私にとっては重要なので、何が起こっているのかを理解したいと思います.