0

У меня проблема с двумя различными реализациями MLLIB (org.apache.spark.ml. И org.apache.spark .mllib) и KMeans. Я использую новую реализацию org.apache.spark.ml, которая использует Dataframes, но я борюсь с документацией и как предсказать индекс кластера.Как предсказать кластер kmeans с Spark org.apache.spark.ml.clustering. {KMeans, KMeansModel}

import org.apache.spark.ml.clustering.{KMeans, KMeansModel} 
import org.apache.spark.ml.feature.LabeledPoint 
import org.apache.spark.ml.linalg.Vectors 
import org.apache.spark.sql.{Row, SparkSession} 

/** 
    * An example showcasing the use of kMeans 
    */ 
object ExploreKMeans { 

    // Spark configuration. 
    // Retrieve sparkContext with spark.sparkContext. 
    private val spark = SparkSession.builder() 
    .appName("com.example.ml.exploration.kMeans") 
    .master("local[*]") 
    .getOrCreate() 

    // This import, after the definition of a valid SQLContext defines implicits for converting RDDs to Dataframes over .toDF(). 
    import spark.implicits._ 

    def main(args: Array[String]): Unit = { 

    val data = spark.sparkContext.parallelize(Array((5.0, 2.0,1.5), (2.0, 2.5,2.3), (1.0, 2.1,4.2), (2.0, 5.5, 8.5))) 

    val df = data.toDF().map { row => 
     val label = row(0).asInstanceOf[Double] 
     val value1 = row(1).asInstanceOf[Double] 
     val value2 = row(2).asInstanceOf[Double] 

     LabeledPoint(label, Vectors.dense(value1,value2)) 
    } 


    val kmeans = new KMeans().setK(3).setSeed(1L) 
    val model: KMeansModel = kmeans.fit(df) 

    // Evaluate clustering by computing Within Set Sum of Squared Errors. 
    val WSSSE = model.computeCost(df) 
    println(s"Within Set Sum of Squared Errors = $WSSSE") 

    // Shows the result. 
    println("Cluster Centers: ") 
    model.clusterCenters.foreach(println) 

    //TODO How to predict cluster index? 
    //model.predict(??? 
    } 
} 

Как использовать модель для прогнозирования индекса кластеров новых значений? Функция model.predict не отображается. Этот API действительно запутывает ...

ответ

0

Хорошо, я понял. Предсказания теперь осуществляется с помощью метода преобразования:

println("Transform ") 
val transformed = model.transform(df) 
transformed.collect().foreach(println) 

Cluster Centers: 
[2.25,1.9] 
[5.5,8.5] 
[2.1,4.2] 
Transform: 
[5.0,[2.0,1.5],0] 
[2.0,[2.5,2.3],0] 
[1.0,[2.1,4.2],2] 
[2.0,[5.5,8.5],1] 
+0

Как предсказать кластер для новых точек данных (тестовые данные). Я пытался использовать transform(), но возвращал предсказание на данные тренировки, хотя я передаю тестовый набор данных в качестве параметра. –

-1

ну, более простой способ сделать это:

model.summary.predictions.show 
+0

было бы полезно, если бы вы объяснили немного больше, почему это проще – ztadic91

+0

omg, этот код одной строки может сделать все это. С.Б. –

 Смежные вопросы

  • Нет связанных вопросов^_^