matlab怎么实现主成分分析

matlab怎么实现主成分分析,第1张

先求协方差矩阵,之后对协方差矩阵求特征值与特征向量,将特征从大到小排列,取其贡献率大于85%~95%的特征值与特征向量作为其主元与负荷,之后根据负荷求得分。

说得有点抽象,你可以参考下面的例子

%% 导入原始数据

[Xrow, Xcol] = size(X)% Xrow:样本个数 Xcol:样本属性个数

%% 数据预处理,进行标准化出理,处理后均值为0方差为1

Xc = mean(X)% 求原始数据的均值

Xe = std(X) % 求原始数据的标准差

X0 = (X-ones(Xrow,1)*Xc) ./ (ones(Xrow,1)*Xe)% 标准阵X0,标准化为均值0,方差1

%% 求标准化矩阵的协方差矩阵

sigma = cov(X0)

%% 特征值分解

[V, D] = eig(sigma)% 求协方差矩阵的特征向量(V)和特征值(D)

lmda = diag(D) % 将主对角线上为特征值的对角阵变换成特征值列向量

[Dt, index] = sort(lmda, 'descend')% 特征值按降序排列,Dt是排列后的数组,index是序号

%% 根据累积主元贡献率选取主元个数

npc = 1

while sum(Dt(1:npc)) / sum(Dt) <0.85

npc = npc + 1

end

%% 计算负荷向量

P_all = V(:, index) % 全部负荷

P_pcs = P_all(:, 1:npc) % 主元负荷

%% 构建主元对角阵

Lambda = diag(Dt(1:npc))

%% 计算得分向量

t_all = X0 * P_all % 全部得分

t_pcs = t_all(:, 1:npc) % 主元得分

在软件Matlab中实现主成分分析可以采取两种方式实现:一是通过编程来实现;二是直接调用Matlab中自带程序实现。

通过直接调用Matlab中的程序可以实现主成分分析:

式中:X为输入数据矩阵

(一般要求n>m)

输出变量:

①pc 主分量fi的系数,也叫因子系数;注意:pcTpc=单位阵

②score是主分量下的得分值;得分矩阵与数据矩阵X的阶数是一致的;

③variance是score对应列的方差向量,即A的特征值;容易计算方差所占的百分比

percent-v = 100*variance/sum(variance)

④t2表示检验的t2-统计量(方差分析要用)

计算过程中应用到计算模型:

(要求p<m)

例:表1为某地区农业生态经济系统各区域单元相关指标数据,运用主成分分析方法可以用更少的指标信息较为精确地描述该地区农业生态经济的发展状况。

表1 某农业生态经济系统各区域单元的有关数据

样本序号 x1:人口密度(人/km2) x 2:人均耕地面积(ha) x 3:森林覆盖率(%) x 4:农民人均纯收入(元/人) x 5:人均粮食产量 (kg/人) x 6:经济作物占农作物播面比例(%) x 7:耕地占土地面积比率(%) x 8:果园与林地面积之比(%) x 9:灌溉田占耕地面积之比(%)

1 363.912 0.352 16.101 192.11 295.34 26.724 18.492 2.231 26.262

2 141.503 1.684 24.301 1 752.35 452.26 32.314 14.464 1.455 27.066

3 100.695 1.067 65.601 1 181.54 270.12 18.266 0.162 7.474 12.489

4 143.739 1.336 33.205 1 436.12 354.26 17.486 11.805 1.892 17.534

5 131.412 1.623 16.607 1 405.09 586.59 40.683 14.401 0.303 22.932

6 68.337 2.032 76.204 1 540.29 216.39 8.128 4.065 0.011 4.861

7 95.416 0.801 71.106 926.35 291.52 8.135 4.063 0.012 4.862

8 62.901 1.652 73.307 1 501.24 225.25 18.352 2.645 0.034 3.201

9 86.624 0.841 68.904 897.36 196.37 16.861 5.176 0.055 6.167

10 91.394 0.812 66.502 911.24 226.51 18.279 5.643 0.076 4.477

11 76.912 0.858 50.302 103.52 217.09 19.793 4.881 0.001 6.165

12 51.274 1.041 64.609 968.33 181.38 4.005 4.066 0.015 5.402

13 68.831 0.836 62.804 957.14 194.04 9.110 4.484 0.002 5.790

14 77.301 0.623 60.102 824.37 188.09 19.409 5.721 5.055 8.413

15 76.948 1.022 68.001 1 255.42 211.55 11.102 3.133 0.010 3.425

16 99.265 0.654 60.702 1 251.03 220.91 4.383 4.615 0.011 5.593

17 118.505 0.661 63.304 1 246.47 242.16 10.706 6.053 0.154 8.701

18 141.473 0.737 54.206 814.21 193.46 11.419 6.442 0.012 12.945

19 137.761 0.598 55.901 1 124.05 228.44 9.521 7.881 0.069 12.654

20 117.612 1.245 54.503 805.67 175.23 18.106 5.789 0.048 8.461

21 122.781 0.731 49.102 1 313.11 236.29 26.724 7.162 0.092 10.078

对于上述例子,Matlab进行主成分分析,可以得到如下结果。

① 以及每一个主成分的贡献率和累计贡献率,如表2和图1。

表2. 特征根及主成分贡献率

主成分 特征值 贡献率%累积贡献率%

1 4.661 51.791 51.791

2 2.089 23.216 75.007

3 1.043 11.589 86.596

4 0.507 5.638 92.234

5 0.315 3.502 95.736

6 0.193 2.140 97.876

7 0.114 1.271 99.147

8 4.533E-02 0.504 99.650

9 3.147E-02 0.350 100.000

图1 特征根

② 前3几个主成分的载荷系数如表3所示。

表3 前三个主成分在原变量上的载荷

前三个主成分

变量 1 2 3

X1 0.158 -0.255 -0.059

X2 0.026 0.424 -0.027

X3 -0.207 0.046 0.091

X4 0.009 0.415 0.036

X5 0.174 0.212 -0.011

X6 0.176 0.086 0.120

X7 0.200 -0.064 -0.241

X8 0.042 -0.048 0.930

X9 0.207 -0.012 0.088

function [lambda,T,fai]=MSA2(A)

%求标准化后的协差矩阵,再求特征根和特征向量

%标准化处理

[p,n]=size(A)

for j=1:n

mju(j)=mean(A(:,j))

sigma(j)=sqrt(cov(A(:,j)))

end

for i=1:p

for j=1:n

Y(i,j)=(A(i,j)-mju(j))/sigma(j)

end

end

sigmaY=cov(Y)

%求X标准化的协差矩阵的特征根和特征向量

[T,lambda]=eig(sigmaY)

% disp('特征根(由小到大):')

% disp(lambda)

% disp('特征向量:')

% disp(T)

%方差贡献率

Xsum=sum(sum(lambda,2),1)

for i=1:n

fai(i)=lambda(i,i)/Xsum

end

% disp('方差贡献率:')

% disp(fai)

u=T(:,n)

B=[]

h=length(A(:,1))

for k=1:n

m1=mean(A(:,k))

t=(A(:,k)-m1).^2

m2=sqrt(sum(t))/(h-1)

B=[B,(A(:,k)-m1)./m2]

end

y=B*u

x1=1:1:length(y)

plot(x1,y)

xlabel('时间/小时')

ylabel('综合指标')

title('综合指标-时间曲线')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11496734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存