关于主成分分析matlab代码实现的总结

一:具体过程

方法一:

1:用zscore函数对原始数据S进行标准化。

2:用cov函数求出标准化后的数据的协方差。

3:求出此协方差的特征向量与特征根(eig函数)。

4:将产生的特征向量依据特征根大小从大到小进行排列(即将特征向量按列倒序)。

5:依据需求取出倒序后的向量的前几列(一般根据特征根来算贡献率,使得累计贡献率大于85%),组成新的矩阵T

6:做S*T得到分析后的新的数据。

7:依据特征根算贡献率,并绘图。

代码如下:

X=load('shuju.txt')

z=zscore(X)               %数据标准化

M=cov(z)                  %协方差

[V,D]=eig(M);             %求出协方差矩阵的特征向量、特征根

d=diag(D);                %取出特征根矩阵列向量(提取出每一主成分的贡献率)

eig1=sort(d,'descend')      %将贡献率按从大到小元素排列

v=fliplr(V)                %依照D重新排列特征向量

S=0;

i=0;

while S/sum(eig1)<0.85

    i=i+1;

    S=S+eig1(i);

end                         %求出累积贡献率大于85%的主成分

NEW=z*v(:,1:i)              %输出产生的新坐标下的数据

W=100*eig1/sum(eig1)

figure(1)

pareto(W);                  %画出贡献率的直方图

 

 

方法二:

1:用zscore函数对原始数据S进行标准化,(同上)。

2:利用matlab自带的princomp函数直接求得其特征向量,新坐标下的数据,特征根(并且已经排列好了)。

3:选择恰当的前几项主成分与标准化后的数据相乘。得到在新坐标下的数据。

4:如方法一,利用特征根算贡献率。

代码如下:

X=load('shuju.txt')

x=zscore(X)                       %标准化

[coef,score,eig,t]=princomp(x);   %利用princomp处理矩阵

t                                 %每一组数据在新坐标下到原点的距离

s=0;

i=1;

while s/sum(eig)<0.85

    s=s+eig(i);

    i=i+1;

end                              %获得累计贡献率大于85%几组数据

NEW=x*coef(:,1:i-1)              %输出新的数据

figure

pareto(eig/sum(eig));          %输出贡献率直方图

figure(2)

plot(eig,'r+');

hold on

plot(eig,'b-');


二:令我纠结的一些东西

1:归一化、均值化、标准化、白化

  归一化:将数据归结到某两个数之间。

计算公式:y = (ymax - ymin)*(x - xmin)/(xmax - xmin) + ymin

Matlab实现方法:利用mapminmax函数,具体格式为[y,ps] = mapminmax(x,ymin,ymax)(矩阵中以行来归一化)。

均值化:将数据中的每一个数除以其相应指标的平均值(数据矩阵中由于一般每一列描述一个特征,matlab处理时要按列处理)(这种方法可以说修正了常用的标准化会浪费部分数据的情况,可以替代标准化对数据进行预处理)。

标准化:使数据均值为0方差为1,即将每一个数据减去所在列的均值后对数据矩阵每一列除以其对应的方差。

Matlab实现方法:使用zscore函数。

主成分分析中,原始数据的单位不同,需要使用一种数据处理方法使其转换为无量纲数,归一化与标准化都有消除量刚的作用,但是,主成分分析根据方差来建立新坐标系的,所以归一化矩阵可能不适用于PCA中,所以,基本上主成分分析在数据预处理上都用的是标准化,但是,标准化矩阵本身会损失一部分信息,而均值化不会损失信息,均值化可以更好的改进PCA算法(网上找到的一篇论文中说到的)。

白化:白化通常为独立成分分析中的数据处理方式,其与PCA处理方式基本一致,个人理解ICA就是对PCA数据作的进一步处理,找到其中相互独立的部分。

2:princomp函数与eig函数的不同

  在开始我一直以为利用princomp函数与eig函数产生的特征向量只有顺序有所不同,但是我发现,即使是同一组数据,其产生的特征向量也有所不同,表现为某几个数据正负号不同,具体如下:

原始数据:

关于主成分分析matlab代码实现的总结

使用eig函数的得到的特征向量:

关于主成分分析matlab代码实现的总结
使用princomp函数的特征向量:

关于主成分分析matlab代码实现的总结

可以看出,不仅是列的位置有所不同,某些数据的正负情况也有所不同,这也是我的一个疑惑:相同数据的特征向量为什么会有正负号的偏差?为保险起见,我觉得matlab自带的princomp函数可能更准确。

 

3:PCA与ICA的异同

几何意义上:PCA是在找寻保留最大信息的方向,而ICA是在找寻各个独立的分量,也就是说PCA的第一主成分贡献率永远最大并且贡献率主成分次数增高逐渐降低,而ICA并没有,他只是将原有的信号解混,并不考虑信息量的大小。

处理方式上:处理ICA时要先用PCA做白化处理,因为PCA协方差矩阵为对角阵,其必不相关,独立必不相关,所以通过PCA使数据之间没有相关性,之后再进行迭代操作,求出相互独立的分量。


  • 37
    点赞
  • 278
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
PCA(Principal Component Analysis,主成分分析)是一种常用的降维技术,可以通过线性变换将高维数据映射到低维空间中。在MATLAB中,可以使用以下步骤进行PCA主成分分析: 1. 计算数据的协方差矩阵:使用`cov`函数计算数据矩阵的协方差矩阵。假设数据矩阵为X,其中每一行代表一个样本,每一列代表一个特征,则协方差矩阵C可以通过以下代码获得: ``` C = cov(X); ``` 2. 计算协方差矩阵的特征值和特征向量:使用`eig`函数计算协方差矩阵的特征值和特征向量。特征向量对应于主成分,特征值表示了数据在该主成分上的方差贡献。可以通过以下代码获得: ``` [V, D] = eig(C); ``` 其中V是特征向量矩阵,D是对角矩阵,对角线元素为特征值。 3. 选择主成分:根据特征值的大小,选择前k个主成分来实现降维。k通常根据特征值的累计贡献率来确定。例如,如果累计贡献率达到90%,则选择特征值最大的前k个主成分。可以使用以下代码获得前k个主成分: ``` k = find(cumsum(diag(D)) / sum(diag(D)) >= 0.9, 1); P = V(:, end-k+1:end); ``` 其中P是选取的主成分矩阵。 4. 数据降维:将原始数据矩阵X乘以主成分矩阵P,可以得到降维后的数据矩阵Y。 ``` Y = X * P; ``` 此时Y的每一行代表一个样本在选取的主成分上的投影。 以上是PCA主成分分析MATLAB中的一般步骤,具体应用中可以根据需要进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值