前言

最近在看有关PCA的东西,看完后准备用MATLAB实现,谁知道MATLAB一堆函数,因此整理一下。

PCA原理

这里不推导数学公式,推导数学公式已经有其他很多讲的非常好的博客了。我这里尽量用通俗易懂的语言讲解一下。

PCA的过程是这样的,首先求出原始矩阵A(mxn)的协方差矩阵(mxm),然后对协方差矩阵求特征值。假设原始数据是n维,想要降到k维,则取前k个最大的特征值,将这k个特征值对应的特征向量作为系数矩阵,用原始数据乘以该系数矩阵便实现了降维。

这里需要说明一下的是,如果我也不知道想降低到多少维度,仅仅是想保证方差贡献度为99%以上,该如何做呢?简单,上述过程中不是求出了n个特征值吗,假设说前k个特征值的和/所有特征值的和达到了99%,那么k即为所求。

MATLAB实现

注意事项

原始数据A在使用PCA进行压缩之前必须中心化,即保证每列数据均值为0。那到底需不需要进行标准化呢(使得数据均值为0,标准差为1)?这个需要根据数据的实际情况考虑,如何不同特征之间数值相差太大,则建议进行标准化。matlab中有可直接使用的标准化函数normalize

[coeff,latent,explained]=pcacov(A);
%1设定方差贡献度为99%
for i=1:length(explained)
	if sum(explained(1:i))>99
		ans=i;
		break;
	end
end
tran=coeff(:,1:ans);
B=A*coeff;
%仅仅取前k维向量
%tran=coeff(:,1:k);
B=A*coeff;

解释一下,coeff为主成分系数,也就是原始矩阵A的协方差矩阵所对应的特征值的特征向量(由大到小排列,列向量一一对应)。latent为每个主成分所对应的方差,explained则是每个主成分所对应的方差的占比情况。可以理解为explained是将latent进行了0-1的归一化。

一些说明

实现PCA的方法,也就是求出协方差矩阵后,求对应的特征值和特征向量的方法有两种,一是特征值分解,二是奇异值分解SVD。matlab函数pcacov使用的是奇异值分解,适用于原始数据A(mxn)m远大于n的情况,这个时候使用特征值分解会不太准。这里有点赘述,可忽略。

最后

如果有不当或错误之处,欢迎留言指正。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