【问题标题】:How to initialize cluster centers for K-means in Spark MLlib?如何在 Spark MLlib 中为 K-means 初始化集群中心?
【发布时间】:2016-05-27 08:37:12
【问题描述】:

有没有办法在 Spark MLlib 中运行 K-Means 时初始化集群中心?

我尝试了以下操作:

model = KMeans.train(
    sc.parallelize(data), 3, maxIterations=0,
    initialModel = KMeansModel([(-1000.0,-1000.0),(5.0,5.0),(1000.0,1000.0)]))

initialModelsetInitialModel 在 spark-mllib_2.10 中不存在

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:

    从 Spark 1.5+ 开始,可以使用 setInitialModel 在 Scala 中设置初始模型,这需要 KMeansModel

    import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
    import org.apache.spark.mllib.linalg.Vectors
    
    val data = sc.parallelize(Seq(
        "[0.0, 0.0]", "[1.0, 1.0]", "[9.0, 8.0]", "[8.0,  9.0]"
    )).map(Vectors.parse(_))
    
    val initialModel = new KMeansModel(
       Array("[0.6,  0.6]", "[8.0,  8.0]").map(Vectors.parse(_))
    )
    
    val model = new KMeans()
      .setInitialModel(initialModel)
      .setK(2)
      .run(data)
    

    和 PySpark 1.6+ 使用 initialModel 参数到 train 方法:

    from pyspark.mllib.clustering import KMeansModel, KMeans
    from pyspark.mllib.linalg import Vectors
    
    data = sc.parallelize([
        "[0.0, 0.0]", "[1.0, 1.0]", "[9.0, 8.0]", "[8.0,  9.0]"
    ]).map(Vectors.parse)
    
    initialModel = KMeansModel([
        Vectors.parse(v) for v in ["[0.6,  0.6]", "[8.0,  8.0]"]])
    model = KMeans.train(data, 2, initialModel=initialModel)
    

    如果这些方法中的任何一个不起作用,则表示您使用的是较早版本的 Spark。

    【讨论】:

    • 我的 build.sbt 有以下内容: "org.apache.spark" %% "spark-core" % "1.5.2" % "provided" withSources() withJavadoc(), "org.apache .spark" % "spark-mllib_2.10" % "1.5.2" % "provided" withSources() withJavadoc(),但在 intelliJ 上编码时我无法找到 setInitialModel
    • 嗨,我正在尝试使用 pyspark 实现相同的功能,但我没有像您那样提供集群中心。我正在使用此命令 centerVectors = preModel.clusterCenters() 从先前训练的模型中提取它们。问题在于这些点或聚类中心的格式。您能否指定集群中心的正确类型。它们是许多列表的字符串吗?我附上了下面的代码。它不适合我。
    • centersList = [] for center in centerVectors:centersList = [center.tolist()] + centerList
    • initialModel = KMeansModel([Vectors.parse(str(len(v), str(v))) for v in centresList])
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2016-12-16
    • 2019-05-14
    • 2017-07-04
    • 2014-01-25
    • 2015-04-06
    • 2016-06-27
    相关资源
    最近更新 更多