关于PCA的算法,网上有许多,但是很枯燥无味,我看着西瓜书上的PCA算法的介绍,写的确实很好但是根本很难看下去,给了我一种有着很多的宝藏却不知道从哪里开始的感觉,我本身也是算法的学习者,话不多说,接下来我给大家介绍一下我在机器学习的过程中的心得体会。希望有不同的可以私信我。
PCA算法全称是Principle Compoent Analysis,中文是主元成分分析。PCA的思想是将高维的数据投影到低维的数据,重新选定中心点,然后根据数据点的距离以次来计算所占的比例,简单点说就是离中心点越远的数据点在整个数据中所占的比例最大,这个比例也称作主元贡献率。PCA本身是不降维的,降维的过程体现在选择主元贡献率的过程中,本身所有的主元贡献率是100%,一般的主元贡献率要选择在85%以上,才能代表整个的数据,但是如果你选择的贡献率低于100%,那么就有一些离中心比较近的数据点没有被选择到,选择后新数据集就代替新的数据集,那么这就体现了降维的过程思想,具体的PCA算法思想介绍B站上就有,大家如果没听懂也没关系,只要会算法就行了。
以下是PCA算法的步骤:
1、数据预处理,对X按列标准化。
2、求相关矩阵R。
3、求R的特征值和特征向量P。
4、根据特征值从大到小重新排列特征值和特征向量P。
5、计算主元贡献率。
6、计算累计主元贡献率,当其大于85%(也可以自己选择主元贡献率,一般是85%),记录主元个数k。
7、计算主元矩阵。T=X*P
8、计算主元矩阵。
相关matlab代码:
下面展示一些 内联代码片
。
// A code block
x=[1.2,3,-1.1,17;
1.5,5,-3,22;
1.3,4.0,-2,19;
0.7,3,-2.3,11
1,4,-1.2,20.8];
stdr=std(x);
[n,m]=size(x);
sddata=zscore(x);
[p,princ,E]=pca(sddata);
p=p(:,1:3);
sc=princ(:,1:3);
% egenvalue;
% per=100*egenvalue/sum(egenvalue);
CM=cov(sddata);
[T,lamda]=eig(CM);
E=flipud(diag(lamda));
num_p=1;
while sum(E(1:num_p))/sum(E)<1
num_p=num_p+1;
end
a=T(:,m-num_p+1:m);
TT=sddata*a
subplot(2,2,1)
bar(per(1:num_p))
for i=1:num_p
text(bar_x(i)-0.25,per(i)+3,num2str((per(i))))
text(bar_x(i)+0.25,per(i)+3,char('%'))
end
subplot(2,2,2)
plot(x)
subplot(2,2,4)
plot(TT)
// An highlighted block
x=[1.2,3,-1.1,17;
1.5,5,-3,22;
1.3,4.0,-2,19;
0.7,3,-2.3,11
1