我有一个数据集,其中每一行是一个(类:String,vectors:Array [Array [Float]]),我想在每个类的Spark MLLib中使用kmeans模型。我可以爆炸向量来规范化数据,循环遍历类,按类过滤整个数据集,并在循环的每次迭代中拟合模型,但这非常低效(尽管它是Spark的做法)它在OneVsRest分类器的fit方法中:https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/classification/OneVsRest.scala)。
这是一个使用ParArray实现此功能的片段,受OneVsRest方法的启发:
val classes = normalized_data.select("class").distinct.map(_.getString(0)).collect
val kmeans = new KMeans().setK(5)
val models = classes.par.map { class =>
val training_data = unpacked_data.filter($"label" === class)
val model = kmeans.fit(training_data)
(class, model)
}
似乎KMeans拟合方法需要数据是一个每行一行的数据集,这表明数据正常化/爆炸,但是最好的方法是什么?我能否以某种方式利用这样一个事实,即我从标签中每行和/或组中的所有数据点开始,仅使用这些点而不显式过滤我想为其构建模型的每个类的整个数据集?
PS-我知道KMeans.fit实际上需要org.apache.spark.ml.linalg.Vector;假设我已经相应地改变了我的数组[Float]。