KPCA是一种非线性主元分析方法,用于降维。主要思想:通过某种事先选择的非线性映射函数Ф将输入矢量X映射到一个高维线性特征空间F之中,然后在空间F中使用PCA方法计算主元成分,核主成分分析最主要是非线性映射函数Ф的选取。
算法步骤:
Step 1. 数据标准化处理。
Step 2. 求核矩阵K,使用核函数来实现将原始数据由数据空间映射到特征空间。采用的核函数为径向基核函数,公式为:
Step 3. 中心化核矩阵Kc,用于修正核矩阵。公式为:
其中, 为N×N的矩阵,每一个元素都为1/N
Step 4. 计算矩阵KC的特征值 ,对应的特征向量为 。特征值决定方差的大小,也就是说特征值越大所蕴含的有用信息越多,因此按特征值降序排序得 ,特征向量相应调整 。
Step 5. 通过施密特正交化方法,正交化并单位化特征向量,得到 。
Step 6. 计算特征值的累计贡献率 ,根据给定的贡献率要求p,如果rt>p,则选取前t个主分量,作为降维后的数据。
KPCA的matlab实现:
function [train_kpca,test_kpca] = kpcaFordata(train,test,threshold,rbf_var)
%% Data kpca processing
if nargin <4
rbf_var=10000;%?
end
if nargin <3
threshold = 90;
end
%% 数据处理
patterns=zscore(train); %训练数据标准化
test_patterns=zscore(test); %测试数据标准化
train_num=size(patterns,1); %train_num是训练样本的个数
test_num=size(test_patterns,1);%test_num是测试样本的个数
cov_size = train_num; %cov_size是训练样本的个数
%% 计算核矩阵
for i=1:cov_size,
for j=i:cov_size,
K(i,j) = exp(-norm(patterns(i,:)-patterns(j,:))^2/rbf_var); %核函数 rbf_var ??
K(j,i) = K(i,j);
end
end
unit = ones(cov_size, cov_size)/cov_size;%cov_size是样本的个数
%% 中心化核矩阵
K_n = K - unit*K - K*unit + unit*K*unit;% 中心化核矩阵
%% 特征值分解
[evectors_1,evaltures_1] = eig(K_n/cov_size);
[x,index]=sort(real(diag(evaltures_1))); %sort每行按从小到大排序,x为排序后结果,index为索引
evals=flipud(x) ;% flipud函数实现矩阵的上下翻转
index=flipud(index);
%% 将特征向量按特征值的大小顺序排序
evectors=evectors_1(:,index);
%% 单位化特征向量(这里个人认为有问题)
% for i=1:cov_size
% evecs(:,i) = evectors(:,i)/(sqrt(evectors(:,i)));
% end
%%提取主成分 主成分所占的百分比>threshold
train_eigval = 100*cumsum(evals)./sum(evals);
index = find(train_eigval >threshold);
train_kpca = zeros(train_num, index(1)); %train_num是训练样本的个数
%% evecs是单位化后的特征矩阵,K_n是训练数据的中心化核矩阵 将训练数据进行映射,达到降维的目的!
train_kpca=[K_n * evectors(:,1:index(1))];
%% 重建测试数据
unit_test = ones(test_num,cov_size)/cov_size;%cov_size是训练样本的个数
K_test = zeros(test_num,cov_size); %test_num是测试样本的个数, cov_size是训练样本的个数
for i=1:test_num, %test_num是测试样本的个数
for j=1:cov_size,%cov_size是训练样本的个数
K_test(i,j) = exp(-norm(test_patterns(i,:)-patterns(j,:))^2/rbf_var);
end
end
K_test_n = K_test - unit_test*K - K_test*unit + unit_test*K*unit;
test_kpca = zeros(test_num, index(1));%test_num是测试样本的个数
alfa=ones(train_num,index(1));
alfa = patterns*evectors./(evals(1:index(1)).ones(1,test_num));
test_kpca = [K_test_n * alfa];
这是我整理的KPCA相关内容,希望能帮助大家!