Kernel_PCA算法
1.KPCA原理:
主成分分析(PCA)是使用線性映射將數據進行降維,但是通常情況下高維到低維是非線性的,往往達不到我們預期的結果。核主成分分析(KPCA)將原始數據通過選擇適當的核函數(Kernel)映射到高維空間,再利用高維度空間進行線性降維,是一種用于非線性分類的降維工具。因此 KPCA的核心就是核函數。同時,KPCA采用了比較復雜的非線性映射,提高了非線性數據的處理效率。
原理圖解析:KPCA空間中的數據是通過將輸入空間的非線性數據選擇合適的核函數映射到高維特征空間,然后對其進行PCA線性降維處理。
Pre-image注解:將得到的KPCA空間中的預測數據與原始數據進行比較,看其特征信息的損失大小(越小越好);
Reconstruction注解:與Pre-image作用類似。
2、算法流程
第一步:利用核函數把原始數據集映射到高維空間,得到高維空間的數據矩陣。
第二步:由于協方差矩陣表征了變量之間的相關程度(即維度之間的關系),所以我們通過計算高維空間中數據的協方差矩陣來進一步計算特征值與特征向量(參考PCA)。
第三步:將高維特征空間的投影向量使用高維樣本點線性表示。
?? ? ? ? ? ? ?根據定理:空間中的任一向量,都可以由該空間中的所有樣本線性表示:
? ? ? ? ? ?因此可用所有樣本表示特征向量,即:?
? ? ? ? ? ?將這個線性組合代回到特征向量公式,替換特征向量,得到:
? ? ? ? ? ?等式兩邊同時左乘?φ(X)的轉置,得到:
第四步:計算核矩陣K
? ? ? ? ? 上式中表示核函數,即空間中任意一點到某一中心點的歐氏距離
第五步:求解矩陣K的特征值和特征向量,取前d個特征值對應的特征向量,以列向量組成向量矩陣,即為降維后數據集。
3、算法實例
?以非線性可分數據集為例:
(1)采用PCA處理,代碼如下:
# -*- coding:utf-8 -*- from sklearn.decomposition import PCA import matplotlib.pyplot as plt from sklearn.datasets import make_moons import numpy as npx2, y2 = make_moons(n_samples=100, random_state=123)if __name__ == '__main__':pca = PCA(n_components=2)x2_std = pca.fit_transform(x2)fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14, 6))ax[0].scatter(x2_std[y2==0, 0], x2_std[y2==0, 1], color='red', marker='^', alpha=0.5)ax[0].scatter(x2_std[y2==1, 0], x2_std[y2==1, 1], color='blue', marker='o', alpha=0.5)plt.scatter(x2_std[y2 == 0, 0], np.zeros((50, 1)) + 0.02, color='red', marker='^', alpha=0.5)plt.scatter(x2_std[y2 == 1, 0], np.zeros((50, 1)) + 0.02, color='blue', marker='o', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()效果圖如下:
(2)采用KPCA處理,代碼如下:?
# -*- coding:utf-8 -*- from sklearn.decomposition import PCA from sklearn.decomposition import KernelPCA import matplotlib.pyplot as plt from sklearn.datasets import make_moons import numpy as npx2, y2 = make_moons(n_samples=100, random_state=123)if __name__ == '__main__':kpca = KernelPCA(n_components=2, kernel='rbf', gamma=15)x_kpca = kpca.fit_transform(x2)fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(14, 6))ax[0].scatter(x_kpca[y2 == 0, 0], x_kpca[y2 == 0, 1], color='red', marker='^', alpha=0.5)ax[0].scatter(x_kpca[y2 == 1, 0], x_kpca[y2 == 1, 1], color='blue', marker='o', alpha=0.5)ax[1].scatter(x_kpca[y2 == 0, 0], np.zeros((50, 1)) + 0.02, color='red', marker='^', alpha=0.5)ax[1].scatter(x_kpca[y2 == 1, 0], np.zeros((50, 1)) + 0.02, color='blue', marker='o', alpha=0.5)ax[0].set_xlabel('PC1')ax[0].set_ylabel('PC2')ax[1].set_ylim([-1, 1])ax[1].set_yticks([])ax[1].set_xlabel('PC1')plt.show()效果圖如下:
結論:將非線性可分數據集分別采用PCA和KPCA進行降維分解,得到不同的效果。PCA分解不能夠完全將數據集進行分類,分解效果并沒有達到預期;而KPCA則實現的我們預想的效果,將數據集很好地分開來。
4、總結:
? ? ?基于核的非線性降維方法——KPCA具有核方法的優點,但是核函數的選擇則是尤為關鍵的,核選擇的好壞決定了數據在高維空間計算的復雜與否。
?
總結
以上是生活随笔為你收集整理的Kernel_PCA算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WEB端Monkey测试gremlins
- 下一篇: ncnn环境搭建一 - windows下