1. 程式人生 > >PCA+核函式(高斯)提取特徵程式碼+圖視

PCA+核函式(高斯)提取特徵程式碼+圖視

大資料時代,什麼維度災難問題的出現,所以需要提出 降維處理保留資料結構,減少演算法執行時間,pca,kpca,svm等是一種

有效的特徵提取方法,這裡就不balabala說為什麼要有這些技術以及他們的使用方法,下面直接程式碼展示。

自己程式碼生成一組資料,對其用pca和kpac進行特徵提取並比較效果,由下圖可以得知kpac效果更明顯

本文用的是高斯核函式:

高斯核定義輸入空間的兩個點


更多關於上面的資訊:http://en.wikipedia.org/wiki/Radial_basis_function_kernel

scikit-learn裡的核pca物件也可以使用其他類別的核:

線性

多項式

Sigmoid

from sklearn.datasets import make_circles

import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
#生成一個變化非線性的資料集
np.random.seed(0)
x,y=make_circles(n_samples=400,factor=.2,noise=0.02)
#為生成的資料集繪製圖形 
plt.close('all')
plt.figure(1)
plt.title("Original Space")
plt.scatter(x[:,0],x[:,1],c=y)
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")
#試試用普通的PCA處理這個資料集 
pca=PCA(n_components=2)
pca.fit(x)
x_pca=pca.transform(x)
plt.figure(2)
plt.title("PCA")
plt.scatter(x_pca[:,0],x_pca[:,1],c=y)
plt.xlabel("$Component_1$")
plt.ylabel("$Component_2$")
#應用普通的PCA,繪出第一個主成分
class_1_indx=np.where(y==0)[0]
class_2_indx=np.where(y==1)[0]
plt.figure(3)
plt.title("PCA_One component")
plt.scatter(x_pca[class_1_indx,0],np.zeros(len(class_1_indx)),color='red')
plt.scatter(x_pca[class_2_indx,0],np.zeros(len(class_2_indx)),color='blue')
#rbf(radial basis function)徑向基函式
kpca=KernelPCA(kernel="rbf",gamma=10)
#執行核pca
kpca.fit(x)
x_kpca=kpca.transform(x)
#繪製前兩個主成分
plt.figure(4)
plt.title("Kernel PCA")
plt.scatter(x_kpca[:,0],x_kpca[:,1],c=y)
plt.xlabel("$Component_1$")
plt.ylabel("$Component_2$")

plt.show()

v