Spark中的分层聚合聚类

时间:2017-05-24 07:57:04

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

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

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

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

2 个答案:

答案 0 :(得分:3)

Bisecting Kmeans方法

似乎做得不错,在性能方面跑得很快。下面是我使用Spark(scala)中的Bisecting-Kmeans算法编写的示例代码,用于从Iris数据集(许多人熟悉)中获取集群中心。注意:(我在Spark的大多数工作中使用Spark-Notebook,它与Jupyter笔记本非常相似)。我提出这个问题是因为您需要为此示例创建一个Spark SQLContext才能工作,这可能因您访问Spark的位置或方式而有所不同。

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

您可以下载Spark-Notebook here

这是一个很棒的工具,它可以让您轻松运行独立的火花群。如果你想在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中的凝聚层次聚类实现,值得一看,它不包含在基础MLlib中,如二等分Kmeans方法,我没有一个例子。但是值得一看那些好奇的人。

Github Project

Youtube of Presentation at Spark-Summit

Slides from Spark-Summit

答案 1 :(得分:1)

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

你找到/尝试了什么吗?