主成分分析法
主成分分析法
综述:数据降维的方法
可以用一种线性变换的思想去理解,比如二维的一条直线,我们可以通过变换,使得这一条直线落在x或y轴上,达到降维的效果。
去中心化(把坐标原点放在数据中心)
找坐标系,找到数据方差最大的方向,就是第一主成分。(如果第一主成分不足以表达,就考虑吧选取第二个)
为了有效反映原来信息,第一主成分和第二主成分的协方差为0.以此类推可以获得p个主成分。这些主成分是互不相关,是依次递减的。
累计方差贡献率大于百分之80就可以了,或者特征根大于1就可以了。
?根据线性代数的知识,我们需要一则伸缩,二则旋转,伸缩不是问题
旋转的矩阵R又从何而来?
即是协方差矩阵的特征向量就是R。
协方差定义=
img
image-20240129173904717
image-20240129173917094
image-20240129173940409
image-20240129173956777
例题:
image-20240129174252433
image-20240129174259805
image-20240129174305765
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| clear;clc load data1.mat
[n,p] = size(x);
X=zscore(x);
R = cov(X);
R = corrcoef(x); disp('样本相关系数矩阵为:') disp(R)
[V,D] = eig(R);
lambda = diag(D); lambda = lambda(end:-1:1); contribution_rate = lambda / sum(lambda); cum_contribution_rate = cumsum(lambda)/ sum(lambda); disp('特征值为:') disp(lambda') disp('贡献率为:') disp(contribution_rate') disp('累计贡献率为:') disp(cum_contribution_rate') disp('与特征值对应的特征向量矩阵为:')
V=rot90(V)'; disp(V)
m =input('请输入需要保存的主成分的个数: '); F = zeros(n,m); for i = 1:m ai = V(:,i)'; Ai = repmat(ai,n,1); F(:, i) = sum(Ai .* X, 2); end
|