机器学习技术任务驱动式教程-课件 模块8 基于K-均值的聚类_第1页
机器学习技术任务驱动式教程-课件 模块8 基于K-均值的聚类_第2页
机器学习技术任务驱动式教程-课件 模块8 基于K-均值的聚类_第3页
机器学习技术任务驱动式教程-课件 模块8 基于K-均值的聚类_第4页
机器学习技术任务驱动式教程-课件 模块8 基于K-均值的聚类_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据转换PCA降维K-均值模型训练聚类评价不失真压缩图像参考书目《机器学习技术任务驱动式教程》基于K-均值的聚类模块8机器学习技术目录NBA球员分类地区消费分类图像矢量量化小结习题八基于K-均值的聚类任务模块8机器学习技术从找到NBA球员在过去一个赛季的统计数据。有286位球员球场上的各方面表现,使用K-均值算法划分球员到簇,并定义簇的具体分类。详细的字段描述见下表。1.1任务描述1.NBA球员分类1.1任务描述要求使用K-均值算法聚类players.csv中的286名球员,分析簇代表的球员特点。任务目标字段类型允许为空标签?例子排名int否是1球员str否否詹姆斯-哈登球队str否否火箭得分float否否31.9命中-出手str否否9.60-21命中率float否否0.45399999999999996命中-三分str否否4.20-10.70三分命中率float否否0.397命中-罚球str否否8.50-9.90罚球命中率float否否0.861场次int否否30上场时间float否否36.11.NBA球员分类1.2

任务分解import方式引入依赖的模块文件读入DataFrame,检测空值和数据分布特征归一化到(0,1)区间依赖库导入数据观察数据转换从探查数据内容开始,通过数据清洗和数据转换加工原始数据,使用轮廓系数评价聚类性能,找到K-均值算法的最优K值。1.NBA球员分类1.2

任务分解轮廓系数评价K-均值模型性能,找到最优K值最优K值训练的模型划分球员,可视化数据分布观察不同簇样本的数据分布,指定簇到具体的分类参数查找聚类可视化簇分析接上1.NBA球员分类1.3

任务实施1.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤2:导入依赖库。importpandasaspdimportseabornassbnimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportminmax_scalefromsklearn.clusterimportKMeansfromsklearn.metricsimportsilhouette_scoreimportnumpyasnp按“SHIFT+Enter”,检查输出无异常。1.NBA球员分类1.3

任务实施1.3.2数据观察文件读入DataFrame对象后,需要观察字段内容和空值。步骤1:定义2级标题。##<fontcolor="black">数据观察</font>按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤2:检查前5个样本。players=pd.read_csv("../data/players.csv")players.head()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤3:查看特征是否包含空值。players.isnull().sum()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤4:设置Matplotlib正常显示中文字符和负号。plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False步骤5:可视化数据分布。sbn.lmplot(x="得分",y="命中率",data=players,fit_reg=False,scatter_kws={"alpha":0.8,"color":"steelblue"})1.NBA球员分类1.3

任务实施按“SHIFT+Enter”,运行结果如下:从图中看出,左下样本分布比较集中,可以归为一类;左上样本密度低,归为一类;右边样本密度也不高,归为1类。因此K-均值算法的K值设为3。1.NBA球员分类K-均值K-均值算法流程K-均值算法的基本思想是:以空间中K个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果,大概就是这个意思,“物以类聚、人以群分”。具体流程如下:步骤1:从N个样本数据中随机选取K个对象,作为初始的聚类中心;步骤2:分别计算每个样本点到各个聚类中心的距离,并逐个分配到距离其最近的簇中;步骤3:所有对象分配完成后,更新K个聚类中心位置,聚类中心定义为簇内所有对象在各个维度的均值;步骤4:与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转至步骤2,否则转至步骤5;步骤5:当类中心不再发生变化,停止执行。下图演示了2轮K-均值算法的迭代过程,最终聚类趋于稳定。K-均值Sklearn库的KMeans类提供了K-均值算法接口,定义如下:classsklearn.cluster.KMeans(n_clusters=8,init='k-means++',**kargs)参数n_clusters:int,默认值8聚类数。init:{‘k-means++’,‘random’},默认值=‘k-means++’初始化方法。通常n_clusters需要可视化方法分析聚类结果,评价后选择最佳值。K-均值1.3

