PCA實現

代碼實現分紅好多種層級,有的代碼只使用標準庫實現,有的代碼基於其它庫實現,有的代碼直接調用庫中現有的實現。 在本文中,按照不一樣的層級分別實現PCApython

對於分類問題基本任務能夠描述以下 x11 x12 x13 x14 y1 x21 x22 x23 x24 y2 x31 x32 x33 x34 y3 ......dom

PCA用於提取樣本的主要特徵,它只跟屬性有關,而跟類別數據無關。也就是說,PCA只跟X有關而跟Y無關。code

import numpy as np
from sklearn.decomposition import PCA

# 10個樣本,每一個樣本7個屬性,如今要取其中的3個屬性
train_x = np.random.rand(10, 7)
train_y = np.random.randint(0, 3, (100, 1))

#使用sklearn
p = PCA(n_components=3)
p.fit(train_x, train_y)
train_data = p.transform(train_x)

# 使用numpy中的協方差計算、特徵值求解來實現
mu = np.mean(train_x, axis=0)  # 均值向量
# 協方差矩陣,cov默認是列向量,這裏須要T表示將行向量轉置稱列向量
# 使用參數rowvar=False至關於矩陣轉置
A = np.cov(np.asmatrix(train_x - mu).T)
root, vec = np.linalg.eig(A)
ind = np.argsort(root)
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data2 = np.asmatrix(train_x - mu) * transform_matrix

# 本身實現協方差計算,只使用numpy中的特徵值求解來實現
mu = np.mean(train_x, axis=0)
A = np.dot((train_x - mu).T, (train_x - mu)) / (len(train_x) - 1)
root, vec = np.linalg.eig(A)
# 返回的特徵根是無序的,須要進行排序
ind = np.argsort(root)
# vec[:ind[-3:]]或者vec[:ind[-1:-4:-1]]都是能夠的
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data3 = np.asmatrix(train_x - mu) * transform_matrix
print(np.sum(train_data - train_data2), np.sum(train_data - train_data3))
相關文章
相關標籤/搜索