【持续更新】Python机器学习——K-Means聚类

K-Means属于聚类算法的一种。聚类又属于无监督学习的一种,无监督的算法在训练的时候只需要特征矩阵X,不需要标签。

聚类的目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务 需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。比如在商业中,如果我们手头有大量 的当前和潜在客户的信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动。

可以看出,聚类的最终目的是分类,但是聚类和分类的区别在于:分类是由训练集和测试集的,也就是说事先我们已经有了一部分的带标签的数据(带有分好类别的数据),其任务是根据给定的训练集来对测试集进行分类,这些测试数据集的类别是固定的,它一定会属于某一个类别;而聚类的不同在于它没有所谓的训练集和测试集,并且事先我们也不知道每条数据属于什么类别、属于哪一类,以及一共有多少类,这些信息都是事先无所知的,其任务是按照某种方式,将这类数据按照其相似性,将其分为不同的簇,每一簇的相似性较高,而不同簇的相似度较低。下面一个图形象地展示了其二者的不同之处:

 

                                                                   (此图来源于菜菜的sklearn课堂)

总的来讲:

 聚类的核心是:将数据分成多个组,探索每个组的数据是否有联系;

 分类的核心是:从已经分组的数据中去学习,把新数据放到已经分好的组中。

聚类的算法有: K-Means,DBSCAN,层次聚类,广谱聚类

其中K-Means是聚类中最典型也是最简单的一种聚类算法。

K-Means核心概念词简介:

K-Means最终是要把数据分为几个类,这几个类在聚类中称为。簇的个数用K表示,这个k值是一个超参数,需要人为指定。

每个簇中所有数据的均值称为这个簇的质心

KMeans的核心任务就是根据我们设定好 的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。

具体流程为:

  • 随机抽取K个样本作为初始的质心(有时候为了加快聚类过程,也会人为指定初始质心)
  • 执行如下循环:

将每个样本点分配到离他们最近的质心,生成K个簇

对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心
 

  • 当质心的位置不再发生变化(在每次迭代中被分配到这个质心上的样本都是一 致的,即每次新生成的簇都是一致的,所有的样本点都不会再从一个簇转移到另一个簇,质心就不会变化了),迭代停止,聚类完成。

聚类算法追求“簇内差异小,簇外差异大”。而这个“差异“,由样本点到其所在簇的质心的距离来衡量。对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为这个簇中的样本越相似,簇内差异就越小。而距离的衡量方法有多种,令表示簇中的一个样本点, 表示该簇中的质心,n表示每个样本点中的特征数目,i表示组 成点 的每个特征,则该样本点到质心的距离可以由以下距离来度量:

其中每种方式所选取的最小化每个样本点到质心的方式分别为:

欧几里得距离 :均值 
曼哈顿距离 :中位数

余弦距离 :均值 

在python的sklearn当中,我们无法选择使用的距离,只能使用欧式距离。

基于Python的sklearn库实现K-Means示例:

# 导入数据集:在此使用sklearn库自己创建一个数据集

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 含有两个特征、4个簇的500条数据
X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

# 采用绘制子图的方式,看一下这些点的分布情况
fig,ax1=plt.subplots(1)
# 所有数据的第0列作为横坐标,第1列作为纵坐标,“o”作为标记,大小为8
ax1.scatter(X[:,0],X[:,1],marker='o',s=8)
plt.show()

# kmeans聚类

from sklearn.cluster import KMeans
# 先考虑聚类3类
n_clusters=3
cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(X)

y_pred=cluster.labels_
y_pred

 

模型评估指标:轮廓系数

KMeans的目标是确保“簇内差异小,簇外差异大”,我们就可以通过衡量簇内差异来衡量聚类的效 果。

在99%的情况下,我们是对没有真实标签的数据进行探索,也就是对不知道真正答案的数据进行聚类。这样的聚 类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。其中 轮廓系数是最常用的聚类算法的评价指标。它是对每个样本来定义的,它能够同时衡量:
1)样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离
2)样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中得所有点之间的平均距离 根据聚类的要求”簇内差异小,簇外差异大“,我们希望b永远大于a,并且大得越多越好。
单个样本的轮廓系数计算为:s=(b-a)/max(a,b)

理解轮廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样 本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相 似度一致,两个簇本应该是一个簇。
如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,则整个数据集的平均轮廓系数越 高,则聚类是合适的。如果许多样本点具有低轮廓系数甚至负值,则聚类是不合适的,聚类的超参数K可能设定得 太大或者太小.

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本程序是在python中完成,基于sklearn.cluster中的k-means聚类包来实现数据的聚类,对于里面使用的数据格式如下:(注意更改程序中的相关参数) 138 0 124 1 127 2 129 3 119 4 127 5 124 6 120 7 123 8 147 9 188 10 212 11 229 12 240 13 240 14 241 15 240 16 242 17 174 18 130 19 132 20 119 21 48 22 37 23 49 0 42 1 34 2 26 3 20 4 21 5 23 6 13 7 19 8 18 9 36 10 25 11 20 12 19 13 19 14 5 15 29 16 22 17 13 18 46 19 15 20 8 21 33 22 41 23 69 0 56 1 49 2 40 3 52 4 62 5 54 6 32 7 38 8 44 9 55 10 70 11 74 12 105 13 107 14 56 15 55 16 65 17 100 18 195 19 136 20 87 21 64 22 77 23 61 0 53 1 47 2 33 3 34 4 28 5 41 6 40 7 38 8 33 9 26 10 31 11 31 12 13 13 17 14 17 15 25 16 17 17 17 18 14 19 16 20 17 21 29 22 44 23 37 0 32 1 34 2 26 3 23 4 25 5 25 6 27 7 30 8 25 9 17 10 12 11 12 12 12 13 7 14 6 15 6 16 12 17 12 18 39 19 34 20 32 21 34 22 35 23 33 0 57 1 81 2 77 3 68 4 61 5 60 6 56 7 67 8 102 9 89 10 62 11 57 12 57 13 64 14 62 15 69 16 81 17 77 18 64 19 62 20 79 21 75 22 57 23 73 0 88 1 75 2 70 3 77 4 73 5 72 6 76 7 76 8 74 9 98 10 90 11 90 12 85 13 79 14 79 15 88 16 88 17 81 18 84 19 89 20 79 21 68 22 55 23 63 0 62 1 58 2 58 3 56 4 60 5 56 6 56 7 58 8 56 9 65 10 61 11 60 12 60 13 61 14 65 15 55 16 56 17 61 18 64 19 69 20 83 21 87 22 84 23 41 0 35 1 38 2 45 3 44 4 49 5 55 6 47 7 47 8 29 9 14 10 12 11 4 12 10 13 9 14 7 15 7 16 11 17 12 18 14 19 22 20 29 21 23 22 33 23 34 0 38 1 38 2 37 3 37 4 34 5 24 6 47 7 70 8 41 9 6 10 23 11 4 12 15 13 3 14 28 15 17 16 31 17 39 18 42 19 54 20 47 21 68 22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值