K-means聚类实验

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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:类别变量如何处理?

相关文档
最新文档