代碼實現分紅好多種層級,有的代碼只使用標準庫實現,有的代碼基於其它庫實現,有的代碼直接調用庫中現有的實現。 在本文中,按照不一樣的層級分別實現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))