MATLAB中的主成分分析?

我有一个训练集,大小为size(X_Training)=122 x 125937

  • 122是特征的数量
  • 125937是样本的数量。

根据我的初步理解,PCA在你想要减少特征维度时非常有用。这意味着,我应该将122减少到一个更小的数字。

但当我在MATLAB中使用:

X_new = pca(X_Training)

我得到一个大小为125973x121的矩阵,我真的很困惑,因为这不仅改变了特征,还改变了样本大小?这对我来说是个大问题,因为我还有一个目标向量Y_Training,我想用它来训练我的神经网络。

有什么帮助吗?我是否严重误解了结果?我只想减少特征的数量。


回答:

首先,PCA函数的文档很有用:https://www.mathworks.com/help/stats/pca.html。文档中提到行是样本列是特征。这意味着你需要先转置你的矩阵。

其次,你需要提前指定要减少到的维数。PCA函数不会自动为你做这件事。因此,除了提取每个成分的主成分系数外,你还需要提取分数。一旦你有了这些,你只需选择分数并进行重投影到减少的空间中。

换句话说:

n_components = 10; % 按需调整[coeff, score] = pca(X_training.');X_reduce = score(:, 1:n_components);

X_reduce将是降维后的特征集,列的总数是减少后的特征总数。还要注意的是,训练样本的数量没有改变,正如我们所期望的。如果你想确保在减少特征数量后特征沿着行而不是列排列,在继续之前也需要转置这个输出矩阵。

最后,如果你想自动确定要减少到的特征数量,一种方法是计算每个特征的解释方差,然后从第一个特征开始累积值,直到超过某个阈值。通常使用95%作为阈值。

因此,你需要提供额外的输出变量来捕获这些信息:

[coeff, score, latent, tsquared, explained, mu] = pca(X_training.');

我会让你自己去阅读文档来理解其他变量,但你关注的是explained变量。你应该做的是找到总解释方差超过95%的点:

[~,n_components] = max(cumsum(explained) >= 95);

最后,如果你想执行重构,并查看从减少的特征到原始特征空间的重构效果,你需要进行重投影到原始空间:

X_reconstruct = bsxfun(@plus, score(:, 1:n_components) * coeff(:, 1:n_components).', mu);

mu是每个特征的均值作为行向量。因此,你需要在所有示例中添加这个向量,所以需要广播,这就是为什么使用bsxfun。如果你使用的是MATLAB R2018b,现在当你使用加法操作时,这将被隐式完成。

X_reconstruct = score(:, 1:n_components) * coeff(:, 1:n_components).' + mu;

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

MATLAB中的主成分分析

我正在使用特征值分解对稀疏数据实现PCA。我知道MATLAB已经实现了PCA,但当我自己编写代码时,这有助于我理解所有的技术细节。我一直在按照这里的指导进行操作,但与内置函数princomp相比,我得到了不同的结果。

能否有人查看一下并指导我正确的方向?

这是我的代码:

function [mu, Ev, Val ] = pca(data)% mu - 均值图像% Ev - 其列为对应于特征值Val的特征向量的矩阵% Val - 特征值if nargin ~= 1 error ('usage: [mu,E,Values] = pca_q1(data)');endmu = mean(data)';nimages = size(data,2);for i = 1:nimages data(:,i) = data(:,i)-mu(i);endL = data'*data;[Ev, Vals]  = eig(L);    [Ev,Vals] = sort(Ev,Vals);% 计算真实协方差矩阵的特征向量Ev = data * Ev;Val = diag(Vals);Vals = Vals / (nimages - 1);% 将Ev标准化为单位长度proper = 0;for i = 1:nimages Ev(:,i) = Ev(:,1)/norm(Ev(:,i)); if Vals(i) < 0.00001  Ev(:,i) = zeros(size(Ev,1),1); else  proper = proper+1; end;end;Ev = Ev(:,1:nimages);

回答:

这是我会做的方法:

function [V newX D] = myPCA(X)    X = bsxfun(@minus, X, mean(X,1));           %# 零中心化    C = (X'*X)./(size(X,1)-1);                  %# cov(X)    [V D] = eig(C);    [D order] = sort(diag(D), 'descend');       %# 按从高到低排序列    V = V(:,order);    newX = X*V(:,1:end);end

以及一个与统计工具箱中的PRINCOMP函数进行比较的示例:

load fisheriris[V newX D] = myPCA(meas);[PC newData Var] = princomp(meas);

你可能还对这个相关的帖子感兴趣,关于通过SVD进行PCA

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注