任务实施1.3.3数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:步骤2:转换“得分”、“罚球命中率”、“命中率”、“三分命中率”字段到[0,1]区间。对于数据矩阵X,归一化公式如下:

1.NBA球员分类1.3

任务实施X_scaled=minmax_scale(players[['得分','罚球命中率','命中率','三分命中率']])X_scaled按“SHIFT+Enter”,运行结果如下:从结果可以看出,这4个字段值变换到[0,1]区间。1.NBA球员分类1.3

任务实施1.3.4参数查找步骤1:定义2级标题。##<fontcolor="black">参数查找</font>按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤2:初始化不同n_clusters参数值的K-均值模型,用轮廓系数评价模型性能,找到最优参数。n_clusters对应K-均值算法的K。S=[]#存储不同簇的轮廓系数K=range(2,11)forkinrange(2,11): kmeans=KMeans(n_init="auto",init="k-means++",n_clusters=k,random_state=0) kmeans.fit(X_scaled)1.NBA球员分类1.3

任务实施 labels=kmeans.labels_ #计算轮廓系数 sil_score=silhouette_score(X_scaled,labels,metric='euclidean') S.append(sil_score)接上KMenas为什么设置init=”k-means++”?K-Means++是为K-均值算法选择初始值(或“种子”)的算法,避免标准K-均值算法有时发现的较弱聚类。KMeans设置init=”k-means++”将在初始化时启用K-Means++算法选择有利于聚类的聚类中心。1.NBA球员分类轮廓系数轮廓系数(Silhouette)是一个衡量一个样本与它所属聚类相较于其它聚类的相似程度。取值范围-1到1,值越大表明这个结点更匹配其属聚类而不与相邻的聚类匹配。如果大多数样本都有很高的轮廓系数值,那么聚类适当。若许多点都有低或者负的值,说明K过大或过小。在Sklearn库中,silhouette_score函数输入数据集和分类,输出所有样本的平均轮廓系数。sklearn.metrics.silhouette_score(X,labels,**kwds)参数X:array样本之间的成对距离数组或特征数组。labels:array每个样本的预测标签。1.3

任务实施步骤3:可视化K值对聚类的性能影响。#设置绘图风格plt.style.use('ggplot')#绘制K的个数与轮廓系数的关系plt.plot(K,S,'b*-')plt.xlabel('簇的个数')plt.ylabel('轮廓系数')1.NBA球员分类1.3

任务实施按“SHIFT+Enter”,运行结果如下:表明K=3聚类效果最好。1.NBA球员分类1.3

任务实施1.3.5聚类可视化步骤1:定义2级标题。##<fontcolor="black">聚类可视化</font>按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤2:将球员数据集分成3类。kmeans=KMeans(n_init="auto",init="k-means++",n_clusters=3,random_state=0)kmeans.fit(X_scaled)按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤3:找到聚类中心。#将聚类结果标签插入到数据集players中players['cluster']=kmeans.labels_centers=[]#存储簇中心foriinplayers.cluster.unique(): centers.append(players.loc[players.cluster==i,['得分','罚球命中率','命中率','三分命中率']].mean()) #将列表转换为数组,便于后面的索引取数 centers=np.array(centers)1.NBA球员分类1.3

任务实施步骤4:可视化聚类结果。#绘制散点图sbn.lmplot(x='得分',y='命中率',hue='cluster',data=players,markers=['^','s','o'],fit_reg=False,scatter_kws={'alpha':0.8},legend=False)#添加簇中心plt.scatter(centers[:,0],centers[:,2],c='k',marker='*',s=180)plt.xlabel('得分')plt.ylabel('命中率')1.NBA球员分类1.3

