本文来自CSDN 博客 ,全文地址请点击:https://blog.csdn.net/a1154761720/article/details/50721452?utm_source=copy

通常对于高维数据需要进行降维,matlab中有pca进行数据分析,进行主成份分析:principal component analysis。
matlab调用PCA的方式如下:

XMean = mean(X);%X每行是一个实例,每列代表一个属性
X = bsxfun(@minus,X,XMean);%去中心
[eigenVectors,scores,eigenValues] = pca(X);
transMatrix = eigenVectors(:,1:K);
X = X*transMatrix;

第一步是对求训练集数据的均值;X代表原始的数据矩阵,是一个N*d的矩阵,N代表样本个数,d代表特征的原始维数;
第二步是对训练集去中心化;
第三步是pca分析:eigenVectors是一个d*d的矩阵,每列代表对应特征值的特征向量,scores是N*d的矩阵,eigenValues是对应的特征值向量,与eigenVectors的列相对应。
第四步取特征向量矩阵的前K列作为变换矩阵
第五步是对数据进行变化,降维。
**如果数据既有训练集又有测试集,一般先对训练集进行PCA降维,得到相应的transMatrix;
然后在测试集上减去训练样本的均值trainMean,然后乘以变换矩阵得到对应的降维后的测试集;**
代码如下:

    XMean = mean(X);%训练样本中心点
    X = bsxfun(@minus,X,XMean);%训练样本减去训练样本中心点
    transMatrix = eigenVectors(:,1:K);
    X = X*transMatrix;%训练集降维后的数据
    X_ = bsxfun(@minus,X_,XMean);%测试样本减去训练样本中心点
    X_ = X_*transMatrix;%测试样本降维后的结果

K的值与选取的子空间最后能多大程度表示原空间有关,它的计算方式为:
sum(eigenValues(1:K))/sum(eigenValues);
一般情况下这个值要大于95%较为合理。

另:
通常如果数据集很大我们需要降维的情况下,一次性读入所有的训练集可能导致内存溢出的问题,此时是否就不能用PCA对数据进行分析呢?并不是这样,如果我们自己实现PCA会发现每次将一个个的样本读入内存也可以完成PCA对整个数据集的分析,下面主要讲这个流程:
1)计算所有样本的均值:这个过程可以通过逐步加和实现,所以每次读入一个样本是没有问题的;
2)计算协方差矩阵,这个也可以通过每个样本加和实现,所以也可以读入一个样本;
3)对协方差矩阵进行奇异值分解;
4)根据特征向量求变换矩阵;
5)对每个样本根据变换矩阵求得变换后的结果

10-07 15:50