首页 > 编程知识 正文

python聚类的结果显示,Python聚类评价

时间:2023-05-03 15:10:22 阅读:162869 作者:862

1 聚类算法简要介绍

1.1什么是聚类

聚类是机器学习中重要的无监督算法,可以将数据点归纳成一系列特定的组合。 聚类算法可以将数据点归入不同的类中,揭示数据集包含的不为人知的规律,以指导我们的生产和生活。 简单来说,聚类就是将对象分组,将相似的对象组合在一起。 其实我对聚类并不熟悉,我们常说的“物以类聚,人以群分”就是聚类。

1.2聚类算法的应用场景

当群集作为单独的进程时,它用于查找数据本身中的“分布结构”定律。 例如,可应用集群,结合已知移动客户位置数据,为餐饮连锁新店选址提供参考。

聚类可以用于监控学习的数据前期准备,也可以用于后期数据的进一步细化。

2 通俗地讲聚类算法的过程

聚类算法是无监督学习的典型算法,其中k均值算法是其中最典型的算法。 k均值算法需要预先设置群集数k,并在算法收敛或达到预设阈值之前持续更新群集中心。 简单总结了k均值算法的过程如下。

(1)从包含n个点的数据集中任意选择k个对象作为初始聚类中心。

)2)计算从)1)中设定的k个聚类中心到各数据点到这k个中心的距离。

(3)步骤)2)的距离计算后,各数据点拥有与这k个集群中心的距离值。 这些距离远的和近的,把数据点和离它最近的集群中心归为一类。

(4) )之后,数据集被分类为k个簇。

(5)重复(步骤)和(4),分类稳定或分类变化量小时停止重复。

2.1相似度用距离衡量

聚类是根据数据的相似度,按照类内部数据相似度大、类间相似度小的方式分类成多个类。 这个“相似度”用距离表示。 距离越大,相似度越小,距离越小,相似度越大。 最常见的距离是“明亮的书的距离”:

)当时,亮书不等式是高中数学中的距离,即欧式距离。

)当时,亮书不等式是曼哈顿距离。

(3)当时,亮书不等式是yjfdj距离。

2.2聚类性能如何衡量?

评估绩效的方法有以下两种。

(1)数据集包含标签信息。 数据可能包含标签信息,但原始数据包含正确的分类信息。 然而,对数据进行聚类时,可以考虑使用调整wndrg系数[ari]的指标。 ARI指标和有监督学习中的精度比较相似,可以用sklearn模块的metrics调用。

)2)数据不包含标签信息。 如果不包含属于数据集的类别信息,可以考虑使用轮廓因子评估聚类效果。 关于轮廓系数,将在后面叙述。 一般来说,轮廓系数越大聚类效果越好。 可以通过在sklearn模块的metrics中调用silhouette_score来实现轮廓系数。

2.3具体算法介绍: k均值算法

k均值算法是聚类算法中最简单、最常用的,其算法过程如下。

(1)随机选择数据集内的k个初始点作为聚类中心。

)2)对于数据集的每个点,)在1 )中查找最近的聚类中心,将数据集距离哪个中心最近分配给与该聚类中心对应的聚类。

(3)通过(2)之后,原始数据集被分类为k个聚类。 此时,计算各聚类的平均值,将该平均值作为新的聚类中心。

(4)转至步骤(5)和(6)3),在集群中心没有改变或者变化很小的时候关闭。

k均值算法中k个初始聚类中心是随机选取的,一个自然的问题是不同的初始聚类中心不影响最终得到的聚类结果。 答案是肯定的。 在实际问题中,合理的是根据具体实际问题选择合理的k值。

仔细考虑k均值算法的过程,随机选择k个点作为初始聚类中心确实会影响聚类结果。 这也是k均值算法的缺陷。 因此,k均值算法改善了这个问题。

2.4具体算法介绍: k均值算法

针对k均值算法随机选取k个初始点的问题,寂寞白猫等人在2007年提出了k算法。 k均值解决这个问题的中心思想是,初始集群中心不是随机选择的,而是希望知道k个初始集群中心越远越好。 整个算法过程如下。

)1)随机选取一个初始点作为第一个聚类中心,为了便于描述,记为点a。

)2)首先,计算除了a点之外的所有数据点与a点的距离,并注明如果数据集包含n个点,则得到的距离值应为n-1。 其次,剩下的这n-1个点成为下一个聚类中心的概率。

(2) )计算各数据点与当前现有集群中心中,夹住自己最近的集群中心的距离)初始时,集群中心只有a点,步骤)2) )。 然后计算数据点被选择到下一个聚类中心的概率p(p的计算是(2)已经给定的) ) )。

)3)用轮盘法选择下一个聚类

心。(何为轮盘法,后面会说)

(4)重复步骤(2)'和(3)直至选出K个聚类中心。

(5)K个聚类中心选出来了以后,就可以用经典的K-means算法了。

下面,采用一个简单的例子来熟悉上述过程:

假设我们有一个数据集,为了方便采用二维的点集,数据集中共有8个样本,如下图所示:

首先是随机选取一个初始聚类中心,我们不妨选择1号点,那么选取第二个聚类中心的计算过程如下表所示:

K-means++示例数据 序号123456780000.3140

    其中,表示数据与初始选的第一个聚类中心1号点的距离,表示数据点被选为下一个聚类中心的概率,是概率的累计值。用轮盘法选出下一个聚类中心:

      首先为每一个数据点确定一个其所在的区间,例如2号点所在的区间为[0.034,0.102),3号点所在的区间为[0.102,0.136),4号点所在的区间为[0.136,0.178),这样确定下去。接下来产生一个0~1之间的一个随机数,随机数在哪个区间中,就选取对应的哪个数据点作为第二个聚类中心。

当完成K个聚类中心的选取了以后,就可以使用经典的K-means算法了。

3  机器学习库sklearn实战——K-means算法

为了方便,使用sklearn.datasets.make_blobs()生成聚类所需要的数据。make.blobs()函数可以根据指定的特征变量数量类簇聚类中心数量等参数生成指定类别的数据,用于测试聚类算法的效果,make.blobs()的参数声明可查询有关的资料。

首先导入所需要用到的包:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansfrom sklearn.datasets import make_blobsfrom matplotlib.font_manager import FontProperties

使用make_blobs生成聚类所需要的样本数据:

#样本数据量为300,类簇数量为4,每一个簇内样本标准差为0.50,X,y=make_blobs(n_samples=300,centers=4,cluster_std=0.50,random_state=0) #X:300行2列的数据

根据生成的样本数据,开始进行聚类运算:

#将类簇数量遍历1~10,以便于后面找到合适的K值list1=[]for i in range(1,11): kmeans=KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0) #初始化聚类中心的方式为K-means++,最大迭代次数为300,算法运行次数为10次,随机数种子为0 kmeans.fit(X) #训练数据 list1.append(kmeans.inertia_) #将每次循环训练数据时,聚类得到的每一个类簇的误差平方和添加到列表中

看看list1的结果:

print('十次结果的误差平方和:',list1)#运行结果:十次结果的误差平方和: [2746.776260520676, 1121.4338468225149, 477.68455404063826, 147.2263862575243, 131.1318469883225, 119.16725404063813, 106.51193704849615, 96.12264557325749, 86.52582034564936, 78.70960563748244]

为了图形的可视化出现的有关标签以中文以及负号显示,需要设法使得pyplot支持中文和负号:

plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False

下面开始绘制误差随着K值(1~10)变化的图像:

plt.ylim(0,max(list1)) #设置y轴的范围plt.xlim(0,11) #设置x轴的范围plt.plot(range(1,11),list1,c='r')plt.title('误差随着K的变化曲线')plt.show()

图像显示结果如下:

 从图中可以看出,K取4的时上述曲线出现拐点同时曲线自此以后下降量都很小了。因此可以考虑以K=4进行聚类:

#以K=4进行聚类:new_kmeans=KMeans(n_clusters=4,init='k-means++',max_iter=300,random_state=0)result_y=new_kmeans.fit_predict(X) #对特征数据的聚类结果储存在result_y中print(result_y) #打印测试#结果:[0 2 1 2 0 0 3 1 2 2 3 2 1 2 0 1 1 0 3 3 0 0 1 3 3 1 0 1 3 1 2 2 1 2 2 2 2 2 3 0 1 3 1 1 3 3 2 3 2 0 3 0 2 0 0 3 2 3 2 0 2 1 2 3 3 3 2 0 2 3 1 3 2 3 3 2 3 1 0 2 0 1 0 0 2 1 0 1 2 2 1 0 2 3 3 1 0 0 1 3 2 0 2 0 1 0 0 1 2 1 3 3 0 2 0 1 2 0 0 1 3 0 3 0 0 0 0 3 0 3 2 3 3 0 2 3 3 2 1 2 2 3 1 3 1 3 2 1 2 2 2 1 2 1 0 3 2 3 0 1 2 1 1 0 1 3 3 1 0 1 1 2 0 1 3 2 0 0 1 3 0 1 3 3 1 1 1 1 0 2 1 3 1 1 3 3 3 1 3 2 1 3 0 3 1 2 3 2 1 2 1 3 1 1 2 3 3 0 0 1 2 0 0 3 0 3 1 2 2 1 1 2 1 0 3 1 0 3 2 3 0 1 0 2 2 2 2 3 3 2 1 3 0 1 3 3 3 0 0 2 1 1 3 0 2 3 1 2 1 0 0 3 3 1 0 0 0 1 2 2 0 0 1 0 0 0 2 3 2 1 0 0 2 2 2 0 0 1 2 3]

聚类中心:

denters=new_kmeans.cluster_centers_ #聚类中心print('聚类中心:',denters) #打印测试#运行结果:聚类中心: [[ 1.99469693 0.8727049 ] [ 0.95415778 4.39985544] [-1.35241261 7.76731726] [-1.57480456 2.84532424]]

绘制K=4聚类的图像:

#绘制图形:fig=plt.figure(figsize=(90,8))ax1=plt.subplot(131)ax1.scatter(X[:,0],X[:,1])ax1.scatter(denters[:,0],denters[:,1],c='r',s=100)plt.title('K=4的聚类结果')plt.show()

运行结果如下图所示:

 从图像中,可以看出,K=4时聚合效果较好。

        当然,在选择K时,不局限于上述方法。还可以用sklearn模块的metrics中的函数adjusted_rand_score计算ARI找到合适的K进行聚类。不过需要注意的是该方法只适用于数据集含有正确分类标签的情形。当数据集不含分类标签时候,除了上述方法以外,还可以用轮廓系数与K的变化关系情况开选择合适的K值,当轮廓系数最大时,对应的就是最合适的K值。轮廓系数可以通过sklearn库的metrics中的silhouette_score函数进行计算。上述提到的sklearn.metrics中的两个函数可查阅有关资料了解参数声明,此处不再展开说明。

初学Python两个月,对python进行数据分析和机器学习等等方面比较感兴趣,借此机会想和大家一起分享所得和交流有关方面,文中肯定有许多不足之处,望各位大佬多多指教。

本文写作过程中主要参考了以下资料:

1.《Python 数学实验与建模》——坚定的石头、cqdlq

2.《Python数据分析从入门代实践》——jydfs、mrdl

3.《从0开始机器学习的数学原理和算法实践》——zddfh

4.《Scikit-learn机器学习详解》——zydm、真实的店员

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。