实验:Spark ML Bisecting k-means 聚类算
法使用实验
实验目的:通过 Spark ML Bisecting k-means 聚类算法实例,使
学生掌握在 Spark 中如何使用 Bisecting k-means 聚类算法解决实
际问题,并进一步加深对 k-means 聚类算法的理解。
实验环境:Linux 系统,Spark 集群环境,Spark 开发环境
实验内容:学习 Spark 中 Bisecting k-means 聚类算法的使用
实验步骤:
一、导入需要的包
二、加载和解析数据
三、构建 k-means 聚类模型
四、评估模型
五、保存和加载模型
Spark ML 中 Bisecting K-means 算 法 的 实 现 类
BisectingKMeans 具有以下参数:
def __init__(self, featuresCol="features", predictionCol="prediction", maxIter=20,
seed=None, k=4, minDivisibleClusterSize=1.0):
参数的含义解释如下:
k 表示期望的聚类的个数;
maxIter 表示方法单次运行最大的迭代次数;
minDivisibleClusterSize 一个簇可划分的最小点数或比例;
seed 表示集群初始化时的随机种子。
实例:导入训练数据集,使用 Bisecting k-means 算法将数据
聚类到两个簇当中,所需的簇个数会作为参数传递到算法中,然
后计算簇内均方差总和(WSSSE),可以通过增加类簇的个数 k 来
减小误差。
本实例使用 Bisecting k-means 算法进行聚类的步骤如下:
1) 装载数据,数据以文本文件方式进行存放;
2) 将数据集聚类,设置 2 个类和 20 次迭代,进行模型训练形
成数据模型;
3) 打印数据模型的中心点;
4) 使用误差平方之和来评估数据模型;
5) 使用模型测试数据;
该实例使用的数据存放在 kmeans_data.txt 文档中,提供了 6
个点的空间位置坐标,数据如下所示:
0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2
每行数据描述了一个点,每个点有 3 个数字描述了其 3 维空
间坐标值。我们将数据的每一列视为一个特征指标,对数据集进
行聚类分析。
一、导入需要的包
# 1. 导入需要的包:
from pyspark.ml.clustering import BisectingKMeans, BisectingKMeansModel
from pyspark.ml.linalg import Vectors
from pyspark.sql import SparkSession
二、加载和解析数据
spark = SparkSession\
.builder\
.appName("BisectingKMeansExample")\
.getOrCreate()
# 2. 以 libsvm 格式读取数据文件构造 DataFrame
# 原始数据文件 sample_libsvm_data.txt 中的数据以行为一条数据,
# 形如: 1.0 1.0 1.0,表示共有三个特征,特征值都为 1.0
dataset =
spark.read.format("libsvm").load("data/mllib/sample_kmeans_data.txt")
dataset.show()
三、构建 Bisecting k-means 聚类模型
输入 Bisecting k-means 聚类模型参数,通过训练数据得到
Bisecting k-means 聚类模型
# 3. 设置参数,训练 KMeans 聚类模型
# setK(2) 表示聚成 2 个类
# seed 表示集群初始化时的随机种子
Bkm = BisectingKMeans().setK(2).setSeed(1)
model = bkm.fit(dataset)
# 4. 进行预测
predictions = model.transform(dataset)
predictions.show()
四、评估模型
误差平方和越小,证明模型越准确。
# 5. 通过计算误差平方和评价聚类模型
cost = model.computeCost(dataset)
print("Within Set Sum of Squared Errors = " + str(cost))
五、保存和加载模型
# 7. 保存模型
model.save("model/bisecting_kmeans")
# 8. 加载模型
sameModel = BisectingKMeansModel.load("model/bisecting_kmeans")
# 9. 使用模型测试数据
data = [(0, Vectors.sparse(3, [0, 1, 2], [0.3, 0.3, 0.3])),
(1, Vectors.sparse(3, [0, 1, 2], [3.7, 5.8, 4.8])),
(2, Vectors.sparse(3, [0, 1, 2], [8.0, 8.1, 8.2]))]
new_df = spark.createDataFrame(data, ["label", "features"])
new_df.show()
完整代码及运行结果:
# coding=utf-8
# 1. 导入需要的包:
from pyspark.ml.clustering import BisectingKMeans, BisectingKMeansModel
from pyspark.ml.linalg import Vectors
from pyspark.sql import SparkSession
if __name__ == "__main__":
spark = SparkSession\
.builder\
.appName("BisectingKMeansExample")\
.getOrCreate()
# 2. 以 libsvm 格式读取数据文件构造 DataFrame
# 原始数据文件 sample_libsvm_data.txt 中的数据以行为一条数据,
# 形如: 1.0 1.0 1.0,表示共有三个特征,特征值都为 1.0
dataset =
spark.read.format("libsvm").load("data/mllib/sample_kmeans_data.txt")
dataset.show()
# 3. 设置参数,训练 KMeans 聚类模型
# setK(2) 表示聚成 2 个类
# seed 表示集群初始化时的随机种子
bkm = BisectingKMeans().setK(2).setSeed(1)
model = bkm.fit(dataset)
# 4. 进行预测
predictions = model.transform(dataset)
predictions.show()
# 5. 通过计算误差平方和评价聚类模型
cost = model.computeCost(dataset)
print("Within Set Sum of Squared Errors = " + str(cost))
# 6. 打印数据模型的中心点.
print("Cluster Centers: ")
centers = model.clusterCenters()
for center in centers:
print(center)
# 7. 保存模型
model.save("model/bisecting_kmeans")
# 8. 加载模型
sameModel = BisectingKMeansModel.load("model/bisecting_kmeans")
# 9. 使用模型测试数据
data = [(0, Vectors.sparse(3, [0, 1, 2], [0.3, 0.3, 0.3])),
(1, Vectors.sparse(3, [0, 1, 2], [3.7, 5.8, 4.8])),
(2, Vectors.sparse(3, [0, 1, 2], [8.0, 8.1, 8.2]))]
new_df = spark.createDataFrame(data, ["label", "features"])
new_df.show()
print("new_df is belongs to clusters:")
sameModel.transform(new_df).show()
spark.stop()
运行结果,两个聚类中心:
Cluster centers:
[9.099999999999998,9.099999999999998,9.099999999999998]
[0.1,0.1,0.1]
新数据预测:
new_df is belongs to clusters:
+-----+--------------------+----------+
|label|
features|prediction|
+-----+--------------------+----------+
0|
|
|
1|
1|
|
+-----+--------------------+----------+
模型保存在 model/bisecting_kmeans:
0|(3,[0,1,2],[0.3,0...|
1|(3,[0,1,2],[3.7,5...|
2|(3,[0,1,2],[8.0,8...|