任务实施按“SHIFT+Enter”,运行结果如下:从聚类结果可以看出,聚类中心点位于簇的中心位置。1.NBA球员分类1.3

任务实施1.3.6簇分析步骤1:定义2级标题。##<fontcolor="black">簇分析</font>按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤2:统计各簇中的样本数。pd.Series(kmeans.labels_).value_counts()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤3:第1类球员得分低但命中率高,推测为上场及进攻次数较少的新秀。res0Series=pd.Series(kmeans.labels_)res0=res0Series[res0Series.values==0]players.iloc[res0.index].head()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤4:第2类球员得分低且命中率也不高,推测为得分能力不强的组织型球员。res0Series=pd.Series(kmeans.labels_)res0=res0Series[res0Series.values==1]players.iloc[res0.index].head()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类1.3

任务实施步骤5:第3类球员得分高、命中率高,推测为球队的进攻核心。res0Series=pd.Series(kmeans.labels_)res0=res0Series[res0Series.values==2]players.iloc[res0.index].head()按“SHIFT+Enter”,运行结果如下:1.NBA球员分类知识点K-均值算法优缺点优点1)算法思想简单,收敛速度快;2)主要需要调参的参数仅仅是K;3)算法的可解释度比较强。缺点1)采用迭代方法,聚类结果往往收敛于局部最优而得不到全局最优解;2)对非凸形状的类簇识别效果差;3)易受噪声、边缘点、孤立点影响;4)可处理的数据类型有限,对于高维数据对象的聚类效果不佳。根据国家统计局发布的2019年全国31个省(市、自治区)居民人均消费支出数据,涵盖食品烟酒、衣着、居住、生活用品及服务、交通通信、教育文化娱乐、医疗保健等方面,使用K-均值算法划分地区到簇,分析每个簇的具体含义。详细的字段描述见下表。2.1任务描述2.地区消费分类2.1任务描述根据各地区的消费数据,使用K-均值算法聚类31个省市,分析簇代表的地区特点。任务目标2.地区消费分类字段类型允许为空标签?例子地区str否是北京消费支出(元)float否否43038.3食品烟酒(元)float否否8488.5衣着(元)float否否8488.5居住(元)float否否8488.5生活用品及服务float否否8488.5交通通信(元)float否否8488.5教育文化娱乐(元)float否否8488.5医疗保健(元)float否否8488.5其他(元)float否否8488.52.2

任务分解import方式引入依赖的模块文件读入DataFrame对象,观察特征值删除与聚类无关的字段“地区”依赖库导入数据观察数据清洗从探查数据内容开始,通过数据清洗和数据转换加工原始数据,使用轮廓系数评价聚类性能,找到K-均值算法的最优K值。2.地区消费分类2.2

任务分解特征归一化到(0,1)区间训练和选择降维前后的K-均值模型,分析簇代表的地区用图表展示样本分布和所属的簇,分析聚类结果数据转换聚类可视化分析接上2.地区消费分类2.3

任务实施2.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:导入依赖库。importpandasaspdimportmatplotlibasmplimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportminmax_scale,StandardScalerfromsklearn.decompositionimportPCAfromsklearn.clusterimportKMeans,DBSCANfromsklearn.metricsimportsilhouette_scoreimportnumpyasnp2.地区消费分类2.3

任务实施2.3.2数据观察文件读入DataFrame对象后,观察字段内容。步骤1:定义2级标题。##<fontcolor="black">数据观察</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:检查前5个样本。rawdata_df=pd.read_csv("../data/2019各省居民平均消费支出.csv")rawdata_df.head()2.地区消费分类按“SHIFT+Enter”,运行结果如下:2.3

