【发布时间】:2018-05-26 00:34:05
【问题描述】:
我正在 Spark ML 中尝试 PCA(主成分分析)。
data = [(Vectors.dense([1.0, 1.0]),),
(Vectors.dense([1.0, 2.0]),),
(Vectors.dense([4.0, 4.0]),),
(Vectors.dense([5.0, 4.0]),)]
df = spark.createDataFrame(data, ["features"])
pca = PCA(k=1, inputCol="features", outputCol="pcaFeatures")
model = pca.fit(df)
transformed_feature = model.transform(df)
transformed_feature.show()
输出:
+---------+--------------------+
| features| pcaFeatures|
+---------+--------------------+
|[1.0,1.0]|[-1.3949716649258...|
|[1.0,2.0]|[-1.976209858644928]|
|[4.0,4.0]|[-5.579886659703326]|
|[5.0,4.0]|[-6.393620130910061]|
+---------+--------------------+
当我在 scikit-learn 中对相同数据尝试 PCA 时,结果不同
X = np.array([[1.0, 1.0], [1.0, 2.0], [4.0, 4.0], [5.0, 4.0]])
pca = PCA(n_components=1)
pca.fit(X)
X_transformed = pca.transform(X)
for x,y in zip(X ,X_transformed):
print(x,y)
输出:
[ 1. 1.] [-2.44120041]
[ 1. 2.] [-1.85996222]
[ 4. 4.] [ 1.74371458]
[ 5. 4.] [ 2.55744805]
如您所见,输出有所不同。
为了验证结果,我用数学方法计算了相同数据的 PCA。我从 scikit-learn 得到了相同的结果。以下 sn-p 是第一个数据点 (1.0,1.0) 的 pca 转换计算:
如您所见,它与 scikit 学习结果相匹配。
spark ML 似乎没有从数据向量 X 中减去平均向量 MX,即它使用 Y = A*(X) 代替 Y = A*(X-MX)。
对于点 (1.0,1.0):
Y = (0.814*1.0)+(0.581*1.0)) = 1.395
这与我们使用 spark ML 得到的结果相同。
是 Spark ML 给出了错误的结果还是我遗漏了什么?
【问题讨论】:
-
为什么不尝试特征的均值减法,甚至在 PCA 之前标准化你的特征,然后进行比较?
-
我稍微更新了答案,希望对你有用。
标签: python apache-spark pyspark pca apache-spark-ml