pyspark SVD特征向量与PCA特征向量之间的区别是什么?

时间:2019-05-06 19:50:49

标签: pyspark pca svd

我正在(pyspark)mllib(Spark 2.2.0)中使用SVD和PCA功能,如以下链接中所述:https://spark.apache.org/docs/2.2.0/mllib-dimensionality-reduction.html

假设我们得到以下数据对象:

[(2, 2), (3, 1), (2, 2), (1, 3), (1.0, 1.0), (3.0, 3.0)]

应用computeSVD()函数将产生:

对于U: [DenseVector([-0.3922, -0.0]), DenseVector([-0.3922, -0.7071]), DenseVector([-0.3922, -0.0]), DenseVector([-0.3922, 0.7071]), DenseVector([-0.1961, -0.0]), DenseVector([-0.5883, -0.0])]

和局部稠密矩阵V:

[[-0.70710678 -0.70710678]
 [-0.70710678  0.70710678]]

此时的问题是:火花中的特征向量实际上是什么?他们是U还是V?

现在与应用computePrincipalComponents()的对比: 这样会产生:

DenseMatrix([[1., 0.],
            [0., 1.]])

根据spark文档说明:“主成分存储在局部密集矩阵中”。因此,PCA的结果应该产生特征向量,但是为什么与SVD的局部密集矩阵V的特征向量相比它们却不同?他们最终被规范化了吗?

预先感谢您对此事的详细说明。

1 个答案:

答案 0 :(得分:1)

对数据集执行V所得的特征向量(密集矩阵computeSVD())表示向量[2x2矩阵],它是数据集线性分解的标量倍数。

SVD找到使数据解释的方差最大化的身份矢量,而PCA试图找到一组充当轴的正交矢量(跨越任意{ {1}}个功能部件),可以在两个维度上对您的数据进行建模(由一组轴决定,这些轴导致由N解释的最大方差量)。

这就是为什么您的SVD输出身份矢量的原因:

SVD

然后[[-0.70710678 -0.70710678] [-0.70710678 0.70710678]] 产生以下向量computePrincipalComponents()[1,0],它们恰好与自然出现的X和Y轴重合。

关于[0,1]及其与SVD之间的关系的文献很多,以及由于四舍五入的不准确性,为什么PCA是用于保持数据完整性的更稳定的解决方案,通过其转置矩阵(X *X⊤​​)计算数据集的乘积的结果,但是下面列出的SVD上许多受到高度评价的帖子会更好地为您服务。

有用的相关问题: