2017-11-10 11 views
1

私はPySparkでk-means法がどのように機能するかを理解したいと思います。このため が、私はこの小さな例やった:一見Pysparkでkmeansを使用して予測されたクラスタを元の観測で正しくラベル付けするにはどうすればよいですか?

In [120]: entry = [ [1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5],[5,5,5],[5,5,5],[1,1,1],[5,5,5]] 

In [121]: rdd_entry = sc.parallelize(entry) 

In [122]: clusters = KMeans.train(rdd_entry, k=5, maxIterations=10, initializationMode="random") 

In [123]: rdd_labels = clusters.predict(rdd_entry) 

In [125]: rdd_labels.collect() 
Out[125]: [3, 1, 0, 0, 2, 2, 2, 3, 2] 

In [126]: entry 
Out[126]: 
[[1, 1, 1], 
[2, 2, 2], 
[3, 3, 3], 
[4, 4, 4], 
[5, 5, 5], 
[5, 5, 5], 
[5, 5, 5], 
[1, 1, 1], 
[5, 5, 5]] 

をrdd_labelsは、元のRDDの順序を尊重し、各観測が属するクラスタを返すようです。この例では明らかですが、800万回の観測で作業する場合、どのように確認できますか?

また、rdd_entryとrdd_labelsに参加して、その順序を尊重して、rdd_entryの各観測がクラスターで正しくラベル付けされるようにする方法を知りたいと思います。 は私が)(.joinを実行しようとしましたが、それは誤り

In [127]: rdd_total = rdd_entry.join(rdd_labels) 

In [128]: rdd_total.collect() 

TypeError: 'int' object has no attribute '__getitem__' 
+1

あなたは 'pyspark.mllib'(まもなく廃止されるために)を使用するように閉じ込められている、またはあなたはおそらく解決策のようにベースの思い'pyspark.ml'(すなわち、好ましい、データフレームベースのAPI)? – desertnaut

答えて

0

はそれが役に立てば幸いジャンプ! (この溶液をpyspark.mlに基づいています)

from pyspark.ml.clustering import KMeans 
from pyspark.ml.feature import VectorAssembler 

#sample data 
df = sc.parallelize([[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5],[5,5,5],[5,5,5],[1,1,1],[5,5,5]]).\ 
    toDF(('col1','col2','col3')) 

vecAssembler = VectorAssembler(inputCols=df.columns, outputCol="features") 
vector_df = vecAssembler.transform(df) 

#kmeans clustering 
kmeans=KMeans(k=3, seed=1) 
model=kmeans.fit(vector_df) 
predictions=model.transform(vector_df) 
predictions.show() 

出力は次のとおりです。

+----+----+----+-------------+----------+ 
|col1|col2|col3|  features|prediction| 
+----+----+----+-------------+----------+ 
| 1| 1| 1|[1.0,1.0,1.0]|   0| 
| 2| 2| 2|[2.0,2.0,2.0]|   0| 
| 3| 3| 3|[3.0,3.0,3.0]|   2| 
| 4| 4| 4|[4.0,4.0,4.0]|   1| 
| 5| 5| 5|[5.0,5.0,5.0]|   1| 
| 5| 5| 5|[5.0,5.0,5.0]|   1| 
| 5| 5| 5|[5.0,5.0,5.0]|   1| 
| 1| 1| 1|[1.0,1.0,1.0]|   0| 
| 5| 5| 5|[5.0,5.0,5.0]|   1| 
+----+----+----+-------------+----------+ 
+1

@CarmenPérezCarrilloおそらくあなたはあなたの問題を解決するのに役立つなら、あなたは[答えを受け入れる](https://stackoverflow.com/help/someone-answers)すべきです。 – Prem

+0

申し訳ありませんが、私は今までそれを証明できませんでした。私はちょうどやって、それは動作します。ありがとうございました :) –

関連する問題