核化這個概念在很多機器學習方法中都有應用,如svm,pca等。在此結合sklearn中的kpca說說核函式具體怎麼來用。
kpca和pca都是用來做無監督資料處理的,但是有一點不一樣。pca是降維,把m維的資料降至k維。kpca恰恰相反,它是把m維的資料公升至k維。但是他們共同的目標都是讓資料在目標維度中(線性)可分,即pca的最大可分性。
在sklearn中,kpca和pca的使用基本一致,介面都是一樣的。kpca需要指定核函式,不然預設線性核。
首先我們用下面的**生成一組資料。
import這些資料可以用下圖來表示numpy as np
from sklearn.decomposition import
pca, kernelpca
import
matplotlib.pyplot as plt
import
math
x=y=
n = 500
for i in
range(n):
deg = np.random.randint(0,360)
if np.random.randint(0,2)%2==0:
else
:y =np.array(y)
x =np.array(x)
print('
ok')
顯然,我們選的正樣本(藍)都落在乙個半徑為6的圓上,負樣本(紅)全選在乙個半徑為15的圓上。
這樣的資料顯然是線性不可分的。如果我們強行要用線性分類器來做,可以對原始資料做乙個kpca處理。
如下**:
kpca = kernelpca(kernel="我們用rbf核,指定維度為14(為啥是14,後面說),也就是說吧x(2維)中的資料對映到14維的空間中去。rbf", n_components=14)
x_kpca =kpca.fit_transform(x)
然後我們用乙個線性的svm分類器來對對映後的資料做乙個分類,隨機取80%做訓練集,20%做測試集。
from sklearn import此時,輸出的是0,也就是說我們**出的分類與正確的分類完全吻合,沒有乙個錯誤。此時分類器在這個資料集上是完全有效的。svmclf = svm.svc(kernel='
linear')
clf.fit(x_kpca[:0.8*n],y[:0.8*n])
y0 = y[0.8*n:]
y1 = clf.predict(x_kpca[0.8*n:])
print(np.linalg.norm(y0-y1, 1))
綜上所述,通過核化,可以把原本線性不可分的資料對映到高維空間後實現線性可分。
不過這個過程也不完全是那麼簡單,我們取不同的維度得到的結果可能相差甚遠,也就是經典的調參問題。
在此,我測試了幾組不同的k取值,得到不同k值條件下分類準確率值。如下圖。
可以看出,不同的k值對結果是有影響的。但不同的資料集可能不一樣,所以需要進行調參。我這個取14就全ok了。
主成分分析和核函式
主成分分析 pca 的主要作用是降低資料的維度,提取其主要特徵,因為現實中很多資料都是很稀疏的,通過提取主要特徵過濾噪音發現其潛在的規律 核函式表示了兩個資料之間的相似性。那麼這兩者之間存在什麼樣的關係?直觀上理解,pca和核側重的是兩個相反的方向,下面給出解釋。考慮下面的高斯核,此時協方差矩陣 由...
主成分分析
主成分分析 pca 分析乙個隨機向量的中的主成分 主成分一般不是隨機向量中的某乙個分量,而是不同分量的線性組合,根據資訊理論的觀點,資訊的多少與方差有關,所以 主成分是方差最大的幾個成分 主成分分析的方法是求隨機向量的協方差矩陣 用樣本協方差矩陣代替 對於差異較大的資料,可採用相關矩陣代替協方差矩陣...
主成分分析
理論要點 1 主成分分析是一種無監督學習,因此不能用交叉驗證來檢驗誤差 2 在處理資料之前,要對資料做中心化處理 3 p太大的話,做特徵分解用svd 4 一共有min n 1,p 個主成分,因為中心化以後,rank要降一維 5 主成分的載荷向量就是協方差矩陣的特徵向量,對應特徵值最大的是第一主成分,...