PCA 回归算法matlab实现

先附代码pca回归 

 

close all
clear
clc;                           %素质3连
format short
pzz = xlsread('7000sgfb','A1:DZ5549');  %读取文件
data = pzz';
n=randperm(130);%随机130个样本
%%%——————%%%
y_test = data(n(98:130),1);   %随机选取33个测试样本
x_test = data(n(98:130),2:end);
y_train = data(n(1:97),1);
x_train = data(n(1:97),2:end);
%%%——————%%%
%主成分分析Pca,降成m维变量,提取95%以上的有效信息
    swum =0;
    m=0;
    [coeff,score,latent,tsquared,explained]= princomp(data(1:97,2:end));
    for ii = 1 : length(latent)
    swum = latent(ii) + swum;
    if swum/sum(latent) >= 0.95
        m = ii;
        break;
    end
    end
    
    %————%降成m维后的回归分析
    x = [ones(97,1) score(:,1:m)];
    [b,brint,r] =regress(y_train,x);
    x_test=(x_test - mean(x_train))*coeff(:,1:m);
    y_fit = [ones(33,1),x_test]*b;
    A(:,1) = y_test;
    A(:,2) =y_fit;
  
    A(:,3) =  abs(y_fit - y_test);
    pp = corr(A);  %计算出相关系数
    sss=pp(2,1)

小白在学习,今天对PCA(主成分分析法)回归学习了一下,

分为两步:

0:pca实现

1:回归分析

第零部分:

背景介绍

PCA原理·:书上和网上介绍PCA的方法多了去了,因此,本篇博文不再赘述,一句话:PCA算法主用于降维,将样本数据从高维空间投影到低维空间中,在低维空间中表示数据。

 

PCA实现:为了便于理解,本文先用手动的方法实现一遍matlab,再说下matlab里面自带的函数pca

而我们自己实现PCA算法的过程:用一句话来说就是 将所有样本X减去样本均值m,再乘以样本的协方差矩阵C的特征向量V,即为PCA主成分分析

其计算过程如下:
    [1].将原始数据按行组成m行n列样本矩阵X(每行一个样本,每列为一维特征)
    [2].求出样本X的协方差矩阵C和样本均值m;(Matlab可使用cov()函数求样本的协方差矩阵C,均值用mean函数)
    [3].求出协方差矩阵的特征值D及对应的特征向量V;(Matlab可使用eigs()函数求矩阵的特征值D和特征向量V)
    [4].将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;(eigs()返回特征值构成的向量本身就是从大到小排序的)
    [5].Y=(X-m)×P即为降维到k维后的数据;
    PS:关于协方差矩阵,有些教程用协方差矩阵,而有些资料是用散步矩阵计算,其实协方差矩阵和散步矩阵就是一个倍数关系:协方差矩阵C×(n-1)=散步矩阵S。我们可以使用Matlab工具箱的cov函数求协方差矩阵C。
 

 %% 自己实现PCA的方法
[Row Col]=size(X);
covX=cov(X);                                    %求样本的协方差矩阵(散步矩阵(就是X'X)除以(n-1)即为协方差矩阵)
[V D]=eigs(covX);                               %求协方差矩阵的特征值D和特征向量V
meanX=mean(X);                                  %样本均值m
%所有样本X减去样本均值m,再乘以协方差矩阵(散步矩阵)的特征向量V,即为样本的主成份SCORE
tempX= repmat(meanX,Row,1);                     %rempat函数是复制函数
SCORE2=(X-tempX)*V                              %主成份:SCORE
pcaData2=SCORE2(:,1:k)

 [coeff score latent ] = pca(X)

1)COEFF = PCA(X) returns the principal component coefficients for the N
    %   by P data matrix X. Rows of X correspond to observations and columns to
    %   variables. Each column of COEFF contains coefficients for one principal
    %   component. The columns are in descending order in terms of component
    %   variance (LATENT).

    翻译过来就是 COEFF 是主成分分量,即样本协方差矩阵的特征向量;每列是特征向量,每行是观测值,根据特征值依次递减

2)score主成分,样本X在coeff上面的投影,=X×coeff   ,若需K维,则取前K列即可

3)laten:即协方差矩阵的特征值组成的向量,一般来说,从大到小排列。

三.

    快速PCA及其实现

PCA计算的最主要的工作量是计算样本协方差矩阵的特征值和特征向量,若样本矩阵X的维度太大,则计算复杂度会很高,当维数为10000时,那么协方差矩阵便为10000*10000, 若再采用pca进行计算,那么计算会很慢,内存耗尽。

此时我们有一个很好的pca技巧可以用来加速:即考虑 X'X的特征值和XX'的特征值相等,所以,我们就可以计算XX'的特征值,然后再求特征向量,具体可参见《精通matlab数字图像处理与识别》张铮编著,第十二章。

以下为源代码:

%% 使用快速PCA算法实现的方法
[pcaData3 COEFF3] = fastPCA(X, k )
    其中fastPCA函数的代码实现如下:
function [pcaA V] = fastPCA( A, k )
% 快速PCA
% 输入:A --- 样本矩阵,每行为一个样本
%      k --- 降维至 k 维
% 输出:pcaA --- 降维后的 k 维样本特征向量组成的矩阵,每行一个样本,列数 k 为降维后的样本特征维数
%      V --- 主成分向量
[r c] = size(A);
% 样本均值
meanVec = mean(A);
% 计算协方差矩阵的转置 covMatT
Z = (A-repmat(meanVec, r, 1));
covMatT = Z * Z';
% 计算 covMatT 的前 k 个本征值和本征向量
[V D] = eigs(covMatT, k);
% 得到协方差矩阵 (covMatT)' 的本征向量
V = Z' * V;
% 本征向量归一化为单位本征向量
for i=1:k
    V(:,i)=V(:,i)/norm(V(:,i));
end
% 线性变换(投影)降维至 k 维
pcaA = Z * V;
% 保存变换矩阵 V 和变换原点 meanVec

 参考文献:

--------------------

1)https://blog.csdn.net/guyuealian/article/details/68487833 

2)《精通matlab数字图像处理与识别》张铮

 

最后附一篇网上下载经典的PCA的总结  可自取  作者不详

链接:https://pan.baidu.com/s/1xO0CAGP8LlyLx1mYuH37RA 
提取码:vl4d 
 

 

展开阅读全文

没有更多推荐了,返回首页