04-0003 KPCA算法

1.KPCA簡述

當數據在低維空間不是線性可分的時候,轉化到高維的空間可能就變成了線性可分的,這個過程用到了KPCA算法,也就是將數據才能從低維非線性,轉化爲高維線性可分數據的一種算法。
[注:這裏的高維空間下的線性可分,此時的線性說的是一個超平面。我的理解。 ]

如下圖,在二維空間中星星與紅點是線性不可分的,如果將其分開,需要一個非線性的曲線[橢圓],但是非線性的曲線在構建的時候是不容易構建的。
所以這個時候就有了升維的 操作,能夠將一個非線性的區域,轉化爲高維空間下的一個超平面。高維空間下的一個平面壓扁之後,被曲化。
[注:這種感覺好像是《三體》裏面的降維打擊一般,三維立體的生物被降維打擊之後,就會平面化,本來可分的內臟器官之類的東西,就會亂成一團。 ]

在這裏插入圖片描述
低維線性不可分,到高維線性可分

2.核函數

什麼是核函數呢?

支持向量機通過某非線性變換 φ( x) ,將輸入空間映射到高維特徵空間。特徵空間的維數可能非常高。如果支持向量機的求解只用到內積運算,而在低維輸入空間又存在某個函數 K(x, x′) ,它恰好等於在高維空間中這個內積,即K( x, x′) =<φ( x) ⋅φ( x′) > 。那麼支持向量機就不用計算複雜的非線性變換,而由這個函數 K(x, x′) 直接得到非線性變換的內積,使大大簡化了計算。這樣的函數 K(x, x′) 稱爲核函數。

首先核函數,也是一個函數,與高數中所認知的函數是一樣的,用於做某種變換。從一個集合到另一個集合的變化。

比如,是從集合A,到集合B的一種函數:A–>B,如下圖:

在這裏插入圖片描述
[映射兩邊的集合數據可以是不一致的,經過核函數K的變換之後,可以將一個二維的數據轉化爲一個三維的數據。能夠完成數據的升維。]

幾種不同的核函數:
.
1.Linear Kernel [線性核函數]

線性核是最簡單的核函數,核函數的數學公式如下:
k(x,y)=&lt;x,y&gt;k(x,y)=&lt;x,y&gt;

k(x,y)=xtyk(x,y)=x^{t}y
如果我們將線性核函數應用在KPCA中,我們會發現,推導之後和原始PCA算法一模一樣,很多童鞋藉此說“kernel is shit!!!”,這是不對的,這只是線性核函數偶爾會出現等價的形式罷了。

2.Polynomial Kernel [多項式核函數]

多項式覈實一種非標準核函數,它非常適合於正交歸一化後的數據,其具體形式如下:
k(x,y)=(axty+c)dk(x,y)=(ax^{t}y+c)^{d}
這個核函數是比較好用的,就是參數比較多,但是還算穩定。

3.Gaussian Kernel [高斯核函數]

這裏說一種經典的魯棒徑向基核,即高斯核函數,魯棒徑向基覈對於數據中的噪音有着較好的抗干擾能力,其參數決定了函數作用範圍,超過了這個範圍,數據的作用就“基本消失”。高斯核函數是這一族核函數的優秀代表,也是必須嘗試的核函數,其數學形式如下:
k(x,y)=exy22σ2k(x,y)=e^{-\frac{||x-y||^{2}}{2σ^{2}}}
雖然被廣泛使用,但是這個核函數的性能對參數十分敏感,以至於有一大把的文獻專門對這種核函數展開研究,同樣,高斯核函數也有了很多的變種,如指數核,拉普拉斯核等。

4.Exponential Kernel [指數核函數]

指數核函數就是高斯核函數的變種,它僅僅是將向量之間的L2距離調整爲L1距離,這樣改動會對參數的依賴性降低,但是適用範圍相對狹窄。其數學形式如下:
k(x,y)=exy2σ2k(x,y)=e^{-\frac{||x-y||}{2σ^{2}}}

5.Laplacian Kernel [拉普拉斯核函數]

拉普拉斯核完全等價於指數核,唯一的區別在於前者對參數的敏感性降低,也是一種徑向基核函數,數學形式如下:
k(x,y)=exyσk(x,y)=e^{-\frac{||x-y||}{σ}}

6.ANOVA Kernel [ANOVA 核]

ANOVA 核也屬於徑向基核函數一族,其適用於多維迴歸問題,數學形式如下:
k(x,y)=(eσ(xkyk)2)dk(x,y)=(e^{-σ(x^{k}-y^{k})^{2}})^{d}

7.Sigmoid Kernel [Sigmoid 核]

