我有一百万条记录的数据框,我使用了pyspark
ml
。
KMeans识别集群,现在我想找到我所使用的集群数量的内集平方和误差((WSSSE)。
我的火花版本是1.6.0,而computeCost在pyspark ml中不可用,直到火花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
是featuresCol
中的KMeans
。
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
答案 0 :(得分:1)
我计算了cost of k-means prior to version 2.0。
至于"慢" -ness你提到:对于100米点,8192个质心,花了我50分钟来计算成本,64个执行器和202092个分区,8G内存和6个在客户端模式下,每台机器的核心。
引用ref:
computeCost(RDD)
返回K均值成本(平方和 这个模型的点距离到最近的中心 给定数据。
参数:rdd - 计算成本的点的RDD。
新版 1.4.0 。
如果您因为拥有DataFrame而无法使用此功能,请阅读:How to convert a DataFrame back to normal RDD in pyspark?
至于你的方法,我一眼就看不到任何坏事。