K-means聚类实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验算法K-means聚类实验
【实验名称】
K-means聚类实验
【实验要求】
掌握K-means模型应用过程,根据模型要求进行数据预处理,建模,评价与应用;
【背景描述】
聚类算法是一种典型的无监督学习算法,在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。
【知识准备】
了解K-means模型的使用场景,数据标准。了解Python/Spark数据处理一般方法。了解spark 模型调用,训练以及应用方法
【实验设备】
Windows或Linux操作系统的计算机。部署Spark,Python,本实验提供centos6.8环境。【实验说明】
采用UCI机器学习库中的wine数据集作为算法数据,除去原来的类别号,把数据看做没有类别的样本,训练K-means模型,对样本进行聚类。
【实验环境】
Spark 2.3.1,Pyrhon3.X,实验在命令行pyspark中进行,或者把代码写在py脚本,由于本次为实验,以学习模型为主,所以在命令行中逐步执行代码,以便更加清晰地了解整个建模流程。
【实验步骤】
第一步:启动pyspark:
命令行中键入pyspark --master local[4],本地模式启动spark与python:
第二步:导入用到的包,并读取数据:
(1).导入所需的包
from pyspark import SparkContext, SQLContext, SparkConf
from math import sqrt
(2).读取数据源,数据源地址为:/opt/algorithm/kmeans/wine.txt
df_wine = sc.textFile(u"file:/opt/algorithm/kmeans/wine.txt").map( lambda x: str(x).split(",")).map(lambda x: [float(z) for z in x])
(3).数据转换为DataFrame
df_wine_rdd = sqlContext.createDataFrame(df_wine)
(4).展示数据
df_wine_rdd.show()
第三步:数据预处理
(1).去掉类别标号那一类
df_wine_rdd = df_wine_rdd.drop("_1")
(2).构建向量
import pyspark.ml.feature as ml_feature
cols = df_wine_rdd.columns
vectorAssembler = ml_feature.VectorAssembler().setInputCols(cols).setOutputCol("cols") wine_Vc = vectorAssembler.transform(df_wine_rdd)
(3).对数据进行标准化
standardScaler=ml_feature.StandardScaler().setInputCol("cols").setOutputCol("cols_st").set WithMean(True).setWithStd(True).fit(wine_Vc)
wine_Vc_St = standardScaler.transform(wine_Vc)
第四步:构建模型并应用,输出聚类后的分类
(1).Kmeans模型,设置输入列,迭代次数,输出列,聚类数
import pyspark.ml.clustering as ml_clustering
clusters = ml_clustering.KMeans(featuresCol="cols_st",
predictionCol="Pred",
initMode="k-means||",
initSteps=5,
tol=1e-4,
maxIter=20,
seed=None
).fit(wine_Vc_St)
wine_Vc_St_clusters = clusters.transform(wine_Vc_St)
(2).打印模型
wine_Vc_St_clusters.show()
第五步:构建模型评估方法
(1).输出聚类中心并合并到数据表
import pyspark.mllib.linalg as linalg
center = zip([0, 1, 2], [linalg.Vectors.dense(z) for z in clusters.clusterCenters()]) centers = sqlContext.createDataFrame(center).toDF("pred", "center")
wine_Vc_St_clusters_centers = wine_Vc_St_clusters.join(centers, on=["pred"])
(2).计算出误差平方和
WSSSE = wine_Vc_St_clusters_centers.select("center", "cols_st").rdd.map( lambda
x:sqrt(linalg.Vectors.squared_distance(linalg.Vectors.dense(list(x.asDict()["center"])),linalg .Vectors.dense(list(x.asDict()
["cols_st"]))))).sum() / wine_Vc_St_clusters_centers.count()
第六步:输出模型效果
(1).打印结果
print("误差平方和= " + str(WSSSE))
第七步:可以通过以下命令执行python文件,查看最终结果
spark-submit /opt/algorithm/kmeans/K-means.py
【问题与回答】
1、Q:K值怎么确定?
A:对于K值的确定,是Kmean的一个最大缺点,往往需要经验判断,统计学上,遍历k[1,样本量,step],刻画不同k的类样本与质心平均距离曲线确定k的取值。
2、Q:类别变量如何处理?