任务实施2.3.3数据清洗步骤1:定义2级标题。##<fontcolor="black">数据清洗</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:删除与聚类无关的字段“地区”。X=rawdata_df.drop(["地区"],axis=1)X.head()2.地区消费分类按“SHIFT+Enter”,运行结果如下:2.3

任务实施2.3.4数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:转换字段值到[0,1]区间。X_scaled=minmax_scale(X)X_scaled[0:5,:]2.地区消费分类按“SHIFT+Enter”,运行结果如下:从结果可以看出,现在所有字段的值位于[0,1]区间。2.3

任务实施2.3.5聚类步骤1:定义2级标题。##<fontcolor="black">聚类</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:用数据集的所有字段训练K-均值模型,评价聚类的平均轮廓系数。kmeans=KMeans(n_init="auto",init="k-means++",n_clusters=3,random_state=0)kmeans.fit(X_scaled)labels=kmeans.labels_silhouette_score(X_scaled,labels,metric='euclidean')2.地区消费分类按“SHIFT+Enter”,运行结果如下:2.3

任务实施步骤3:降低数据维度到2。pca=PCA(n_components=2,random_state=51592)X_decomposed=pca.fit_transform(X_scaled)2.地区消费分类步骤4:数据降维后再次测试K-Means聚类模型的性能。kmeans=KMeans(n_init="auto",init="k-means++",n_clusters=3,random_state=0)kmeans.fit(X_decomposed)2.3

任务实施labels=kmeans.labels_silhouette_score(X_decomposed,labels,metric='euclidean')接上2.地区消费分类按“SHIFT+Enter”,运行结果如下:比较降维前后2次聚类模型的轮廓系数,可以发现降维后的聚类模型效果更好,因此下面就使用降维后的聚类模型。2.3

任务实施步骤5:数据集添加聚类标签。rawdata_df["类"]=labelsrawdata_df.sort_values(by="类",axis=0)#相同标签样本放在一起2.地区消费分类按“SHIFT+Enter”,运行结果如下:2.3

任务实施2.地区消费分类从上面结果看出,按照平均消费支出全国地区分为3类:(1).特大型城市:北京、上海。(2).经济发达省市:广东、浙江、江苏、天津。(3).发展中省市:河南、青海、甘肃等。2.3

任务实施2.3.6可视化分析步骤1:定义2级标题。##<fontcolor="black">可视化分析</font>按“SHIFT+Enter”,运行结果如下:2.地区消费分类2.3

任务实施步骤2:获取各类样本的索引。class0_idx=rawdata_df[rawdata_df["类"]==0].index.valuesclass1_idx=rawdata_df[rawdata_df["类"]==1].index.valuesclass2_idx=rawdata_df[rawdata_df["类"]==2].index.values2.地区消费分类按“SHIFT+Enter”,运行结果如下:2.3

任务实施2.地区消费分类步骤3:设置Matplotlib正常显示中文字符和负号。mpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False步骤4:可视化聚类结果。plt.scatter(X_decomposed[class0_idx,0],X_decomposed[class0_idx,1],marker='.',color='c',s=50,label="发展中省市")plt.scatter(X_decomposed[class1_idx,0],X_decomposed[class1_idx,1],marker='o',color='g',s=50,label='特大省市')2.3

任务实施plt.scatter(X_decomposed[class2_idx,0],X_decomposed[class2_idx,1],marker='v',color='r',s=50,label='经济发达省市')接上2.地区消费分类按“SHIFT+Enter”,运行结果如下:从聚类结果可以看出,3种样本分别散布在不同区域。图像有N个像素点,含有M种颜色。使用K-Means算法把N个像素点聚成K类,找出K个中心点。使用每个像素点所在的簇的中心点来覆盖原有的颜色值。这样,N个像素点带有的M种颜色取值,就被压缩了到K种颜色值。3.1任务描述3.图像矢量量化给定一张彩色图片,使用K-均值算法聚类像素点,像素点的颜色值用所属簇的中心点值代替,比较分析压缩后的图片大小。任务目标3.2

