【问题标题】:Hierarchical Agglomerative clustering in SparkSpark 中的分层凝聚聚类
【发布时间】:2017-10-24 10:35:27
【问题描述】:

我正在研究一个集群问题,它必须能够针对大量数据进行扩展。我想在 Spark 中尝试层次聚类并将我的结果与其他方法进行比较。

我在网上做了一些关于在 Spark 中使用层次聚类的研究,但没有找到任何有希望的信息。

如果有人对此有所了解,我将不胜感激。 谢谢。

【问题讨论】:

    标签: apache-spark cluster-analysis hierarchical-clustering


    【解决方案1】:

    二等分 Kmeans 方法

    似乎做得不错,并且在性能方面运行得相当快。这是我编写的示例代码,用于利用 Spark (scala) 中的 Bisecting-Kmeans 算法从 Iris 数据集(许多人都熟悉)中获取聚类中心。注意:(我的大部分 Spark 工作都使用 Spark-Notebook,它与 Jupyter Notebooks 非常相似)。我提出这个是因为您需要创建一个 Spark SQLContext 才能使这个示例工作,这可能会根据您访问 Spark 的位置或方式而有所不同。

    您可以下载 Iris.csv 来测试here

    您可以下载 Spark-Notebook here

    这是一个很棒的工具,可以让您轻松运行独立的 Spark 集群。如果您在 linux 或 Mac 上需要帮助,我可以提供说明。一旦你下载了它,你需要使用 SBT 来编译它......使用基目录中的以下命令sbt,然后是run

    可以在 localhost:9000 访问

    必需的导入

    import org.apache.spark.sql.types._
    import org.apache.spark.ml.feature.VectorAssembler
    import org.apache.spark.ml.clustering.BisectingKMeans
    

    Spark-Notebook中创建sqlContext的方法

    import org.apache.spark.sql.SQLContext
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    

    定义导入模式

    val customSchema = StructType(Array(
    StructField("c0", IntegerType, true),
    StructField("Sepal_Length", DoubleType, true),
    StructField("Sepal_Width", DoubleType, true),
    StructField("Petal_Length", DoubleType, true),
    StructField("Petal_Width", DoubleType, true),
    StructField("Species", StringType, true)))
    

    制作 DF

    val iris_df = sqlContext.read
    .format("csv")
    .option("header", "true") //reading the headers
    .option("mode", "DROPMALFORMED")
    .schema(customSchema)
    .load("/your/path/to/iris.csv")
    

    指定功能

    val assembler = new 
    VectorAssembler().setInputCols(Array("c0","Sepal_Length", "Sepal_Width","Petal_Length","Petal_Width")).setOutputCol("features")
    val iris_df_trans = assembler.transform(iris_df)
    

    具有 3 个集群的模型(使用 .setK 更改)

    val bkm = new BisectingKMeans().setK(3).setSeed(1L).setFeaturesCol("features")
    val model = bkm.fit(iris_df_trans)
    

    计算成本

    val cost = model.computeCost(iris_df_trans)
    

    计算中心

    println(s"Within Set Sum of Squared Errors = $cost")
    println("Cluster Centers: ")
    val centers = model.clusterCenters
    centers.foreach(println)
    

    一种聚合方法

    下面提供了 Spark 中的 Agglomerative 层次聚类实现,值得一看,它没有像二等分 Kmeans 方法那样包含在基础 MLlib 中,我没有示例。但是对于那些好奇的人来说,值得一看。

    Github Project

    Youtube of Presentation at Spark-Summit

    Slides from Spark-Summit

    【讨论】:

    【解决方案2】:

    我唯一能找到的是通过二等分 k-means 在 Spark ML 中实现的分裂层次聚类(这里:https://spark.apache.org/docs/latest/mllib-clustering.html#bisecting-k-means) 我打算试一试。

    你找到/尝试过什么吗?

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2014-06-28
      • 2022-01-01
      • 2016-09-06
      • 2018-04-10
      • 2021-10-04
      • 2018-04-29
      • 2021-07-25
      • 2015-11-20
      相关资源
      最近更新 更多