Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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/4/matlab/14.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
主成分分析教程-将R代码转换为Matlab问题_R_Matlab_Pca - Fatal编程技术网

主成分分析教程-将R代码转换为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

我试图通过在线查找实际例子来理解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];
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