matlab中核主成分分析,核主成分分析代码解惑,谢谢

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

clc

clear

load('test.txt')

Z=test;

psize=size(Z);

m=psize(2);

n=psize(1);

l=ones(m,m);

for i=1:m

y(i)=0;

for j=1:n

y(i)=y(i)+Z(j,i);

end

y(i)=y(i)/n; %样本均值

endfor i=1:m

s(i)=0;

for k=1:n

s(i)=s(i)+(Z(k,i)-y(i))*(Z(k,i)-y(i));

end

s(i)=sqrt(s(i)/(n-1)); %样本标准差

endfor i=1:m

for j=1:n

XX(j,i)=(Z(j,i)-y(i))/s(i); %标准化处理

end

endx=XX;

percent=0.98; %KPCA中特征值的提取效率

d=0.98; %特征值成分的提取比重

var=287;

sign=1; %采用gauss核

tic

[eigenvalue,kernelmatrix,eigenvectors,project_invectors,le,leiji,t]=kpca(x,percent,var,sign); %未对样本进行筛选的KPCA

disp('KPCA所用时间');

toc

groupnumber=2; %样本分组的组数

tic

l=floor(psize(1)/groupnumber); %重采样进行重新分组

i=2;

k(1)=1;

while i<=groupnumber+1

k(i)=(i-1)*l;

i=i+1;

if i*l>psize;

k(i)=psize(1);

break;

end

end

xx=x(k(1):k(2),:);

[eigenvalue,kl,eigenvectors,akpcaproject_invectors,le,leiji,t]=kpca(xx,percent,var,sign); %先对第一组处理

if t==1

sume=abs(eigenvectors(:,1));

else

sume=abs(eigenvectors(:,1))+abs(eigenvectors(:,2));

end

[value,getnumber,restdata]=shaixuan(xx,sume,d); %对样本进行筛选

ter_xx=restdata; %记录获取的新样本数据

pvalue=value; %记录获取的样本编号

newdatanumber=getnumber;%记录获取的样本数目

%pvalue

for j=2:groupnumber %对每一小组样本执行KPCA,并对样本进行筛选

xx=x(k(j)+1:k(j+1),:);

[eigenvalue,kl,eigenvectors,akpcaproject_invectors,le,leiji,t]=kpca(xx,percent,var,sign);

if t==1

sume=abs(eigenvectors(:,1));

else

sume=abs(eigenvectors(:,1))+abs(eigenvectors(:,2));

end

[value,getnumber,restdata]=shaixuan(xx,sume,d); %对样本进行筛选

ter_xx=[ter_xx;restdata];

for ii=1:getnumber

value(ii)=value(ii)+k(j);

end

由于是小白,直接照抄的别人代码,但是shaixuan显示未定义,知道这里有问题,但是不知道怎么改,求教各位。谢谢。

4f7938504b095b84eac5d06f9d1ee30c.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
成分分析(Kernel Principal Component Analysis,简称KPCA)是一种基于技巧的成分分析方法。其要思想是将数据通过非线性映射转换到高维空间,然后在高维空间进行成分分析,以便更好地处理非线性数据。 以下是使用MATLAB实现成分分析的完整代码: ```matlab % 假设现有一个样本数据集X,其每一行表示一个样本数据 % 样本数量为m,样本维度为n % k为函数类型,例如线性可以使用'linear'表示,高斯可以使用'rbf'表示 % r为函数的参数 function [KPCA_components, KPCA_scores] = KPCA(X, k, r) % 数据心化 X = X - mean(X); % 计算矩阵K K = kernel_matrix(X, X, k, r); % 计算心化矩阵K_c m = size(X, 1); one_m = ones(m, m)/m; K_c = K - one_m * K - K * one_m + one_m * K * one_m; % 对心化矩阵K_c进行特征值分解 [eigVec, eigVal] = eig(K_c); % 选取前d个最大特征值对应的特征向量 [~, order] = sort(diag(eigVal), 'descend'); eigVec_selected = eigVec(:, order(1:d)); % 计算成分分量 KPCA_components = K_c * eigVec_selected; % 计算样本在新的成分分量上的投影得分 KPCA_scores = K * eigVec_selected; end function K = kernel_matrix(X1, X2, k, r) m1 = size(X1, 1); m2 = size(X2, 1); K = zeros(m1, m2); if strcmp(k, 'linear') for i = 1:m1 for j = 1:m2 K(i, j) = X1(i, :) * X2(j, :)'; end end elseif strcmp(k, 'rbf') for i = 1:m1 for j = 1:m2 K(i, j) = exp(-norm(X1(i, :)-X2(j, :))^2 / (2 * r^2)); end end end end ``` 以上代码首先进行了数据心化处理,然后根据所选的函数类型和参数计算了矩阵K。接下来,通过心化矩阵K_c进行特征值分解,并选取前d个最大特征值对应的特征向量。最后,利用计算得到的成分分量和样本在新的成分分量上的投影得分,实现了成分分析。 希望以上回答能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值