Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab主成分分析(特征值阶数)_Matlab_Linear Algebra_Pca_Eigenvalue - Fatal编程技术网

Matlab主成分分析(特征值阶数)

Matlab主成分分析(特征值阶数),matlab,linear-algebra,pca,eigenvalue,Matlab,Linear Algebra,Pca,Eigenvalue,我想使用Matlab的“princomp”函数,但该函数给出排序数组中的特征值。这样我就无法找出哪个列对应哪个特征值。 对于Matlab m = [1,2,3;4,5,6;7,8,9]; [pc,score,latent] = princomp(m); 与 m = [2,1,3;5,4,6;8,7,9]; [pc,score,latent] = princomp(m); 也就是说,交换前两列不会改变任何东西。潜在的结果(特征值)为:(27,0,0) 信息(哪个特征值对应于哪个原始(输入)列)

我想使用Matlab的“princomp”函数,但该函数给出排序数组中的特征值。这样我就无法找出哪个列对应哪个特征值。 对于Matlab

m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);

m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);
也就是说,交换前两列不会改变任何东西。潜在的结果(特征值)为:(27,0,0) 信息(哪个特征值对应于哪个原始(输入)列)丢失。
有没有办法告诉matlab不要对特征值进行排序?

使用PCA,返回的每个主分量将是原始列/维度的线性组合。也许举个例子可以消除你的误解

让我们考虑Fisher虹膜数据集,包括150个实例和4个维度,并将PCA应用于数据。为了让事情更容易理解,在调用PCA函数之前,我首先将数据归零:

load fisheriris
X = bsxfun(@minus, meas, mean(meas));    %# so that mean(X) is the zero vector

[PC score latent] = princomp(X);
让我们看看第一个返回的主成分(矩阵的第一列):

这表示为原始尺寸的线性组合,即:

PC1 =  0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4
因此,为了在由主分量构成的新坐标系中表示相同的数据,根据上述公式,新的第一维度应该是原始维度的线性组合

我们可以简单地将其计算为
X*PC
,这正是PRINCOMP第二次输出(
score
)中返回的值,以确认此尝试:

>> all(all( abs(X*PC - score) < 1e-10 ))
    1
协方差矩阵
V
的特征向量是主分量(与上面的
PC
相同,尽管符号可以反转),相应的特征值
E
表示解释的方差量(与
潜在的
相同)。请注意,通常按其特征值对主分量进行排序。和以前一样,为了用新坐标表示数据,我们只需计算
X*V
(如果您确保匹配符号,则应与上面的
分数相同)

“信息(哪个特征值对应于哪个原始(输入)列)丢失了。”

由于每个主分量都是所有输入变量的线性函数,因此每个主分量(特征向量、特征值)对应于原始输入列的所有。忽略符号的可能变化(在PCA中是任意的),对输入变量重新排序不会改变PCA结果

“有没有办法告诉matlab不要对特征值进行排序?”

我对此表示怀疑:PCA(以及一般的特征分析)通常按方差对结果进行排序,尽管我注意到princomp()从最大方差排序到最小方差,而eig()则按相反方向排序

有关使用MATLAB插图(带或不带princomp())的PCA的更多说明,请参阅:


这个。。。这不是PCA/特征分解的工作原理。这并不意味着,但是一本教科书可能会比这个社区更好地帮助你,因为特征值对应于特征向量,这给了你一个列/城市的线性组合。它们显示了不同城市之间的相互关系,因为特征值与矩阵的特定行/列不对应。特征向量的分量就是这样做的。我认为你对线性代数有基本的误解。也许可以在这里找到更多的帮助。Thanks@Sunny:-1,请不要这样打架,已经有很多有知识的人建议你,你缺乏基本的线性代数。理顺你的线性代数技能,你会发现“主成分分析”实际上是多么简单。谢谢你为什么把数据集中在平均值上?我尝试了以下方法。。。使用
pca
获取数据的pca,然后尝试使用
data*PC
->重建数据。但是,它与平均居中一起工作。我的问题是,如果MATLAB
pca
确实意味着在内部(从他们的
pca
文档中)对数据进行居中,那么当我们没有明确执行平均居中时,为什么数据重建不起作用?@ParagS.Chandakkar:我可以给出一个示例,但它太长,无法给出评论。你介意提出一个新问题吗?事实上我自己得到了答案。在发表评论之前,我真的应该想一想。谢谢
>> all(all( abs(X*PC - score) < 1e-10 ))
    1
[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);