BisectingKMeans
class pyspark.ml.clustering.BisectingKMeans(featuresCol=‘features’, predictionCol=‘prediction’, maxIter=20, seed=None, k=4, minDivisibleClusterSize=1.0, distanceMeasure=‘euclidean’)
一种基于 Steinbach、Karypis 和 Kumar 的论文“文档聚类技术比较”的二等分 k-means 算法,经过修改以适应 Spark。 该算法从包含所有点的单个开始。 它迭代地在底层找到可分割的簇,并使用 k-means 将它们一分为二,直到总共有 k 个叶簇或没有叶簇是可分割的。 同一级别的二等分步骤被组合在一起以增加并行度。 如果在底层平分所有可分割的簇会产生超过 k 个叶簇,则较大的簇获得更高的优先级。
k = Param(parent=‘undefined’, name=‘k’, doc=‘所需的叶子簇数。必须> 1。’)
minDivisibleClusterSize = Param(parent=‘undefined’, name=‘minDivisibleClusterSize’, doc='一个可分簇的最小点数(如果>= 1.0)或最小比例点(如果<1.0)。
distanceMeasure = Param(parent=‘undefined’, name=‘distanceMeasure’, doc=“距离度量。支持的选项:‘euclidean’ 和 ‘cosine’。”)
**model.computeCost:**计算输入点与其对应的聚类中心之间的距离平方和
model.clusterCenters:聚类中心
model.hasSummary:指示此模型实例是否存在训练摘要
model.summary:获取在训练集上训练的模型的摘要(例如集群分配、集群大小)。如果不存在摘要则抛出异常
01.构造数据
from pyspark.sql import SparkSession
spark = SparkSession.builder.config("spark.driver.host","192.168.1.10")\
.config("spark.ui.showConsoleProgress","false").appName("BisectingKMeans")\
.master("local[*]").getOrCreate()
from pyspark.ml.linalg import Vectors
data = [(Vectors.dense([0.0, 0.0]),),
(Vectors.dense([1.0, 1.0]),),
(Vectors.dense([9.0, 8.0]),),
(Vectors.dense([8.0, 9.0]),)]
df = spark.createDataFrame(data, ["features"])
df.show()
df.printSchema()
输出结果:
+---------+
| features|
+---------+
|[0.0,0.0]|
|[1.0,1.0]|
|[9.0,8.0]|
|[8.0,9.0]|
+---------+
root
|-- features: vector (nullable = true)
02.使用2等分K-means聚类模型
from pyspark.ml.clustering import BisectingKMeans
bisectingKMeans = BisectingKMeans(k=2,minDivisibleClusterSize=1.0)
model = bisectingKMeans.fit(df)
03.查看模型的相关属性
.1聚类中心
print(model.clusterCenters())
输出结果:
[array([0.5, 0.5]), array([8.5, 8.5])]
.2计算输入点与其对应的聚类中心之间的距离平方和
print(model.computeCost(df))
输出结果:
2.0000000000000004
.3判断模型是否有摘要信息
print(model.hasSummary)
输出结果:True
.4通过摘要信息,查看聚类大小
summary = model.summary
print(summary.clusterSizes)
输出结果:[2, 2]