📄 kpca081223.m
字号:
function ytest=kpca081223(xtest,xtrain,gongxianlv);
%该程序于2008-12-23调试通过,输入数据是列向量
rbf_var = 10; %高斯核的参数
xs=xtrain; %xs 为建立特征向量的样本数目
%************采用高斯核,寻求核矩阵****************
s = rbf_var;
rows = size(xs,2); %建立核矩阵的行和列
cols = size(xs,2);
tmp = zeros(rows,cols);
for i = 1:rows
for j = 1:cols
tmp(i,j) = norm(xs(:,i)-xs(:,j));
end
end
K = exp(-0.5*(tmp/s).^2); %k为方阵
%======================中心化K
nkpca=size(xs,2);
J = ones(nkpca, nkpca)/ nkpca;
K = K - J*K - K*J + J*K*J;
%===================== 求解特征向量
[V,D]=eig(K); %协方差矩阵作分解
[eigv,inxDesc]=sort(-diag(D));
eigv=-eigv;
T=V(:,inxDesc); %特征向量以列的形式存放,且根据特征值进行调整顺序
%++++++++++++++++++++++++++++++++++++++++++++寻求大于大于gongxianlv的主元
totaleigv=sum(eigv);
total=0;
for i=1:rows %寻找主元贡献率
total=eigv(i,1)+total;
if total>gongxianlv*totaleigv
break;
end
end
T =T(:,1:i); %把特征向量由列向量变成行向量 取前i个 i由贡献率决定
%+++++++++++++++++++++++++++++++++++++++++进行标准化
m=i; %前m个贡献率大于0.9
for i=1:m
Translate(:,i) = T(:,i)/(sqrt(eigv(i))); %前m个标准化 m列nkpca 行
end
%++++++++++++++++++++++++++++++++++++++++++进行特征变换
number_test= size(xtest,2); %寻求测试样本数目
unit_test = ones(number_test,nkpca)/ nkpca;
unit = J;
K_test = zeros(number_test, nkpca);
for i=1:number_test
for j=1:nkpca
K_test(i,j) = norm(xtest(:,i)-xtrain(:,j));
end
end
K_test = exp(-0.5*( K_test/s).^2);
K_test_n = K_test - unit_test*K - K_test*unit + unit_test*K*unit; %零均值化
test_features = K_test_n * Translate;
test_features = test_features';
ytest=test_features;
%核矩阵零均值化有点不明白 没有关系 算法分析通过
%+++++++++++++++++++++++++++++++++++++++++算法结束
i=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -