8

df2 を kmeans にフィードしようとすると、次のエラーが発生します

clusters = KMeans.train(df2, 10, maxIterations=30,
                        runs=10, initializationMode="random")

私が得るエラー:

Cannot convert type <class 'pyspark.sql.types.Row'> into Vector

df2 は、次のように作成されたデータフレームです。

df = sqlContext.read.json("data/ALS3.json")
df2 = df.select('latitude','longitude')

df2.show()


     latitude|       longitude|

   60.1643075|      24.9460844|
   60.4686748|      22.2774728|

この 2 つの列を Vector に変換して KMeans にフィードするにはどうすればよいですか?

4

2 に答える 2

13

ML

問題は、ドキュメントの exampleを見逃したことであり、メソッドがwith機能をtrain必要とすることは明らかです。DataFrameVector

現在のデータの構造を変更するには、VectorAssemblerを使用できます。あなたの場合、それは次のようなものかもしれません:

from pyspark.sql.functions import *

vectorAssembler = VectorAssembler(inputCols=["latitude", "longitude"],
                                  outputCol="features")

# For your special case that has string instead of doubles you should cast them first.
expr = [col(c).cast("Double").alias(c) 
        for c in vectorAssembler.getInputCols()]

df2 = df2.select(*expr)
df = vectorAssembler.transform(df2)

さらに、より良い結果を得るにfeaturesは、クラスMinMaxScalerを使用して正規化する必要もあります。

MLLib

これを実現するMLLibには、最初に map 関数を使用してすべてのstring値をに変換し、それらをDenseVectorDoubleにマージする必要があります。

rdd = df2.map(lambda data: Vectors.dense([float(c) for c in data]))

この時点で、変数を使用してMLlib の KMeans モデルrddをトレーニングできます。

于 2016-03-21T22:49:46.640 に答える