pca全稱是Principle component analysis,譯為主成分分析,比如描述一個人信息時會用體重、身高、發型、愛好、收入、職業等信息,有時根據一個人的體重、身高、發型基本可以確定其性別,例如說一個女孩子是假小子,可能這個女孩有一個板寸頭、身材很高,從眾多屬性中選取一兩個,而無需其他屬性作為參考就確定了一個分類,pca就是這樣一個處理數據常用手段,即利用較少的屬性對一組數據分類,pca是一個降維的數據處理手段,現實中的數據在計算機中可以用一個m行n列矩陣表示,n列可以是體重、身高、發型、愛好、收入、職業等屬性信息,每一行就代表一個具體人。利用pca降維的過程是利用線性代數處理數據的過程,先介紹與PCA有關的線性代數知識。
一、基變換(坐標變換)
以二維數據為例,平面直角坐標系有一個數據是(2,1),代表x軸坐標是2,y軸坐標是1。在線性代數里,平面直角坐標系描述的是一個二維空間,x軸和y軸代表兩個基。事實上,二維空間里可以有無數個基,常用的兩個基是:x軸(0,1)T ,y軸(1,0)T,看下切換不同基效果圖:
基變換利用線性空間不同基表示同一個向量時,向量本身沒有發生變化,變化的只是向量在不同基下坐標值。基變換實現降維后原坐標向量變為稀疏向量,即大部分坐標值變為0,而坐標向量非零部分所對應的基為數據的主要特征部分,基變換的目的就是要找到滿足以上條件的基,線性空間不同基之間可以相互轉化,接下來介紹過渡矩陣的概念。
二、線性映射與線性變換
將一個Rm向量映射成一個Rn向量則稱為一個線性映射,比如將一個三維向量(2,1,3)映射成二維向量(2,1),也可以維度變大,如映射成(2,1,3,10),如果線性映射后的向量維度和原來一樣即Rm映射成Rm,這種線性映射稱為線性變換。可以將線性映射理解為函數,那么兩者之間很多概念是對應的,比如m維線性空間有m個基,通過線性映射將這m個基映射為一個n維空間,新生成的n維空間相當於函數中值域。
線性變換和基變換都在一個空間里將一個向量映射成另一個向量,所不同的是,基變換映射的向量與原向量是一一映射(單射、滿射),並且是恆等映射,即前后表示的是一個向量;線性變換則不同,例如將一個三維坐標(1,2,3)通過線性變換變成了(1,2,0)即將z軸坐標變為0,這代表將任意三維向量投影到xoy平面,相應的(1,2,3),(1,2,4),(1,2,5)等等都可以變換為(1,2,0),這就導致三維空間產生向量之間多對一映射關系。線性變換的過程也可以用一個矩陣來描述,該矩陣叫做線性變換的矩陣表示。
當矩陣表示是滿秩時,就能產生一一映射的效果;而矩陣表示不是滿秩即為奇異矩陣時,產生的是多對一映射效果。這是因為線性變換后的值域的維度加上零空間的維度等於原來空間的維度,只有矩陣表示滿秩時,線性變換T的零空間的維度是0(A滿秩時,方程Ax=0的解只有全部是0),此時線性變換值域的維度才等於原來的維度。
基變換可以理解為測量一個1cm的物體,用帶有厘米尺子測量時,顯示的刻度是1,而用英寸的尺子測量時刻度是0.39(一厘米=0.39英寸),尺子刻度對應同一個物體在不同坐標系的坐標值,坐標系、基(更換不同單位的尺子)發生變化后,物體本身沒有發生變化。線性變換變換更像一個熟練工人的機床,既有很多不同單位尺子(可以實現基變換的效果),也可以加工零件使零件使之可大可小。
觀察(2.1)式,線性空間基變化時坐標向量也同時變化,基與坐標同時變化就確保了基變換前后表示的是同一個向量,再來看經過線性變換后向量坐標的變化,通過下面敘述,可以認為一次線性變換包含了兩次基切換的過程。
(2.3)中線性變換后基也可以像基變換一樣用(T(α1),T(α2),T(α3),...,T(αn))=(β1,β1,β3,..βn)表示,與公式(2.1)不同的是,線性變換后坐標沒有變化,依然是變換前坐標(x1,x2,x3,..xn)。之前說過,基變換時坐標同時變化,確保了前后都是同一個向量,而線性變換后的向量還是沿用之前坐標,這就導致線性變換實際上產生了一個新的向量;另外一點,當線性變換的矩陣表示A不是滿秩時,T(α1),T(α2),T(α3),...,T(αn)一定有0向量,這就是先前敘述的‘線性變換后的值域的維度加上零空間的維度等於原來空間的維度’,而基變換中所有的基都是線性不相關的非零向量。
(2.3)式新生成的向量可用w來表示,w在線性空間V中,所以w也可以用原來的基α1,α2,α3,...,αn表示。
可以看出,線性變換包含了兩次換基的過程:第一次基變為(T(α1),T(α2),T(α3),...,T(αn)),原向量變為新的向量w;第二次再回到基α1,α2,α3,...,αn下,並把向量w用基α1,α2,α3,...,αn線性表示,第二次是基變換過程。由於線性變換最后一步是回到原來基下,所以線性變換的從結果來看是在原線性空間中,將一個向量變換為另一個向量。基變換、線性變換也可以這樣歸納:基變換是向量不動,坐標系發生變化;而線性變換是坐標系不動(其實是動了2次,結果又回到原來坐標系下),向量發生了變化。
三、pca算法原理
pca算法使用了用基變換,需要補充一點,本例中基變換的過渡矩陣P是酉矩陣,而酉矩陣是一個可逆矩陣、標准正交矩陣,同時有性質PT=P-1,將這個等式兩邊取轉置,還可以得到酉矩陣具有下面性質:
(3)
接下來結合一段python代碼來展示pca的算法過程,選取例子是熟悉的鳶尾花數據。這組鳶尾花數據可以分為三類,分別是山鳶尾 ,北美鳶尾,變色鳶尾,而鳶尾花具有4個屬性,分別是花萼的長度、花萼的寬度、花瓣的長度,花瓣的寬度,算法展示的是利用其中兩個屬性即完成分類的過程,具體代碼如下:
import numpy as np import math from sklearn.datasets import load_iris from sklearn.preprocessing import scale import scipy import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False data=load_iris() specimen=data['data'] target=data['target'] specimen_scale=scale(specimen,with_mean=True,with_std=True,axis=0)#1.1 specimen_corr=np.corrcoef(specimen_scale.T)#1.2 eig_val,eig_vec=scipy.linalg.eig(specimen_corr) #1.3 P=eig_vec#1.4 過渡矩陣 #P是酉矩陣 P的逆等於P的轉置矩陣 #下面代碼可以直接寫成specimen_new_cor=np.dot( specimen_scale, P) specimen_new_cor=np.dot( specimen_scale, np.linalg.inv(P).T )#1.5 plt.figure(1) plt.scatter(specimen_new_cor[...,0],specimen_new_cor[...,1],c=target ) plt.xlabel("主成分一") plt.ylabel("主成分二") plt.show()
三個不同顏色代表不同鳶尾花類別,上圖說明使用兩個成分就可以較為清晰的將數據分成3類,接下來就幾個關鍵點說明一下。
(注釋為1.1):實現量綱統一
specimen_scale=scale(specimen,with_mean=True,with_std=True,axis=0) 這句代碼的意思是將每一列數據,即所有來自同一個屬性的數據做量綱上統一,具體辦法是每個數字減去平均數后除以方差。
(注釋為1.2,1.3):利用特征向量分解找出數據最大變化的方向,即發現四個新的基。
余下文章請轉至鏈接: