【问题标题】:Why does Spark's GaussianMixture return identical clusters?为什么 Spark 的 GaussianMixture 返回相同的簇?
【发布时间】:2017-01-10 23:09:01
【问题描述】:

我正在使用 spark-1.5.2 使用 GaussianMixture 对数据集进行聚类。除了生成的GaussianMixtureModels 和它们的权重相同之外,不会发生错误。达到指定容差所需的迭代次数约为 2,这似乎太低了。

我可以调整哪些参数以形成具有不同值的集群?

import org.apache.spark.SparkContext
import org.apache.spark.rdd._
import org.apache.spark.mllib.clustering.GaussianMixture
import org.apache.spark.mllib.linalg.{Vector, Vectors}

def sparkContext: SparkContext = {
  import org.apache.spark.SparkConf
  new SparkContext(new SparkConf().setMaster("local[*]").setAppName("console"))
}

implicit val sc = sparkContext

def observationsRdd(implicit sc: SparkContext): RDD[Vector] = {
  sc.textFile("observations.csv")
    .map { line => Vectors.dense(line.split(",").map { _.toDouble }) }
}

val gmm = {new GaussianMixture()
  .setK(6)
  .setMaxIterations(1000)
  .setConvergenceTol(0.001)
  .setSeed(1)
  .run(observationsRdd)}

for (i <- 0 until gmm.k) {
  println("weight=%f\nmu=%s\nsigma=\n%s\n" format
    (gmm.weights(i), gmm.gaussians(i).mu, gmm.gaussians(i).sigma))
}

截断输出:

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

weight=0.166667
mu=[4730.358845338535,4391.695550847029,4072.3224046605947,4253.183898304653,4454.124682202946,4775.553442796136,4980.3952860164545,4812.717637711368,5120.44449152493,2820.1827330505857,180.10291313557565,4189.185858050445,3690.793644067457]
sigma=
422700.24745093845  382225.3248240414   398121.9356855869   ... (13 total)
382225.3248240414   471186.33178427175  455777.0565262309   ...
398121.9356855869   455777.0565262309   461210.0532084378   ...
469361.3787142044   497432.39963363775  515341.1303306988   ...
474369.6318494179   482754.83801426284  500047.5114985542   ...
453832.62301188655  443147.58931290614  461017.7038258409   ...
458641.51202210854  433511.1974652861   452015.6655154465   ...
387980.29836054996  459673.3283909025   455118.78272128507  ...
461724.87201332086  423688.91832506843  442649.18455604656  ...
291940.48273324646  257309.1054220978   269116.23674394307  ...
16289.3063964479    14790.06803739929   15387.484828872432  ...
334045.5231910066   338403.3492767321   350531.7768916226   ...
280036.0894114749   267624.69326772855  279651.401859903    ...

...

此外,代码、输入数据和输出数据可作为 gist @https://gist.github.com/aaron-santos/91b4931a446c460e082b2b3055b9950f

谢谢

【问题讨论】:

  • 您是否尝试更改收敛容差?它可能陷入了局部最大值。也尝试改变种子。我现在没有集群来测试这个。
  • 你试过ELKI和Weka等其他工具吗?集群并不是 Spark 的一个特殊优势。另外,您的数据是否有很多重复项?

标签: scala apache-spark cluster-analysis apache-spark-mllib


【解决方案1】:

我通过 ELKI 运行了您的数据(我不得不删除最后一行,这是不完整的)。起初它也不起作用,我认为这是由于属性的 scale 以及默认初始化。 Spark 中可能存在同样的问题。

缩放数据后,我可以用 ELKI 得到一些合理的集群(可视化 13 个维度中的前三个):

但是从数据点的分布来看我认为高斯混合建模不适合这个数据。这些点似乎是从某些超曲面或某些轨迹中进行网格采样的;不是来自高斯 (!) 分布。

这是我使用的 ELKI 参数:

-dbc.in /tmp/observations.csv
-dbc.filter normalization.columnwise.AttributeWiseVarianceNormalization
-algorithm clustering.em.EM -em.k 6
-em.centers RandomlyChosenInitialMeans -kmeans.seed 0

可能值得尝试其他聚类算法,例如 HDBSCAN,它可以识别基于密度的聚类:

参数:

-dbc.in /tmp/observations.csv
-dbc.filter normalization.columnwise.AttributeWiseVarianceNormalization
-algorithm clustering.hierarchical.extraction.HDBSCANHierarchyExtraction
-algorithm SLINKHDBSCANLinearMemory
-hdbscan.minPts 50 -hdbscan.minclsize 100

我也会尝试 OPTICS,因为我发现 HDBSCAN 通常只捕获集群的核心(按设计)。从 OPTICS 图中,我不会说这些集群的定义非常明确。

除了尝试其他聚类算法外,我认为您还需要在数据的预处理和投影上做很多工作,因为它具有很强的相关性。尝试将尽可能多的关于数据的先验知识放入预处理中以改进结果。

【讨论】:

  • 数据规范化是否像通过StandardScaler 传递observationsRdd 一样简单?
  • 这是规范化数据的一种方式。问题是,您不仅想做某事,还想预处理数据以解决您的问题。否则,你只会得到“东西”。你想要“东西”吗?
  • 仅供参考,我已经对 ELKI Github 进行了改进,通过更智能的初始化不再需要数据规范化。由于我不使用 Spark,所以不要指望我在那里做类似的更改。
  • 谢谢。标准化产生了更好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2017-05-22
  • 2015-05-21
  • 2011-09-28
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多