Мой код:
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)
Набор данных iris: http: // archive. ics.uci.edu/ml/machine-learning-databases/iris/iris.data[123 sizesOutput :
[ 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]
Основные компоненты - То же, что и я, но транспонировано
, так что хорошо, я думаю
Кроме того, что с выводом функции linalg.eig? Согласно описанию PCA в википедии, я должен сделать следующее:
cov_mat = cov(orig_data)
val, vec = linalg.eig(cov_mat)
print val
Но на самом деле это не соответствует выводам в учебных пособиях, которые я нашел в Интернете. Кроме того, если у меня 4 измерения, я думал, что у меня должно быть 4 собственных значения, а не 150, как дает мне eig. Я что-то делаю не так?
edit : Я заметил, что значения отличаются на 150, то есть на количество элементов в наборе данных. Кроме того, собственные значения должны складываться так, чтобы они были равны количеству измерений, в данном случае 4. Я не понимаю, почему возникает такая разница. Если бы я просто разделил собственные значения на len (data)
, я мог бы получить желаемый результат, но не понимаю почему. В любом случае пропорция собственных значений не меняется, но они важны для меня, поэтому я хотел бы понять, что происходит.