任务分解import方式引入依赖的模块图片读入Numpy对象,观察像素类型、数据维度、取值范围、颜色数等属性像素值归一化到(0,1)区间,数据转换到2维空间依赖库导入数据观察数据转换从探查数据内容开始,通过数据转换加工原始数据,训练K-均值模型,用聚类中心值代替像素点的颜色值,可视化分析矢量量化结果。3.图像矢量量化3.2

任务分解K-均值算法在像素点组成的数据集上训练聚类模型像素点的颜色值用所属聚类的中心点值代替比较替换前后图片的视觉效果和文件大小模型训练像素值替换可视化分析接上3.图像矢量量化3.3

任务实施3.3.1依赖库导入步骤1:定义2级标题。##<fontcolor="black">依赖库导入</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:导入依赖库。importpandasaspdimportmatplotlibasmplimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansimportnumpyasnpfromsklearn.utilsimportshufflefromos.pathimportgetsize3.图像矢量量化3.3

任务实施3.3.2数据观察步骤1:定义2级标题。##<fontcolor="black">数据观察</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:图片读入Numpy对象,查看像素值类型、图片大小、像素值范围、颜色数等图片特征。china=plt.imread('../data/china.jpg')print('像素值类型:',china.dtype)print('图片大小:',china.shape)print('颜色最小值:{},颜色最大值:{}'.format(china.min(),china.max()))newimage=china.reshape((-1,3))print("图片颜色数:",pd.DataFrame(newimage).drop_duplicates().shape)3.图像矢量量化3.3

任务实施3.图像矢量量化按“SHIFT+Enter”,运行结果如下:步骤3:图片保存到压缩文件。np.savez_compressed("china.npz",pic=china)按“SHIFT+Enter”,在当前目录看到压缩文件“china.npz”。3.3

任务实施3.3.3数据转换步骤1:定义2级标题。##<fontcolor="black">数据转换</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:转换像素值到[0,1]区间。china=np.array(china,dtype=np.float64)/china.max()3.图像矢量量化步骤3:3维矩阵转换到2维空间。w,h,d=china.shapeimage_array=np.reshape(china,(-1,d))按“SHIFT+Enter”,检查输出无异常。按“SHIFT+Enter”,检查输出无异常。3.3

任务实施3.3.4模型训练步骤1:定义2级标题。##<fontcolor="black">模型训练</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:使用K-Means算法在像素点上训练聚类模型。kmean_model=KMeans(n_clusters=64,n_init="auto",random_state=0)kmeans=kmean_model.fit(image_array)3.图像矢量量化按“SHIFT+Enter”,检查输出无异常。3.3

任务实施3.3.5像素值替换步骤1:定义2级标题。##<fontcolor="black">像素值替换</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:K-Means模型预测每个像素点隶属的聚类。labels=kmeans.predict(image_array)3.图像矢量量化步骤3:像素点的颜色值用聚类中心值代替。image_kmeans=np.zeros((w*h,d))foriinrange(w*h):

image_kmeans[i]=kmeans.cluster_centers_[labels[i]]"K-Means矢量图颜色数:{}".format(pd.DataFrame(image_kmeans).drop_duplicates().shape)3.3

任务实施从结果可以看出,经过像素值替换的K-Means矢量图只有64种颜色。3.图像矢量量化按“SHIFT+Enter”,运行结果如下:3.3

任务实施3.3.6可视化分析步骤1:定义2级标题。##<fontcolor="black">可视化分析</font>按“SHIFT+Enter”,运行结果如下:3.图像矢量量化3.3

任务实施步骤2:恢复矢量图到3维空间。image_kmeans=image_kmeans.reshape(w,h,d)*china.max()3.图像矢量量化步骤3:保存矢量图到压缩文件。np.savez_compressed("china_kmeans.npz",pic=image_kmeans)print("原图压缩文件大小:{}".format(getsize("china.npz")))print("矢量图压缩文件大小:{}".format(getsiz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论