Python機器學習:5.6 使用核PCA進行非線性映射
許多機器學習算法都有一個假設:輸入數據要是線性可分的。感知機算法必須針對完全線性可分數據才能收斂。考慮到噪音,Adalien、邏輯斯蒂回歸和SVM並不會要求數據完全線性可分。
但是現實生活中有大量的非線性數據,此時用於降維的線性轉換手段比如PCA和LDA效果就不會太好。這一節我們學習PCA的核化版本,核PCA。這裏的"核"與核SVM相近。 運用核PCA,我們能將非線性可分的數據轉換到新的、低維度的特征子空間,然後運用線性分類器解決。
核函數和核技巧
還記得在核SVM那裏,我們講過解決非線性問題的手段是將他們映射到新的高維特征空間,此時數據在高維空間線性可分。為了將數據映射到高維k空間,我們定義了非線性映射
我們可以把核函數的功能理解為:通過創造出原始特征的一些非線性組合,然後將原來的d維度數據集映射到k維度特征空間,d<k。舉個例子,特征向量,x是列向量包含d個特征,d=2,可以按照如下的規則將其映射到3維度特征空間:
同理核PCA的工作機制:通過核PCA的非線性映射,將數據轉換到一個高維度空間,然後在這個高維度空間運用標準PCA重新將數據映射到一個比原來還低的空間,最後就可以用線性分類器解決問題了。不過,這種方法涉及到兩次映射轉換,計算成本非常高,由此引出了核技巧(kernel trick)。
使用核技巧,我們能在原始特征空間直接計算兩個高維特征向量的相似性(不需要先特征映射,再計算相似性)。
在介紹核技巧前,我們先回顧標準PCA的做法。我們按照如下公式計算兩個特征k和j的協方差:
由於我們對數據已做過標準化處理,特征平均值為0,上式等價於:
同樣,我們能夠得到協方差矩陣:
Bernhard Scholkopf(B. Scholkopf, A.Smola, and K.R. Muller. Kernel Principal Component Analysis. pages 583-588, 1997)得到了上式的泛化形式,用非線性特征組合替換原始數據集兩個樣本之間的點乘:
為了從協方差矩陣中得到特征向量(主成分),我們必須求解下面的等式:
其中,是協方差矩陣的特征值和特征向量,
我們求解核矩陣:
首先,我們寫出協方差矩陣的矩陣形式,是一個n*k的矩陣:
我們將特征向量寫作:
由於,得:
等式兩邊左乘:
這裏的就是相似性(核)矩陣:
回憶核SVM我們使用核技巧避免了直接計算:
核PCA同樣不需要像標準PCA那樣構建轉換矩陣,我們使用核函數代替計算。所以,你可以把核函數(簡稱,核)理解為計算兩個向量點乘的函數,結果可看做兩個向量的相似度。
常用的核函數有:
- 多項式核:
,是閾值,是由用戶設定的指數。
- 雙曲正切(sigmoid)核:
- 徑向基函數核(高斯核):
現在總結一下核PCA的步驟,以RBF核為例:
1 計算核(相似)矩陣k,也就是計算任意兩個訓練樣本:
得到K:
舉個例子,如訓練集有100個樣本,則對稱核矩陣K的維度是100*100。
2 對核矩陣K進行中心化處理:
其中,是n*n的矩陣,n=訓練集樣本數,中每個元素都等於.
3 計算的特征值,取最大的k個特征值對應的特征向量。不同於標準PCA,這裏的特征向量並不是主成分軸。
第2步為什麽要計算? 因為在PCA我們總是處理標準化的數據,也就是特征的平均值為0。當我們用非線性特征組合替代點乘時,我們並沒有顯示計算新的特征空間也就沒有在新特征空間做標準化處理,我們不能保證新特征空間下的特征平均值為0,所以要對K做中心化。
Python機器學習中文版目錄(http://www.aibbt.com/a/20787.html)
轉載請註明出處,Python機器學習(http://www.aibbt.com/a/pythonmachinelearning/)
Python機器學習:5.6 使用核PCA進行非線性映射