赞
踩
当数据在低维空间不是线性可分的时候,转化到高维的空间可能就变成了线性可分的,这个过程用到了KPCA算法,也就是将数据才能从低维非线性,转化为高维线性可分数据的一种算法。
[注:这里的高维空间下的线性可分,此时的线性说的是一个超平面。我的理解。]
如下图,在二维空间中星星与红点是线性不可分的,如果将其分开,需要一个非线性的曲线[椭圆],但是非线性的曲线在构建的时候是不容易构建的。
所以这个时候就有了升维的骚操作,能够将一个非线性的区域,转化为高维空间下的一个超平面。高维空间下的一个平面压扁之后,被曲化。
[注:这种感觉好像是《三体》里面的降维打击一般,三维立体的生物被降维打击之后,就会平面化,本来可分的内脏器官之类的东西,就会乱成一团。]
低维线性不可分,到高维线性可分
什么是核函数呢?
支持向量机通过某非线性变换 φ( 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 ) = < x , y > k(x,y)=<x,y> k(x,y)=<x,y>
或
k ( x , y ) = x t y k(x,y)=x^{t}y k(x,y)=xty
如果我们将线性核函数应用在KPCA中,我们会发现,推导之后和原始PCA算法一模一样,很多童鞋借此说“kernel is shit!!!”,这是不对的,这只是线性核函数偶尔会出现等价的形式罢了。2.Polynomial Kernel [多项式核函数]
多项式核实一种非标准核函数,它非常适合于正交归一化后的数据,其具体形式如下:
k ( x , y ) = ( a x t y + c ) d k(x,y)=(ax^{t}y+c)^{d} k(x,y)=(axty+c)d
这个核函数是比较好用的,就是参数比较多,但是还算稳定。3.Gaussian Kernel [高斯核函数]
这里说一种经典的鲁棒径向基核,即高斯核函数,鲁棒径向基核对于数据中的噪音有着较好的抗干扰能力,其参数决定了函数作用范围,超过了这个范围,数据的作用就“基本消失”。高斯核函数是这一族核函数的优秀代表,也是必须尝试的核函数,其数学形式如下:
k ( x , y ) = e − ∣ ∣ x − y ∣ ∣ 2 2 σ 2 k(x,y)=e^{-\frac{||x-y||^{2}}{2σ^{2}}} k(x,y)=e−2σ2∣∣x−y∣∣2
虽然被广泛使用,但是这个核函数的性能对参数十分敏感,以至于有一大把的文献专门对这种核函数展开研究,同样,高斯核函数也有了很多的变种,如指数核,拉普拉斯核等。4.Exponential Kernel [指数核函数]
指数核函数就是高斯核函数的变种,它仅仅是将向量之间的L2距离调整为L1距离,这样改动会对参数的依赖性降低,但是适用范围相对狭窄。其数学形式如下:
k ( x , y ) = e − ∣ ∣ x − y ∣ ∣ 2 σ 2 k(x,y)=e^{-\frac{||x-y||}{2σ^{2}}} k(x,y)=e−2σ2∣∣x−y∣∣5.Laplacian Kernel [拉普拉斯核函数]
拉普拉斯核完全等价于指数核,唯一的区别在于前者对参数的敏感性降低,也是一种径向基核函数,数学形式如下:
k ( x , y ) = e − ∣ ∣ x − y ∣ ∣ σ k(x,y)=e^{-\frac{||x-y||}{σ}} k(x,y)=e−σ∣∣x−y∣∣6.ANOVA Kernel [ANOVA 核]
ANOVA 核也属于径向基核函数一族,其适用于多维回归问题,数学形式如下:
k ( x , y ) = ( e − σ ( x k − y k ) 2 ) d k(x,y)=(e^{-σ(x^{k}-y^{k})^{2}})^{d} k(x,y)=(e−σ(xk−yk)2)d7.Sigmoid Kernel [Sigmoid 核]
Sigmoid 核来源于神经网络,现在已经大量应用于深度学习,是当今机器学习的宠儿,它是S型的,所以被用作于“激活函数”,数学形式如下:
k ( x , y ) = t a n h ( a x t y + c ) k(x,y)=tanh(ax^{t}y+c) k(x,y)=tanh(axty+c)8.Rational Quadratic Kernel [二次有理核]
二次有理核完完全全是作为高斯核的替代品出现,如果你觉得高斯核函数很耗时,那么不妨尝试一下这个核函数,顺便说一下,这个核函数作用域虽广,但是对参数十分敏感,慎用,数学形式如下:
k ( x , y ) = 1 − ∣ ∣ x − y ∣ ∣ 2 ∣ ∣ x − y ∣ ∣ 2 + c k(x,y)=1-\frac{||x-y||^{2}}{||x-y||^{2}+c} k(x,y)=1−∣∣x−y∣∣2+c∣∣x−y∣∣29.Multiquadric Kernel [多元二次核]
多元二次核可以替代二次有理核,它是一种非正定核函数,数学形式如下:
k ( x , y ) = ( ∣ ∣ x − y ∣ ∣ 2 + c 2 ) 0.5 k(x,y)=(||x-y||^{2}+c^{2})^{0.5} k(x,y)=(∣∣x−y∣∣2+c2)0.510.Inverse Multiquadric Kernel [逆多元二次核]
顾名思义,逆多元二次核来源于多元二次核,这个核函数我没有用过,但是据说这个基于这个核函数的算法,不会遇到核相关矩阵奇异的情况,数学形式如下:
k ( x , y ) = ( ∣ ∣ x − y ∣ ∣ 2 + c 2 ) − 0.5 k(x,y)=(||x-y||^{2}+c^{2})^{-0.5} k(x,y)=(∣∣x−y∣∣2+c2)−0.511.Circular Kernel
数学形式如下:
k ( x , y ) = 2 π a r c c o s ( − ∣ ∣ x − y ∣ ∣ σ ) − 2 π ∣ ∣ x − y ∣ ∣ σ ( 1 − ∣ ∣ x − y ∣ ∣ 2 σ ) 0.5 k(x,y)=\frac{2}{π}arccos(-\frac{||x-y||}{σ})-\frac{2}{π}\frac{||x-y||}{σ}(1-\frac{||x-y||^{2}}{σ})^{0.5} k(x,y)=π2arccos(−σ∣∣x−y∣∣)−π2σ∣∣x−y∣∣(1−σ∣∣x−y∣∣2)0.512.Spherical Kernel
数学形式如下:
k ( x , y ) = 1 − 3 2 ∣ ∣ x − y ∣ ∣ σ + 1 2 ( ∣ ∣ x − y ∣ ∣ 2 σ ) 3 k(x,y)=1-\frac{3}{2}\frac{||x-y||}{σ}+\frac{1}{2}(\frac{||x-y||^{2}}{σ})^{3} k(x,y)=1−23σ∣∣x−y∣∣+21(σ∣∣x−y∣∣2)313.Wave Kernel
数学形式如下:
k ( x , y ) = θ ∣ ∣ x − y ∣ ∣ s i n ( ∣ ∣ x − y ∣ ∣ θ ) k(x,y)=\frac{\theta}{||x-y||}sin(\frac{||x-y||}{\theta}) k(x,y)=∣∣x−y∣∣θsin(θ∣∣x−y∣∣)14.Triangular Kernel [三角核函数]
三角核函数感觉就是多元二次核的特例,数学公式如下:
k ( x , y ) = − ∣ ∣ x − y ∣ ∣ d k(x,y)=-||x-y||^{d} k(x,y)=−∣∣x−y∣∣d15.Log Kernel [ 对数核]
对数核一般在图像分割上经常被使用,数学形式如下:
k ( x , y ) = − l o g ( 1 + ∣ ∣ x − y ∣ ∣ d ) k(x,y)=-log(1+||x-y||^{d}) k(x,y)=−log(1+∣∣x−y∣∣d)16.Spline Kernel
数学形式如下:
k ( x , y ) = 1 + x t y + x t y m i n ( x , y ) − x + y 2 m i n ( x , y ) 2 + 1 3 m i n ( x , y ) 3 k(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} k(x,y)=1+xty+xtymin(x,y)−2x+ymin(x,y)2+31min(x,y)317.Bessel Kernel
数学形式如下:
k ( x , y ) = J v + 1 ( σ ∣ ∣ x − y ∣ ∣ ) ∣ ∣ x − y ∣ ∣ − n ( v + 1 ) k(x,y)=\frac{J_{v+1}(σ||x-y||)}{||x-y||^{-n(v+1)}} k(x,y)=∣∣x−y∣∣−n(v+1)Jv+1(σ∣∣x−y∣∣)18.Cauchy Kernel [ 柯西核]
柯西核来源于神奇的柯西分布,与柯西分布相似,函数曲线上有一个长长的尾巴,说明这个核函数的定义域很广泛,言外之意,其可应用于原始维度很高的数据上,数学形式如下:
k ( x , y ) = 1 ∣ ∣ x − y ∣ ∣ 2 / σ + 1 k(x,y)=\frac{1}{||x-y||^{2}/σ+1} k(x,y)=∣∣x−y∣∣2/σ+1119.Chi-Square Kernel [ 卡方核]
卡方核,这是我最近在使用的核函数,让我欲哭无泪,在多个数据集上都没有用,竟然比原始算法还要差劲,不知道为什么文献作者首推这个核函数,其来源于卡方分布,数学形式如下:
k ( x , y ) = 1 − ∑ k = 1 n ( x k − y k ) 2 0.5 ( x k + y k ) k(x,y)=1-\sum_{k=1}^n \frac{(x_k-y_k)^{2}}{0.5(x_k+y_k)} k(x,y)=1−k=1∑n0.5(xk+yk)(xk−yk)2
它存在着如下变种:
k ( x , y ) = x t y ∣ ∣ y + y ∣ ∣ z k(x,y)=\frac{x^{t}y}{||y+y||_z} k(x,y)=∣∣y+y∣∣zxty
其实就是上式减去一项得到的产物,这个核函数基于的特征不能够带有赋值,否则性能会急剧下降,如果特征有负数,那么就用下面这个形式:
s i g n ( x t y ) k ( ∣ x ∣ , ∣ y ∣ ) sign(x^{t}y)k(|x|,|y|) sign(xty)k(∣x∣,∣y∣)20.Histogram Intersection Kernel [ 直方图交叉核]
直方图交叉核在图像分类里面经常用到,比如说人脸识别,适用于图像的直方图特征,例如extended LBP特征其数学形式如下,形式非常的简单,数学形式如下:
k ( x , y ) = ∑ k = 1 n m i n ( x k , y k ) k(x,y)=\sum_{k=1}^n min(x_k,y_k) k(x,y)=k=1∑nmin(xk,yk)21.Generalized Histogram Intersection [广义直方图交叉核]
顾名思义,广义直方图交叉核就是上述核函数的拓展,形式如下:
k ( x , y ) = ∑ k = 1 n m i n ( ∣ x k ∣ α , ∣ y k ∣ β ) k(x,y)=\sum_{k=1}^{n} min(|x_k|^α,|y_k|^{β}) k(x,y)=k=1∑nmin(∣xk∣α,∣yk∣β)22.Generalized T-Student Kernel [TS核]
TS核属于mercer核,其数学形式如下,这个核也是经常被使用的,数学形式如下:
k ( x , y ) = 1 1 + ∣ ∣ x − y ∣ ∣ d k(x,y)=\dfrac{1}{1+||x-y||^{d}} k(x,y)=1+∣∣x−y∣∣d1
23.贝叶斯公式Bayesian Kernel [贝叶斯核函数]
因为找不到贝叶斯核函数的形式,所以这里补充为贝叶斯公式,数学形式如下:
P ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) P(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^{n}P(B_j)P(A|B_j)} P(Bi∣A)=∑j=1nP(Bj)P(A∣Bj)P(Bi)P(A∣Bi)
输入公式的我感觉快要爆炸了!上面第19个方程的第二种形式,不知道下标是什么,就写了一个Z
以下两个链接是我在输入公式的时候参考的链接:
Cmd Markdown 公式指导手册
使用CSDN的markdown编辑器插入数学公式
注:以上为老师讲课时的PPT,直接拿来,多有得罪。使用了引用的格式,表示不是自己亲手制作的。
老师是会津大学裴岩(ペイ イ エン )。数据可视化着实教会了我很多东西,再次感谢。
1.关于以上PPT,跟着一步步推导即可,推导的过程注意矩阵形式的变化,不是很困难,而且我把当时我学习KPCA时浏览过的帖子放在下面,若是看不懂PPT可以去看链接的帖子。
2.KPCA困难之处在于:最后要得到的高维空间的数据是什么样子的,一般认为,KPCA就是对归一化的核矩阵进行PCA的操作,这么说没有错,但是最后得到的高维空间的数据跟PCA的不尽相同。
3.在这里,KPCA的最后一步,也就是PPT的最后一页,可以看到多处了λ的一项,而且最后这一步的表达不是完整的数据空间,只是其中的一行或者一列数据。最后的x’,可以是(x1,x2,······,xn)中的任何一个x,所以需要有这么多个列,然后变成一个新的矩阵,用这个矩阵才能得到最终的新数据。其中的u也不能仅仅当做一列数据,要对u的每一列都做变换 [1/(λ)^1/2 * u转置] 才可以。
数据即是鸢尾花的150个数据,从MATLAB网站上可以找到,上一篇帖子里也有。
鸢尾花数据
这里的代码使用的是高斯核函数。
将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
1.进行一次KPCA
.
2.进行两次KPCA
.
3.进行三次KPCA
.
我感觉写着一篇要死了
刚开始学的时候,线性代数已经忘记了一部分,对于矩阵相关的只是也是云里雾里,机器学习的诸多算法,算法自身的推导过程并不是很难,唯一困难的地方就会矩阵变来变去,最后变成了一种人脑不能理解的形式,但总是有人可以理解的, 至少对于PCA、KPCA我现在是能够理解的,推导过程之中,想要的东西还有其中已知的量是一个什么样子的矩阵,是大概能够明白的。
KPCA是将低维非线性可分的数据转化为高维线性可分的数据,这个算法教给我的是一种思维的方式,倘若低维不可解的时候,可以不惜浪费计算量,将其升维,会发现问题变得很简单,就像下面这一道数学题一样:
计算:
∫ − ∞ + ∞ e − x 2   d x \int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x ∫−∞+∞e−x2dx
[偶函数,高斯曲线,一维不可解,有原函数,并不代表原函数可以写出来]
.
显然,有:
∫ − ∞ + ∞ e − x 2   d x = ∫ − ∞ + ∞ e − y 2   d y \int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x=\int_{-\infty}^{+\infty}e^{-y^{2}}\,{\rm d}y ∫−∞+∞e−x2dx=∫−∞+∞e−y2dy
则:
I 2 = ∫ − ∞ + ∞ e − x 2   d x ∫ − ∞ + ∞ e − y 2   d y I^{2}=\int_{-\infty}^{+\infty}e^{-x^{2}}\,{\rm d}x\int_{-\infty}^{+\infty}e^{-y^{2}}\,{\rm d}y I2=∫−∞+∞e−x2dx∫−∞+∞e−y2dy
= ∬ D e − ( x 2 + y 2 )   d σ =\iint_{D} e^{-(x^{2}+y^{2})}\,{\rm d}\sigma =∬De−(x2+y2)dσ
= ∫ 0 2 π θ   d θ ∫ 0 + ∞ e − r 2 r   d r =\int_{0}^{2π}\theta\,{\rm d}\theta\int_{0}^{+\infty}e^{-r^{2}}r\,{\rm d}r =∫02πθdθ∫0+∞e−r2rdr
= 2 π ⋅ 1 2 ∫ 0 + ∞ e − r 2   d r 2 =2π·\frac{1}{2}\int_{0}^{+\infty}e^{-r^{2}}\,{\rm d}r^{2} =2π⋅21∫0+∞e−r2dr2
= π =π =π
所以:
I = π I=\sqrt{π} I=π
我觉的上面的不定积分题目,与KPCA有异曲同工之妙。
2019年4月19日:
本来觉得没有希望的面试,竟然通过了,我说了我要文案策划,我把自己压箱底的诗词都拿了出来,最后问了一句,你高数多少,变成了数值策划,(づ。◕‿‿◕。)づ
写首诗吧:
乐 也 风 吹 柳 , 道 也 江 畔 走 , 来 去 无 归 处 , 罢 撵 足 下 狗 。 乐也风吹柳,道也江畔走,来去无归处,罢撵足下狗。 乐也风吹柳,道也江畔走,来去无归处,罢撵足下狗。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。