sklearn pca降維
阿新 • • 發佈:2017-08-17
noise .text learn mac crc sigma 參考 clas nts
PCA降維
一.原理
這篇文章總結的不錯PCA的數學原理。
PCA主成分分析是將原始數據以線性形式映射到維度互不相關的子空間。主要就是尋找方差最大的不相關維度。數據的最大方差給出了數據的最重要信息。
二.優缺點
優:將高維數據映射到低維,降低數據的復雜性,識別最重要的多個特征
不足:不一定需要,且可能損失有用信息
適用數值型數據
三.步驟
1.原始數據X,對於每列屬性,去平均值(也可以對數值進行標準分化)
2.計算樣本點的協方差矩陣(列間兩兩計算相關性)
3.求出協方差矩陣的特征值和對應的特征向量
4.從大到小排序特征值,取得最前的k個特征向量P
5.將數據轉換到k個特征向量構建的新空間中,Y=P^tX
四.python代碼
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import numpy as np 5 from sklearn.decomposition import PCA 6 from matplotlib import pyplot as plt 7 8 class PCA_DimensionalityReduction: 9 10 def __init__(self): 11 # 隨機產生數據沿y=2x分布, 12 self.x = np.arange(1, 101, 1).astype(float)13 self.y = 2 * np.arange(1, 101, 1).astype(float) 14 15 def dataProduction(self): 16 #添加服從正太分布的噪音數據normal(均值,標準差,個數) 17 noise=np.random.normal(0,10,100) 18 self.y+=noise 19 #定義繪圖 20 self.fig=plt.figure(figsize=(10,10)) 21 #紅色的小圓點在坐標平面上畫一個點 22 plt.plot(self.x,self.y,‘ro‘) 23 #坐標範圍axis[xmin,xmax,ymin,ymax] 24 plt.axis([0,102,-20,220]) 25 #箭頭 26 plt.quiver(60, 100, 10 - 0, 20 - 0, scale_units=‘xy‘, scale=1) 27 plt.arrow(60, 100, 10 - 0, 20 - 0, head_width=2.5, head_length=2.5, fc=‘k‘, ec=‘k‘) 28 #圖中的任意位置添加文字 29 plt.text(70,110,r‘$v^1$‘,fontsize=20) 30 31 #保存 32 # 添加子圖,返回Axes實例,參數:子圖總行數,子圖總列數,子圖位置 33 ax=self.fig.add_subplot(111) 34 ax.axis([0,102,-20,220]) 35 ax.set_xlabel(‘x‘,fontsize=40) 36 ax.set_ylabel(‘y‘,fontsize=40) 37 self.fig.suptitle(‘2 dimensional‘,fontsize=40) 38 self.fig.savefig(‘pca_data.png‘) 39 40 ‘‘‘ 41 PCA算法 42 總結一下PCA的算法步驟: 43 設有m條n維數據。 44 1)將原始數據按列組成n行m列矩陣X 45 2)將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值 46 3)求出協方差矩陣C=(1/m)X(X)^T 47 4)求出協方差矩陣的特征值及對應的特征向量 48 5)將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k行組成矩陣P 49 6)Y=PX 50 即為降維到k維後的數據 51 ‘‘‘ 52 #使用np.linalg.eig計算特征值和特征向量 53 def dr_pca(self): 54 #每列屬性的均值 55 mean_x=np.mean(self.x) 56 mean_y=np.mean(self.y) 57 #這裏對數據標準分化 58 mean_vector=np.array([[mean_x],[mean_y]]) 59 self.u_x=(self.x-mean_x)/np.std(self.x)#除標準差 60 self.u_y=(self.y-mean_y)/np.std(self.y) 61 #協方差矩陣 62 sigma=np.cov([self.u_x,self.u_y]) 63 #從協方差矩陣中求出特征值和特征向量,選擇特征值最大的對應的特征向量 64 eig_vals,eig_vecs=np.linalg.eig(sigma) 65 eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))] 66 eig_pairs.sort() 67 eig_pairs.reverse() 68 v1=eig_pairs[0][1]#取出一個最大特征值對應的特征向量 69 print(‘v1,shape:‘,(v1,v1.shape)) 70 #映射到由k個特征向量組成的子空間特征向量(主成分) 71 X=np.array([self.u_x,self.u_y]) 72 #X=X.T 73 print(‘X shape:‘,X.shape) 74 main_vector=v1.T.dot(X) 75 print(‘main_vector:‘,main_vector.T) 76 77 #w=np.array(v1.reshape(2,1)) 78 #main_vector=w.T.dot(X) 79 #print(‘w:‘,w.shape) 80 #print("main_vector2:",main_vector) 81 82 #使用sklearn中的pca 83 def sklearn_pca(self): 84 X=np.array([self.u_x,self.u_y]) 85 X=X.T 86 pca=PCA(n_components=1) #指定主成分數量 87 88 #pca.fig(X)#訓練pca模型 89 #v1 = pca.components_[0] # 得到特征向量 90 #print(‘v1:‘, v1) 91 92 main_vector=pca.fit_transform(X)#用X來訓練PCA模型,同時返回降維後的結果數據。 93 print(‘sklearn:‘,main_vector) 94 95 if __name__==‘__main__‘: 96 pca=PCA_DimensionalityReduction() 97 pca.dataProduction() 98 pca.dr_pca() 99 pca.sklearn_pca()
參考:1.CRC.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.
2.machine learning for the web
3.machine learning in action
sklearn pca降維