Spark 中的层次聚合聚类

use*_*941 3 cluster-analysis hierarchical-clustering apache-spark

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

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

如果有人对此有一些见解,我将非常感激。谢谢。

Gab*_*rch 5

平分 Kmeans 方法

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

您可以在此处下载 Iris.csv 进行测试

您可以在这里下载 Spark-Notebook

它是一个很棒的工具,可以轻松地让您运行独立的 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
Run Code Online (Sandbox Code Playgroud)

Spark-Notebook中创建sqlContext的方法

import org.apache.spark.sql.SQLContext
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)

定义导入模式

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)))
Run Code Online (Sandbox Code Playgroud)

制作 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")
Run Code Online (Sandbox Code Playgroud)

指定功能

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)
Run Code Online (Sandbox Code Playgroud)

具有 3 个簇的模型(随 .setK 更改)

val bkm = new BisectingKMeans().setK(3).setSeed(1L).setFeaturesCol("features")
val model = bkm.fit(iris_df_trans)
Run Code Online (Sandbox Code Playgroud)

计算成本

val cost = model.computeCost(iris_df_trans)
Run Code Online (Sandbox Code Playgroud)

计算中心

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

聚合方法

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

Github项目

Spark-Summit 演讲的 YouTube

Spark-Summit 的幻灯片

  • 这并没有提供问题的答案。您可以[搜索类似问题](//stackoverflow.com/search),或参考页面右侧的相关问题和链接问题来寻找答案。如果您有相关但不同的问题,请[提出一个新问题](//stackoverflow.com/questions/ask),并包含指向此问题的链接以帮助提供上下文。请参阅:[提出问题,获得答案,不受干扰](//stackoverflow.com/tour) (3认同)