我正在(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的特征向量相比它们却不同?他们最终被规范化了吗?
预先感谢您对此事的详细说明。
答案 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
上许多受到高度评价的帖子会更好地为您服务。
有用的相关问题: