sklearn pca降維


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM