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 [線性核函數]線性核是最簡單的核函數,核函數的數學公式如下:
或
如果我們將線性核函數應用在KPCA中,我們會發現,推導之後和原始PCA算法一模一樣,很多童鞋藉此說“kernel is shit!!!”,這是不對的,這只是線性核函數偶爾會出現等價的形式罷了。2.Polynomial Kernel [多項式核函數]
多項式覈實一種非標準核函數,它非常適合於正交歸一化後的數據,其具體形式如下:
這個核函數是比較好用的,就是參數比較多,但是還算穩定。3.Gaussian Kernel [高斯核函數]
這裏說一種經典的魯棒徑向基核,即高斯核函數,魯棒徑向基覈對於數據中的噪音有着較好的抗干擾能力,其參數決定了函數作用範圍,超過了這個範圍,數據的作用就“基本消失”。高斯核函數是這一族核函數的優秀代表,也是必須嘗試的核函數,其數學形式如下:
雖然被廣泛使用,但是這個核函數的性能對參數十分敏感,以至於有一大把的文獻專門對這種核函數展開研究,同樣,高斯核函數也有了很多的變種,如指數核,拉普拉斯核等。4.Exponential Kernel [指數核函數]
指數核函數就是高斯核函數的變種,它僅僅是將向量之間的L2距離調整爲L1距離,這樣改動會對參數的依賴性降低,但是適用範圍相對狹窄。其數學形式如下:
5.Laplacian Kernel [拉普拉斯核函數]
拉普拉斯核完全等價於指數核,唯一的區別在於前者對參數的敏感性降低,也是一種徑向基核函數,數學形式如下:
6.ANOVA Kernel [ANOVA 核]
ANOVA 核也屬於徑向基核函數一族,其適用於多維迴歸問題,數學形式如下:
7.Sigmoid Kernel [Sigmoid 核]
Sigmoid 核來源於神經網絡,現在已經大量應用於深度學習,是當今機器學習的寵兒,它是S型的,所以被用作於“激活函數”,數學形式如下:
8.Rational Quadratic Kernel [二次有理核]
二次有理核完完全全是作爲高斯核的替代品出現,如果你覺得高斯核函數很耗時,那麼不妨嘗試一下這個核函數,順便說一下,這個核函數作用域雖廣,但是對參數十分敏感,慎用,數學形式如下:
9.Multiquadric Kernel [多元二次核]
多元二次核可以替代二次有理核,它是一種非正定核函數,數學形式如下:
10.Inverse Multiquadric Kernel [逆多元二次核]
顧名思義,逆多元二次核來源於多元二次核,這個核函數我沒有用過,但是據說這個基於這個核函數的算法,不會遇到核相關矩陣奇異的情況,數學形式如下:
11.Circular Kernel
數學形式如下:
12.Spherical Kernel
數學形式如下:
13.Wave Kernel
數學形式如下:
14.Triangular Kernel [三角核函數]
三角核函數感覺就是多元二次核的特例,數學公式如下:
15.Log Kernel [ 對數核]
對數核一般在圖像分割上經常被使用,數學形式如下:
16.Spline Kernel
數學形式如下:
17.Bessel Kernel
數學形式如下:
18.Cauchy Kernel [ 柯西核]
柯西核來源於神奇的柯西分佈,與柯西分佈相似,函數曲線上有一個長長的尾巴,說明這個核函數的定義域很廣泛,言外之意,其可應用於原始維度很高的數據上,數學形式如下:
19.Chi-Square Kernel [ 卡方核]
卡方核,這是我最近在使用的核函數,讓我欲哭無淚,在多個數據集上都沒有用,竟然比原始算法還要差勁,不知道爲什麼文獻作者首推這個核函數,其來源於卡方分佈,數學形式如下:
它存在着如下變種:
其實就是上式減去一項得到的產物,這個核函數基於的特徵不能夠帶有賦值,否則性能會急劇下降,如果特徵有負數,那麼就用下面這個形式:
20.Histogram Intersection Kernel [ 直方圖交叉核]
直方圖交叉核在圖像分類裏面經常用到,比如說人臉識別,適用於圖像的直方圖特徵,例如extended LBP特徵其數學形式如下,形式非常的簡單,數學形式如下:
21.Generalized Histogram Intersection [廣義直方圖交叉核]
顧名思義,廣義直方圖交叉核就是上述核函數的拓展,形式如下:
22.Generalized T-Student Kernel [TS核]
TS核屬於mercer核,其數學形式如下,這個核也是經常被使用的,數學形式如下:
23.貝葉斯公式Bayesian Kernel [貝葉斯核函數]
因爲找不到貝葉斯核函數的形式,所以這裏補充爲貝葉斯公式,數學形式如下:
輸入公式的我感覺快要爆炸了!上面第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轉置] 纔可以。
4.KPCA步驟
- 通過核函數(線性核,多項式核,高斯核,指數核)計算出核矩陣K [設原始數據有m行,n列,則每一行看成X,跟自身及其他m-1行運算,得到m*m的矩陣]
- 對於核矩陣K進行歸一化,得到zero_k
- 計算K的特徵值特徵向量data_e,data_v
- 從對角陣data_e中提取特徵值,並且賦值給data_e,對於data_e進行排序
- 根據特徵值矩陣data_e,對於特徵向量矩陣data_v排序
- 對於新排序的data_v的每一行除以對應行的data_e的值,賦值給新的矩陣v
- 用歸一化的核矩陣zero_k*v得到新的數據data_all
- 此時的data_all的每個維度已經排好序,取一二列,就是第一第二主成分
- [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是將低維非線性可分的數據轉化爲高維線性可分的數據,這個算法教給我的是一種思維的方式,倘若低維不可解的時候,可以不惜浪費計算量,將其升維,會發現問題變得很簡單,就像下面這一道數學題一樣:
計算:
[偶函數,高斯曲線,一維不可解,有原函數,並不代表原函數可以寫出來]
.
顯然,有:
則:
所以:
我覺的上面的不定積分題目,與KPCA有異曲同工之妙。
2019年4月19日:
本來覺得沒有希望的面試,竟然通過了,我說了我要文案策劃,我把自己壓箱底的詩詞都拿了出來,最後問了一句,你高數多少,變成了數值策劃,(づ。◕‿‿◕。)づ
寫首詩吧: