1. 程式人生 > >sklearn pca降維

sklearn pca降維

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降維