Apache spark 如何将类型行转换为向量以馈送到KMeans
当我尝试将df2馈送到kmeans时,我得到以下错误Apache spark 如何将类型行转换为向量以馈送到KMeans,apache-spark,pyspark,k-means,apache-spark-mllib,pyspark-sql,Apache Spark,Pyspark,K Means,Apache Spark Mllib,Pyspark Sql,当我尝试将df2馈送到kmeans时,我得到以下错误 clusters = KMeans.train(df2, 10, maxIterations=30, runs=10, initializationMode="random") 我得到的错误是: Cannot convert type <class 'pyspark.sql.types.Row'> into Vector 如何将这两列转换为Vector并将其提供给KMeans?M
clusters = KMeans.train(df2, 10, maxIterations=30,
runs=10, initializationMode="random")
我得到的错误是:
Cannot convert type <class 'pyspark.sql.types.Row'> into Vector
如何将这两列转换为Vector并将其提供给KMeans?ML
问题是您错过了,很明显,方法序列需要一个以向量为特征的数据帧
要修改当前数据的结构,可以使用。在您的情况下,它可能类似于:
从pyspark.sql.functions导入*
vectorAssembler=VectorAssemblerinputCols=[纬度,经度],
outputCol=特征
对于使用字符串而不是双精度的特殊情况,您应该首先使用字符串。
expr=[colc.castDouble.aliasc
对于矢量汇编程序中的c.getInputCols]
df2=df2。选择*expr
df=矢量汇编程序.transformdf2
此外,还应该使用类对特征进行规范化,以获得更好的结果
MLLib
为了使用MLLib实现这一点,您需要首先使用map函数,将所有字符串值转换为Double,并在一个数组中将它们合并在一起
rdd=df2.maplambda数据:Vectors.dense[floatc表示数据中的c]
在这一点之后,您可以使用rdd变量来训练您的应用程序。我让PySpark 2.3.1在a上执行以下操作:
编写要包含在聚类分析中的列的列表:
专长=纬度、经度`
您需要所有列都是数值:
expr=[colc.castDouble.aliasc表示专长中的c]
df2=df2。选择*expr
使用mllib.linalg.Vectors创建要素向量:
从pyspark.ml.feature导入向量汇编程序
汇编器=向量汇编器输入=专长,输出=特征
df3=汇编程序。transformdf2。选择“功能”
您应该规范化您的功能,因为规范化并不总是必需的,但它很少会造成伤害:
从pyspark.ml.feature导入StandardScaler
定标器=标准定标器
inputCol=特征,
outputCol=缩放特征,
with std=True,
withMean=False
scalerModel=scaler.fitdf3
df4=scalerModel.transformdf3.drop'features'\
.WithColumn重命名为'scaledFeatures','features'
将对象df4转化为密集向量:
从pyspark.mllib.linalg导入向量
data5=df4.rdd.maplambda行:Vectors.dense[x代表行中的x['features']]
使用获得的RDD对象作为KMeans培训的输入:
从pyspark.mllib.clustering导入KMeans
模型=KMeans.traindata5,k=3,最大迭代次数=10
示例:对向量空间中的点p进行分类:
预测=model.predictp
df = sqlContext.read.json("data/ALS3.json")
df2 = df.select('latitude','longitude')
df2.show()
latitude| longitude|
60.1643075| 24.9460844|
60.4686748| 22.2774728|