【问题标题】:Spark K-Means get original Cluster Center / Centroids with NormalizationSpark K-Means 使用归一化获得原始聚类中心/质心
【发布时间】:2018-02-14 05:04:33
【问题描述】:

我运行了一个 k-means 模型

val kmeans = new KMeans().setK(k).setSeed(1L)
val model = kmeans.fit(train_dataset)

然后提取聚类中心(质心)

 var clusterCenters:Seq[(Double,Double,Double,Double,Double,Double,Double,Double,Double)] = Seq()
for(e <- model.clusterCenters){
  clusterCenters = clusterCenters :+ ((e(0)),e(1),e(2),e(3),e(4),e(5),e(6),e(7),e(8))
}

import sc.implicits._
var centroidsDF = clusterCenters.toDF()

为了写回结果,我创建了一个结果聚类中心的 DataFrame。

现在我有一个问题,我事先对数据进行了归一化以改善聚类结果。

 val scaler = new StandardScaler()
      .setInputCol("features")
      .setOutputCol("scaledFeatures")
      .setWithStd(true)
      .setWithMean(false)
    scalerModel = scaler.fit(train_dataset)
    scaledData = scalerModel.transform(train_dataset)

我怎样才能使质心的原始形式去规范化?

【问题讨论】:

  • 你怎么知道这改善了结果?

标签: scala apache-spark cluster-analysis normalization k-means


【解决方案1】:

我不确定这样做是否有意义,但由于不居中,您可以乘以 std 向量:

import org.apache.spark.ml.feature.ElementwiseProduct

val kmeans: KMeansModel = ???
val scaler: StandardScalerModel = ???

new ElementwiseProduct()
  .setScalingVec(scaler.std)  // Standard deviation used by scaler
  .setOutputCol("rescaled")
  .setInputCol("cluster")
  .transform(sc.parallelize(
    // Get centers and convert to `DataFrame`
    kmeans.clusterCenters.zipWithIndex).toDF("cluster", "id"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 2016-06-27
    • 2018-09-19
    • 2018-04-27
    • 2019-05-14
    • 2018-05-09
    • 2021-11-25
    • 2015-06-04
    相关资源
    最近更新 更多