主成分分析教程-将R代码转换为Matlab问题
我试图通过在线查找实际例子来理解PCA。遗憾的是,我发现的大多数教程似乎并没有真正展示PCA的简单实用应用。经过多次搜索,我发现了这个 这是一个很好的简单教程。我想在Matlab中重新创建结果,但教程是R。我一直试图在Matlab中复制结果,但到目前为止都没有成功;我对Matlab是新手。我创建了如下阵列:主成分分析教程-将R代码转换为Matlab问题,r,matlab,pca,R,Matlab,Pca,我试图通过在线查找实际例子来理解PCA。遗憾的是,我发现的大多数教程似乎并没有真正展示PCA的简单实用应用。经过多次搜索,我发现了这个 这是一个很好的简单教程。我想在Matlab中重新创建结果,但教程是R。我一直试图在Matlab中复制结果,但到目前为止都没有成功;我对Matlab是新手。我创建了如下阵列: Price = [6,7,6,5,7,6,5,6,3,1,2,5,2,3,1,2]; Software = [5,3,4,7,7,4,7,5,5,3,6,7,4,5,6,3]; Aesth
Price = [6,7,6,5,7,6,5,6,3,1,2,5,2,3,1,2];
Software = [5,3,4,7,7,4,7,5,5,3,6,7,4,5,6,3];
Aesthetics = [3,2,4,1,5,2,2,4,6,7,6,7,5,6,5,7];
Brand = [4,2,5,3,5,3,1,4,7,5,7,6,6,5,5,7];
然后在他的例子中,他做到了这一点
data <- data.frame(Price, Software, Aesthetics, Brand)
现在这是我不确定的下一部分
pca <- princomp(data, cor=TRUE)
summary(pca, loadings=TRUE)
但我的结果与教程中显示的结果完全不匹配。我的结果是
COEFF =
-0.5958 0.3786 0.7065 -0.0511
-0.1085 0.8343 -0.5402 -0.0210
0.6053 0.2675 0.3179 -0.6789
0.5166 0.2985 0.3287 0.7321
SCORE =
-2.3362 0.0276 0.6113 0.4237
-4.3534 -2.1268 1.4228 -0.3707
-1.1057 -0.2406 1.7981 0.4979
-3.6847 0.4840 -2.1400 1.0586
-1.4218 2.9083 1.2020 -0.2952
-3.3495 -1.3726 0.5049 0.3916
-4.1126 0.1546 -2.4795 -1.0846
-1.7309 0.2951 0.9293 -0.2552
2.8169 0.5898 0.4318 0.7366
3.7976 -2.1655 -0.2402 -1.2622
3.3041 1.0454 -0.8148 0.7667
1.4969 2.9845 0.7537 -0.8187
2.3993 -1.1891 -0.3811 0.7556
1.7836 -0.0072 -0.2255 -0.7276
2.2613 -0.1977 -2.4966 0.0326
4.2350 -1.1899 1.1236 0.1509
LATENT =
9.3241
2.2117
1.8727
0.5124
然而,本教程中的结果是
Importance of components:
Comp.1 Comp.2 Comp.3 Comp.4
Standard deviation 1.5589391 0.9804092 0.6816673 0.37925777
Proportion of Variance 0.6075727 0.2403006 0.1161676 0.03595911
Cumulative Proportion 0.6075727 0.8478733 0.9640409 1.00000000
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Price -0.523 0.848
Software -0.177 0.977 -0.120
Aesthetics 0.597 0.134 0.295 -0.734
Brand 0.583 0.167 0.423 0.674
有谁能解释一下为什么我的结果与教程有这么大的不同。我是否使用了错误的Matlab函数
此外,如果你能够提供任何其他良好的简单实用的PCA应用程序,将是非常有益的。我仍然在努力了解PCA中的所有概念,我喜欢自己编写代码并查看结果的例子,这样我就可以玩它了,我发现用这种方式学习更容易
任何帮助都将不胜感激 编辑:问题纯粹在于缩放 R代码:
summary(princomp(data, cor = FALSE), loadings=T, cutoff = 0.01)
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Price -0.596 -0.379 0.706 -0.051
Software -0.109 -0.834 -0.540 -0.021
Aesthetics 0.605 -0.268 0.318 -0.679
Brand 0.517 -0.298 0.329 0.732
根据,如果要缩放,应使用以下选项:
Matlab代码:
princomp(zscore(X))
旧答案(一条红鲱鱼): 从
帮助(princomp)
(在R中):
利用相关或协方差的特征值进行计算
矩阵,由cor确定。这是为了与
S+结果。首选的计算方法是在x上使用svd,
正如在prcomp中所做的那样
请注意,默认计算使用因子N作为协方差
矩阵
在R功能prcomp
(帮助(prcomp)
)的文档中,您可以阅读:
计算是通过对模型进行奇异值分解来完成的
(居中且可能缩放)数据矩阵,而不是通过在
协方差矩阵。这通常是首选的测试方法
数值精度。[…]与princomp不同,方差是使用
通常的除数N-1
Matlab函数显然使用了svd算法。如果我将prcom
(无缩放,即不基于相关性)与我获得的示例数据一起使用:
> prcomp(data)
Standard deviations:
[1] 3.0535362 1.4871803 1.3684570 0.7158006
Rotation:
PC1 PC2 PC3 PC4
Price -0.5957661 0.3786184 -0.7064672 0.05113761
Software -0.1085472 0.8342628 0.5401678 0.02101742
Aesthetics 0.6053008 0.2675111 -0.3179391 0.67894297
Brand 0.5166152 0.2984819 -0.3286908 -0.73210631
这(从不相关的符号中可以看出)与Matlab输出相同。如果您是Matlab新手,为什么不直接使用R?;)刚开始攻读博士学位,似乎大多数学生都在使用Matlab,我下面的大多数例子都是在Matlab中。另外,我将在Matlab中提供与我的博士学位相关的其他示例代码,因此我宁愿坚持使用Matlab,因为我在Matlab中似乎没有该函数prcomp。我需要下载工具箱才能使用该功能吗?@AdamM我错了。问题是你没有在你的Matlab代码中进行缩放。谢谢你的代码。您能解释一下为什么在R代码中,他的加载示例中缺少一些结果吗?如果你看R代码结果中的PC2,它缺少一个结果,与PC4一样,它缺少前2个结果?他是如何得到累积比例的?我希望能够得到与他的结果相同的结果,因此我可以在MatlabWell中绘制图形。请查看
summary.princomp
中的cutoff
参数和打印函数的代码:getAnywhere(print.summary.princomp)
princomp(zscore(X))
> prcomp(data)
Standard deviations:
[1] 3.0535362 1.4871803 1.3684570 0.7158006
Rotation:
PC1 PC2 PC3 PC4
Price -0.5957661 0.3786184 -0.7064672 0.05113761
Software -0.1085472 0.8342628 0.5401678 0.02101742
Aesthetics 0.6053008 0.2675111 -0.3179391 0.67894297
Brand 0.5166152 0.2984819 -0.3286908 -0.73210631