将 Dataframe 转换为 Vector.dense 以获得 k-mean
Converting Dataframe to Vector.dense for k-mean
关注这个问题的答案
我已经为我的数据创建了特征 table。(assembler
是矢量汇编器)
val kmeanInput = assembler.transform(table1).select("features")
当我 运行 k-均值 kmeanInput
val clusters = KMeans.train(kmeanInput, numCluster, numIteration)
我收到错误
:102: error: type mismatch; found : org.apache.spark.sql.DataFrame (which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] val clusters = KMeans.train(kmeanInput, numCluster, numIteration)
正如@Jed 在他的回答中提到的那样,发生这种情况是因为行不是 Vectors.dense
格式。
为了解决这个问题,我尝试了
val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in
row["features"]]))
我收到这个错误
:3: error: ')' expected but '(' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
:3: error: ';' expected but ')' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
您导入了错误的库,您应该使用 ml
中的 KMeans
而不是 mllib
。第一个使用 DataFrame
,第二个使用 RDD
.
关注这个问题的答案
我已经为我的数据创建了特征 table。(assembler
是矢量汇编器)
val kmeanInput = assembler.transform(table1).select("features")
当我 运行 k-均值 kmeanInput
val clusters = KMeans.train(kmeanInput, numCluster, numIteration)
我收到错误
:102: error: type mismatch; found : org.apache.spark.sql.DataFrame (which expands to) org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] required: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] val clusters = KMeans.train(kmeanInput, numCluster, numIteration)
正如@Jed 在他的回答中提到的那样,发生这种情况是因为行不是 Vectors.dense
格式。
为了解决这个问题,我尝试了
val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in
row["features"]]))
我收到这个错误
:3: error: ')' expected but '(' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
:3: error: ';' expected but ')' found. val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
您导入了错误的库,您应该使用 ml
中的 KMeans
而不是 mllib
。第一个使用 DataFrame
,第二个使用 RDD
.