function train_kpca = M_KPCA(train,threshold,rbf_var)
%% Data kpca processing
if nargin <3
rbf_var=10000;%?
end
if nargin <2
threshold = 90;
end
%% 数据处理
patterns=zscore(train); %训练数据标准化
train_num=size(patterns,1); %train_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);
%% 单位化特征向量(这里个人认为有问题)
%%提取主成分 主成分所占的百分比>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))];
KPCA matlab实现
5星 · 超过95%的资源 需积分: 49 45 浏览量
2018-04-12
18:29:23
上传
评论 8
收藏 1.03MB ZIP 举报
hty000_
- 粉丝: 0
- 资源: 1