核主成分分析KPCA分析

来源:互联网 发布:js的ajaxsubmit 编辑:程序博客网 时间:2024/06/05 17:02

转自:http://blog.sina.com.cn/s/blog_6163bdeb0102ee95.html

之前转载了一篇博客,介绍了KPCA的推导,作者主要是参考、翻译了另一篇博客http://zhanxw.com/blog/2011/02/kernel-pca-原理和演示/,这里讲KPCA的整个过程很详细,还有R实现的代码,很不错!建议保存下来看,这个网站有时候上不去。

    理论明白了,如果想在matlab里实现KPCA或者真正去用它,可以参考如下两个代码:

    博客http://blog.sina.com.cn/s/blog_7671b3eb01012d9s.html中实现了KPCA的整个过程,但把特征向量的去单位化注释掉了,实际上这段代码是必要的(因为eig解得的特征向量是单位化的,但实际要求的向量长度不是1,详见公式推导);代码的最后还有新数据在特征空间的投影。

    还有一个实现的代码是matlab exchange上的http://www.mathworks.com/matlabcentral/fileexchange/27319-kernel-pca,代码的每一步都有英文说明,代码挺规范的,只是最后没有新数据向特征空间的投影代码。

    上面的有助于加深对KPCA的理解,如果真正要用,可以用stprtool模式识别工具箱的kpca函数,使用很方便,如下例子,这段代码用KPCA实现对一个二维圆的降维处理,可以看到效果很好:

% 3.3 Kernel Principal Component Analysis
clc
clear
close all

% generate circle data
X = gencircledata([1;1],5,250,1);

% compute kernel PCA
options.ker = 'rbf'; % use RBF kernel
options.arg = 4; % kernel argument
options.new_dim = 2; % output dimension
model = kpca(X,options);

XR = kpcarec(X,model); % compute reconstruced data

% Visualization
figure;
h1 = ppatterns(X);
h2 = ppatterns(XR, '+r');
legend([h1 h2],'Input vectors','Reconstructed');

mx32591

 

    另尝试编写的一个代码如下,实现对3类数据特征空间的聚类,如下图,红、绿、蓝三种颜色分别表示3类数据,经过rbf核映射到新的空间后,分别聚成了3类:

mx372E5

mx392B5

    这里使用的是rbf核,还可以使用多项式核或sigmoid核,要想得到好的结果就要不断改变核参数,rbf效果好调一些,sigmoid不易找到好的参数,多项式核在一些范围效果不错,但两个参数调整需要好好找找,如下为一个多项式核函数的结果

mx37797

mx39B1E

    注意,如果你测试代码,结果不一样很正常,因为gencircledata函数产生的数据有随机成分在。

% 3.3 Kernel Principal Component Analysis
clc
clear
close all

% generate circle data
X0 = gencircledata([1;1],1,250,0.1);
X1 = gencircledata([1;1],3,250,0.1);
X2 = gencircledata([1;1],6,250,0.1);
X0 = X0 - repmat(mean(X0, 2), 1, 250);
X1 = X1 - repmat(mean(X1, 2), 1, 250);
X2 = X2 - repmat(mean(X2, 2), 1, 250);

X = [X0 X1 X2];
y = [ones(1, size(X0, 2)) 2*ones(1, size(X1, 2)) 3*ones(1, size(X2, 2))];
data.X = X;
data.y = y;

figure
ppatterns(data);

% compute kernel PCA
kernelflag = 1;
if kernelflag == 1
    options.ker = 'rbf';
    options.arg = 2; % kernel argument
elseif kernelflag == 2
    options.ker = 'sigmoid';
    options.arg = [3 10]; % kernel argument
else
    options.ker = 'poly';
    options.arg = [2 0]; % kernel argument
end

options.new_dim = 2; % output dimension
model = kpca(data.X, options);
kpca_data = kernelproj(data, model);

figure
ppatterns(kpca_data);

0 0
原创粉丝点击