将 Dataframe 转换为 Vector.dense 以获得 k-mean
Posted
技术标签:
【中文标题】将 Dataframe 转换为 Vector.dense 以获得 k-mean【英文标题】:Converting Dataframe to Vector.dense for k-mean 【发布时间】:2017-10-01 20:28:35 【问题描述】:按照这个问题的答案 How to convert type Row into Vector to feed to the KMeans
我已经为我的数据创建了特征表。(assembler
是一个向量汇编器)
val kmeanInput = assembler.transform(table1).select("features")
当我使用 kmeanInput
运行 k-means 时
val clusters = KMeans.train(kmeanInput, numCluster, numIteration)
我得到了错误
:102: 错误:类型不匹配;找到:org.apache.spark.sql.DataFrame(扩展为)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] 需要:org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] 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: 错误:')' 预期但 '(' 找到。val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
:3: 错误:';'预期但 ')' 找到。 val dat = kmeanInput.rdd.map(lambda row: Vectors.dense([x for x in row["features"]]))
【问题讨论】:
【参考方案1】:您导入了错误的库,您应该使用来自ml
的KMeans
而不是mllib
。第一个使用DataFrame
,第二个使用RDD
。
【讨论】:
以上是关于将 Dataframe 转换为 Vector.dense 以获得 k-mean的主要内容,如果未能解决你的问题,请参考以下文章
将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns
将列表转换为 DataFrame 并在 DataFrame 列中拆分嵌套字典 - Python 3.6
我们如何将 DataFrame 转换为 Bunch 数据类型? [关闭]