Sigmoid 核來源於神經網絡,現在已經大量應用於深度學習,是當今機器學習的寵兒,它是S型的,所以被用作於“激活函數”,數學形式如下:
k(x,y)=tanh(axty+c)k(x,y)=tanh(ax^{t}y+c)

8.Rational Quadratic Kernel [二次有理核]

二次有理核完完全全是作爲高斯核的替代品出現,如果你覺得高斯核函數很耗時,那麼不妨嘗試一下這個核函數,順便說一下,這個核函數作用域雖廣,但是對參數十分敏感,慎用,數學形式如下:
k(x,y)=1xy2xy2+ck(x,y)=1-\frac{||x-y||^{2}}{||x-y||^{2}+c}

9.Multiquadric Kernel [多元二次核]

多元二次核可以替代二次有理核,它是一種非正定核函數,數學形式如下:
k(x,y)=(xy2+c2)0.5k(x,y)=(||x-y||^{2}+c^{2})^{0.5}

10.Inverse Multiquadric Kernel [逆多元二次核]

顧名思義,逆多元二次核來源於多元二次核,這個核函數我沒有用過,但是據說這個基於這個核函數的算法,不會遇到核相關矩陣奇異的情況,數學形式如下:
k(x,y)=(xy2+c2)0.5k(x,y)=(||x-y||^{2}+c^{2})^{-0.5}

11.Circular Kernel

數學形式如下:
k(x,y)=2πarccos(xyσ)2πxyσ(1xy2σ)0.5k(x,y)=\frac{2}{π}arccos(-\frac{||x-y||}{σ})-\frac{2}{π}\frac{||x-y||}{σ}(1-\frac{||x-y||^{2}}{σ})^{0.5}

12.Spherical Kernel

數學形式如下:
k(x,y)=132xyσ+12(xy2σ)3k(x,y)=1-\frac{3}{2}\frac{||x-y||}{σ}+\frac{1}{2}(\frac{||x-y||^{2}}{σ})^{3}

13.Wave Kernel

數學形式如下:
k(x,y)=θxysin(xyθ)k(x,y)=\frac{\theta}{||x-y||}sin(\frac{||x-y||}{\theta})

14.Triangular Kernel [三角核函數]

三角核函數感覺就是多元二次核的特例,數學公式如下:
k(x,y)=xydk(x,y)=-||x-y||^{d}

15.Log Kernel [ 對數核]

對數核一般在圖像分割上經常被使用,數學形式如下:
k(x,y)=log(1+xyd)k(x,y)=-log(1+||x-y||^{d})

16.Spline Kernel

數學形式如下:
k(x,y)=1+xty+xtymin(x,y)x+y2min(x,y)2+13min(x,y)3k(x,y)=1+x^{t}y+x^{t}ymin(x,y)-\frac{x+y}{2}min(x,y)^{2}+\frac{1}{3}min(x,y)^{3}

17.Bessel Kernel

數學形式如下:
k(x,y)=Jv+1(σxy)xyn(v+1)k(x,y)=\frac{J_{v+1}(σ||x-y||)}{||x-y||^{-n(v+1)}}

18.Cauchy Kernel [ 柯西核]

柯西核來源於神奇的柯西分佈,與柯西分佈相似,函數曲線上有一個長長的尾巴,說明這個核函數的定義域很廣泛,言外之意,其可應用於原始維度很高的數據上,數學形式如下:
k(x,y)=1xy2/σ+1k(x,y)=\frac{1}{||x-y||^{2}/σ+1}

19.Chi-Square Kernel [ 卡方核]

卡方核,這是我最近在使用的核函數,讓我欲哭無淚,在多個數據集上都沒有用,竟然比原始算法還要差勁,不知道爲什麼文獻作者首推這個核函數,其來源於卡方分佈,數學形式如下:
k(x,y)=1k=1n(xkyk)20.5(xk+yk)k(x,y)=1-\sum_{k=1}^n \frac{(x_k-y_k)^{2}}{0.5(x_k+y_k)}
它存在着如下變種:
k(x,y)=xtyy+yzk(x,y)=\frac{x^{t}y}{||y+y||_z}
其實就是上式減去一項得到的產物,這個核函數基於的特徵不能夠帶有賦值,否則性能會急劇下降,如果特徵有負數,那麼就用下面這個形式:
sign(xty)k(x,y)sign(x^{t}y)k(|x|,|y|)

20.Histogram Intersection Kernel [ 直方圖交叉核]

直方圖交叉核在圖像分類裏面經常用到,比如說人臉識別,適用於圖像的直方圖特徵,例如extended LBP特徵其數學形式如下,形式非常的簡單,數學形式如下:
k(x,y)=k=1nmin(xk,yk)k(x,y)=\sum_{k=1}^n min(x_k,y_k)

21.Generalized Histogram Intersection [廣義直方圖交叉核]

顧名思義,廣義直方圖交叉核就是上述核函數的拓展,形式如下:
k(x,y)=k=1nmin(xkα,ykβ)k(x,y)=\sum_{k=1}^{n} min(|x_k|^α,|y_k|^{β})

22.Generalized T-Student Kernel [TS核]

TS核屬於mercer核,其數學形式如下,這個核也是經常被使用的,數學形式如下:
k(x,y)=11+xydk(x,y)=\dfrac{1}{1+||x-y||^{d}}
23.貝葉斯公式Bayesian Kernel [貝葉斯核函數]
因爲找不到貝葉斯核函數的形式,所以這裏補充爲貝葉斯公式,數學形式如下:
P(BiA)=P(Bi)P(ABi)j=1nP(Bj)P(ABj)P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^{n}P(B_j)P(A|B_j)}

輸入公式的我感覺快要爆炸了! 上面第19個方程的第二種形式,不知道下標是什麼,就寫了一個Z

以下兩個鏈接是我在輸入公式的時候參考的鏈接:
Cmd Markdown 公式指導手冊
使用CSDN的markdown編輯器插入數學公式

3.KPCA推導

這裏是引用
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

注:以上爲老師講課時的PPT,直接拿來,多有得罪。使用了引用的格式,表示不是自己親手製作的。
老師是會津大學裴巖(ペイ イ エン )。數據可視化着實教會了我很多東西,再次感謝。

1.關於以上PPT,跟着一步步推導即可,推導的過程注意矩陣形式的變化,不是很困難,而且我把當時我學習KPCA時瀏覽過的帖子放在下面,若是看不懂PPT可以去看鏈接的帖子。

2.KPCA困難之處在於:最後要得到的高維空間的數據是什麼樣子的,一般認爲,KPCA就是對歸一化的核矩陣進行PCA的操作,這麼說沒有錯,但是最後得到的高維空間的數據跟PCA的不盡相同。

3.在這裏,KPCA的最後一步,也就是PPT的最後一頁,可以看到多處了λ的一項,而且最後這一步的表達不是完整的數據空間,只是其中的一行或者一列數據。最後的x’,可以是(x1,x2,······,xn)中的任何一個x,所以需要有這麼多個列,然後變成一個新的矩陣,用這個矩陣才能得到最終的新數據。其中的u也不能僅僅當做一列數據,要對u的每一列都做變換 [1/(λ)^1/2 * u轉置] 纔可以。

核主成分分析的公式推導過程
核主成分分析(Kernel-PCA)
核PCA與PCA的精髓和核函數的映射實質

4.KPCA步驟

  1. 通過核函數(線性核,多項式核,高斯核,指數核)計算出核矩陣K [設原始數據有m行,n列,則每一行看成X,跟自身及其他m-1行運算,得到m*m的矩陣]
  2. 對於核矩陣K進行歸一化,得到zero_k
  3. 計算K的特徵值特徵向量data_e,data_v
  4. 從對角陣data_e中提取特徵值,並且賦值給data_e,對於data_e進行排序
  5. 根據特徵值矩陣data_e,對於特徵向量矩陣data_v排序
  6. 對於新排序的data_v的每一行除以對應行的data_e的值,賦值給新的矩陣v
  7. 用歸一化的核矩陣zero_k*v得到新的數據data_all
  8. 此時的data_all的每個維度已經排好序,取一二列,就是第一第二主成分
  9. [KPCA中的核矩陣與PCA中的協方差矩陣相比較,對於前者的處理多了一個步驟6]

5.KPCA數據

數據即是鳶尾花的150個數據,從MATLAB網站上可以找到,上一篇帖子裏也有。
鳶尾花數據

6.KPCA代碼

這裏的代碼使用的是高斯核函數。
將KPCA封裝成了一個函數,返回處理好矩陣,沒有捨棄任何維度。
繪製表格是一個函數,將三類數據分別繪製,便於觀察。
第一個for循環是爲了繪製不同σ值下的圖表,一個figure9個圖
可以選擇性進行多次KPCA的處理
代碼可以直接保存使用,至少在我的電腦上是可以運行的。

clc;
oridata=load('C:\Users\31386\Desktop\iris.csv');
data=oridata(:,2:5);
coldata=oridata(:,1);%先把第一列取出來
sigma=[3 3.5 4 4.5 5 5.5 5 10 100];%設置不同的σ的值

