【发布时间】:2017-01-27 19:32:42
【问题描述】:
我有一个包含数百万条记录的数据框,并且我使用了 pyspark ml 。
KMeans to identify clusters ,现在我想找到我使用过的集群数量的内集平方和误差((WSSSE)。
我的 spark 版本是 1.6.0,computeCost 在 pyspark ml 中不可用,直到 spark 2.0.0,所以我必须自己制作。
我已经使用这种方法来查找平方误差,但它需要很长时间才能给我输出。我正在寻找一种更好的方法来查找 WSSSE。
check_error_rdd = clustered_train_df.select(col("C5"),col("prediction"))
c_center = cluster_model.stages[6].clusterCenters()
check_error_rdd = check_error_rdd.rdd
print math.sqrt(check_error_rdd.map(lambda row:(row.C5- c_center[row.prediction])**2).reduce(lambda x,y: x+y) )
clustered_train_df 是我在拟合 ML PIPELINE 后的原始训练数据,C5 是 KMeans 中的 featuresCol。
check_error_rdd 如下所示:
check_error_rdd.take(2)
Out[13]:
[Row(C5=SparseVector(18046, {2398: 1.0, 17923: 1.0, 18041: 1.0, 18045: 0.19}), prediction=0),
Row(C5=SparseVector(18046, {1699: 1.0, 17923: 1.0, 18024: 1.0, 18045: 0.91}), prediction=0)]
c_center 是集群中心的列表,其中每个中心都是长度为 18046 的列表:
print len(c_center[1])
18046
【问题讨论】:
-
在我看来,从 1.0 的许多值和稀疏向量中的大量零来看,您的数据主要是指示变量。 KMeans 算法在处理此类数据时会遇到许多问题。一种解决方法是在聚类之前使用主成分分析 (PCA) 或其他一些分解/降维技术。
标签: apache-spark dataframe pyspark distributed-computing k-means