Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么Spark';高斯混合返回相同的簇?_Scala_Apache Spark_Cluster Analysis_Apache Spark Mllib - Fatal编程技术网

Scala 为什么Spark';高斯混合返回相同的簇?

Scala 为什么Spark';高斯混合返回相同的簇?,scala,apache-spark,cluster-analysis,apache-spark-mllib,Scala,Apache Spark,Cluster Analysis,Apache Spark Mllib,我正在使用spark-1.5.2使用GaussianMixture对数据集进行聚类。除了生成的GaussianMixtureModels之外,不会发生任何错误,并且它们的权重相同。达到指定公差所需的迭代次数约为2次,这似乎太少了 我可以调整哪些参数以使簇形成不同的值 import org.apache.spark.SparkContext import org.apache.spark.rdd._ import org.apache.spark.mllib.clustering.Gaussian

我正在使用spark-1.5.2使用
GaussianMixture
对数据集进行聚类。除了生成的
GaussianMixtureModel
s之外,不会发生任何错误,并且它们的权重相同。达到指定公差所需的迭代次数约为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))
}

此外,代码、输入数据和输出数据可作为gist@


谢谢

我通过ELKI运行了您的数据(我不得不删除最后一行,这是不完整的)。一开始它也不起作用,我认为这是由于属性的规模以及默认的初始化。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
我也会尝试光学,因为我发现HDBSCAN通常只捕获集群的核心(通过设计)。从光学图上看,我不会说星系团的定义非常清楚


除了尝试其他聚类算法外,我认为您还需要在预处理和投影数据方面做大量工作,因为它具有非常强的相关性。在预处理过程中尽可能多地使用数据的先验知识,以提高结果。

是否尝试更改收敛容差?它可能陷入了局部最大值。试着换种子。我现在没有集群来测试这个。你有没有尝试过其他工具,比如ELKI和Weka?集群不是Spark的一个特殊优势。此外,您的数据是否有许多重复项?数据规范化是否像通过
标准缩放器传递
观测RDD
一样简单?这是数据规范化的一种方法。问题是,你不仅想做点什么,你还想对数据进行预处理,让它解决你的问题。否则,你只会得到一些“东西”。你想要“什么”吗?仅供参考,我已经推动了ELKI Github的改进,通过更智能的初始化,不再需要数据规范化。因为我不使用Spark,所以不要期望我在那里做类似的更改。谢谢。标准化产生了更好的结果。
-dbc.in /tmp/observations.csv
-dbc.filter normalization.columnwise.AttributeWiseVarianceNormalization
-algorithm clustering.hierarchical.extraction.HDBSCANHierarchyExtraction
-algorithm SLINKHDBSCANLinearMemory
-hdbscan.minPts 50 -hdbscan.minclsize 100