PCA算法

主成分分析的实现步骤如下:

1.输入样本矩阵

       假设样本x1,x2,...,xN,共N个样本,每个样本以列向量的形式表示,每个样本有M维。

X=[xx... xN]MxN。

2.计算样本中每一维的均值,然后计算观察值与均值之间的偏差,再计算协方差矩阵

    根据协方差函数

首先要求出每一维的均值,然后再计算观察值与均值之间的偏差,再计算协方差矩阵

3.计算协方差矩阵的特征值和特征向量矩阵

    根据协方差矩阵就可以求出特征值和特征向量,然后给特征值进行降序排序,相应的

特征向量也要按照特征值的排序做出相应的调整,这样主要是为下一步的提取少量的特征

值做准备。

4.计算总能量,并选取贡献率最大的特征值

      总能量的计算就是全部的特征值之和,而贡献率就是用前p个特征值去除以全部特征值

之和,如果前p个特征值之和占全部特征值之和的90%以上,就提取前p个特征值和前p个特

征值所对应的特征向量,这样就减少了维数。

5.计算前p个特征值所对应的的特征向量组成的矩阵,计算降维后的样本矩阵

   根据上一步得到的新的特征向量,用原始的协方差矩阵去乘以此新的特征向量组成的新矩阵,

就可以得到降维后的样本矩阵

%%%%%%%%%%%%打开一个30行8列数据的txt文件%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%第一步:输入样本矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
filename='src.txt';
fid=fopen(filename,'r');
vector=fscanf(fid,'%g',[30,8]);%输入一个矩阵,此矩阵有8个维度30个样本
%现对其进行pca降维
%%
%第二步:计算样本中每一维的均值,然后计算观察值与均值之间的偏差,再计算协方差矩阵
s=sum(vector,1);%计算每一列的均值
[nSmp,nFea] = size(vector);
vector=vector-repmat(mean(vector),nSmp,1);%把每一维的均值复制成nSmp*nFea矩阵,然后计算偏差
W=zeros(nFea,nFea);%建立一个nFea*nFea的零矩阵
W=W+vector'*vector;
W=W/(nSmp-1);%根据协方差公式计算协方差,得到协方差矩阵W
%%
%第三步:计算协方差矩阵的特征值和特征向量矩阵
fprintf(1,'Calculating generalized eigenvectors and eigenvalues...\n');
[eigvectors, eigvalues] = eig(W);%eigvectors为特征向量组成的矩阵,eigvalues特征值组成的对角矩阵
fprintf(1,'Sorting eigenvectors according to eigenvalues...\n');
d1=diag(eigvalues);%返回对角矩阵上的值
[d2 index]=sort(d1); %以升序排序,d2为排列后的值,index为索引值
cols=size(eigvectors,2);% 特征向量矩阵的列数
for i=1:cols
vsort(:,i) = eigvectors(:, index(cols-i+1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量
dsort(i) = d1( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量
end %完成降序排列
%%
%第四步:计算总能量,并选取贡献率最大的特征值
dsum = sum(dsort);%对所有的特征值求和
dsum_extract = 0;%求前几个特征值之和,当前几个特征值之和大于90%时,可以认为这几个特征值可以表征当前矩阵
p = 0;
while( dsum_extract/dsum < 0.9)
p = p + 1;
dsum_extract = sum(dsort(1:p));
end
%当p=5时,贡献率为0.9095,所以就可以选取5个特征值代表当前矩阵
%%
%第五步:计算前p个特征值所对应的的特征向量组成的矩阵,计算降维后的样本矩阵
vsort = vsort(:,1:p);%提取前p个特征生成8*p矩阵
fprintf(1,'Feature extraction and calculating newData...\n');
newvector=vector*vsort;%生成nSmp行p列的矩阵,达到降维的效果

### PCA算法原理 主成分分析(PCA)是一种常用的统计方法,用于降维和数据可视化。其核心思想是通过线性变换将原始数据转换到一个新的坐标系中,使得数据在第一个坐标轴上的方差最大,第二个坐标轴上的方差次之,依此类推。这样,可以通过保留前几个主成分来减少数据的维度,同时尽可能多地保留原始数据的信息。 PCA 的主要步骤如下: 1. **标准化数据**:由于 PCA 对数据的尺度敏感,因此通常需要先对数据进行标准化处理。 2. **计算协方差矩阵**:协方差矩阵反映了数据各维度之间的相关性。 3. **计算协方差矩阵的特征值和特征向量**:特征值表示每个主成分的重要性,特征向量则定义了新的坐标系的方向。 4. **选择主成分**:根据特征值的大小选择最重要的几个主成分。 5. **投影数据**:将原始数据投影到由选定的主成分构成的新空间中[^2]。 ### PCA算法的实现方法 #### 方法一:使用Matlab实现PCA 在 Matlab 中,可以使用 `pca` 函数来实现 PCA。以下是一个简单的示例代码: ```matlab % 生成随机数据 X = randn(100, 10); % 100个样本,每个样本有10个特征 % 进行PCA分析 [coeff, score, latent] = pca(X); % 显示结果 disp('主成分系数:'); disp(coeff); disp('主成分得分:'); disp(score); disp('特征值:'); disp(latent); ``` #### 方法二:使用Python实现PCA 在 Python 中,可以使用 `sklearn.decomposition.PCA` 来实现 PCA。以下是一个简单的示例代码: ```python from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler import numpy as np # 生成随机数据 X = np.random.randn(100, 10) # 100个样本,每个样本有10个特征 # 标准化数据 X_std = StandardScaler().fit_transform(X) # 进行PCA分析 pca = PCA(n_components=2) Y_pca = pca.fit_transform(X_std) # 显示结果 print("主成分方差解释比例:", pca.explained_variance_ratio_) print("降维后的数据:", Y_pca) ``` #### 方法三:手动实现PCA 手动实现 PCA 的过程包括计算协方差矩阵、特征值和特征向量等步骤。以下是一个简单的示例代码: ```python import numpy as np # 生成随机数据 X = np.random.randn(100, 10) # 100个样本,每个样本有10个特征 # 标准化数据 X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # 计算协方差矩阵 cov_matrix = np.cov(X_std, rowvar=False) # 计算特征值和特征向量 eigen_values, eigen_vectors = np.linalg.eig(cov_matrix) # 选择前两个主成分 projection_matrix = eigen_vectors[:, :2] X_pca = X_std.dot(projection_matrix) # 显示结果 print("降维后的数据:", X_pca) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值