%利用不同的sigma值,繪製9個小圖,在同一個figure裏面
figure();
for i =1:9
    data_new=kpcafun(data,sigma(i));
    data_dif=[coldata,data_new(:,1:4)];
    %可選擇性註釋以下兩行
    data_new=kpcafun(data_dif,sigma(i));
    data_dif=[coldata,data_new(:,1:4)];
    %可選擇性註釋以下兩行
    data_new=kpcafun(data_dif,sigma(i));
    data_dif=[coldata,data_new(:,1:2)];
    
    hold on
    subplot(3,3,i)
    plottitle=['sigma=',num2str(sigma(i))];
    title(plottitle); 
    xlabel('X');
    ylabel('Y');

    paint(data_dif);
end

%繪製圖表
function []=paint(data_dif)
[a b]=size(data_dif);
for i=1:a
    hold on
    if data_dif(i,1)==0
        plot(data_dif(i,2),data_dif(i,3),'r.','markersize',7);
    elseif data_dif(i,1)==1
        plot(data_dif(i,2),data_dif(i,3),'g.','markersize',7);
    elseif data_dif(i,1)==2
        plot(data_dif(i,2),data_dif(i,3),'b.','markersize',7);
    end
end
end

function [data_new]=kpcafun(data,sigma)
[a b]=size(data);
k=ones(a,a);
zero_m=ones(a,a)/a;%用於中心化

%求出核矩陣
for i=1:a
    x=data(i,:);
    for j=1:a
        y=data(j,:);
        k(i,j)=exp(-norm(x-y)^2 / (2*sigma^2));
    end
end

%核矩陣中心化得到新的矩陣
zero_k=k-zero_m*k-k*zero_m+zero_m*k*zero_m;

% 計算特徵值與特徵向量  data_v特徵向量 data_e特徵值
[data_v,data_e]=eig(zero_k); %data_e是一個對角陣
data_e=diag(data_e);

%排序
[dump,index]=sort(data_e,'descend');
data_e=data_e(index);
v=data_v(:,index);
% v=fliplr(data_v);%這種寫法是不對的,當時因爲這種寫法使得結果異常

%取第一第二主成分
for i=1:a
    v(:,i)=v(:,i)/sqrt(data_e(i));
end
% data_all=v'*zero_k;
data_all=zero_k*v;
% data_all=data_all';
data_new=data_all;

end

7.KPCA結果

1.進行一次KPCA
.
在這裏插入圖片描述
2.進行兩次KPCA
.
在這裏插入圖片描述
3.進行三次KPCA
.
在這裏插入圖片描述

8.個人の理解

我感覺寫着一篇要死了

剛開始學的時候,線性代數已經忘記了一部分,對於矩陣相關的只是也是雲裏霧裏,機器學習的諸多算法,算法自身的推導過程並不是很難,唯一困難的地方就會矩陣變來變去,最後變成了一種人腦不能理解的形式,但總是有人可以理解的, 至少對於PCA、KPCA我現在是能夠理解的,推導過程之中,想要的東西還有其中已知的量是一個什麼樣子的矩陣,是大概能夠明白的。
KPCA是將低維非線性可分的數據轉化爲高維線性可分的數據,這個算法教給我的是一種思維的方式,倘若低維不可解的時候,可以不惜浪費計算量,將其升維,會發現問題變得很簡單,就像下面這一道數學題一樣:

計算:
+ex2&ThinSpace;dx\int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x
[偶函數,高斯曲線,一維不可解,有原函數,並不代表原函數可以寫出來 ]
.
顯然,有:
+ex2&ThinSpace;dx=+ey2&ThinSpace;dy\int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x=\int_{-\infty}^{+\infty}e^{-y^{2}}\,{\rm d}y
則:
I2=+ex2&ThinSpace;dx+ey2&ThinSpace;dyI^{2}=\int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x\int_{-\infty}^{+\infty}e^{-y^{2}}\,{\rm d}y
=De(x2+y2)&ThinSpace;dσ=\iint_{D} e^{-(x^{2}+y^{2})}\,{\rm d}\sigma
=02πθ&ThinSpace;dθ0+er2r&ThinSpace;dr=\int_{0}^{2π}\theta\,{\rm d}\theta\int_{0}^{+\infty}e^{-r^{2}}r\,{\rm d}r
=2π120+er2&ThinSpace;dr2=2π·\frac{1}{2}\int_{0}^{+\infty}e^{-r^{2}}\,{\rm d}r^{2}
=π
所以:
I=πI=\sqrt{π}

我覺的上面的不定積分題目,與KPCA有異曲同工之妙。
2019年4月19日:
本來覺得沒有希望的面試,竟然通過了,我說了我要文案策劃,我把自己壓箱底的詩詞都拿了出來,最後問了一句,你高數多少,變成了數值策劃 ,(づ。◕‿‿◕。)づ
寫首詩吧:
樂也風吹柳,道也江畔走,來去無歸處,罷攆足下狗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章