点击上方码农的后花园”,选择星标” 公众号

精选文章,第一时间送达

之前讲解了有监督学习分类算法KNN,这期讲解无监督学习聚类算法K-Means(也称K-平均,K-均值),我们知道KNN和K-Means区别主要有两点: KNN是有监督,K-Means无监督,KNN是分类算法,K-Means是聚类算法。

预热

监督学习和无监督学习

对于"监督学习"(supervised learning),其训练样本是带有标记信息,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。

“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的是“聚类”。

分类算法和聚类算法

分类算法:是指对已知类别的数据进行模型训练,获取不同类别的相关特征,然后使用训练好的模型对新的数据进行已有类别的概率预测,选取预测概率最大的类别为该预测样本的类别。

聚类算法:聚类的目的也是把数据分类,但是事先我们是不知道如何去分的(类别未知),完全是算法自己来判断各条数据之间的相似性,相似的就放在一起。在聚类的结论出来之前,我完全不知道每一类有什么特点,一定要根据聚类的结果通过人的经验来分析,看看聚成的这一类大概有什么特点。

总结:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来。

聚类

‍‍“聚类算法”试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster),通过这样的划分,每个簇可能对应于一些潜在的概念或类别。如下图是未做标记的样本集:

通过他们的分布,我们很容易对上图中的样本做出以下几种划分。

当需要将其划分为两个簇时,即 K =2 时:

 

当需要将其划分为四个簇时,即 K =4 时:

那么计算机是如何进行这样的划分的呢?这就需要聚类算法来进行实现了。聚类算法有几十种,本文对聚类算法中最常用的K-Means进行讲解。

‍‍

K-Means算法图解

假设我们有6个点,从图上看应该分成两堆儿,前三个点一堆儿,后三个点是另一堆儿。现在手工执行K-Means,体会一下过程,同时看看结果是不是和预期一致。

1.选择初始大哥: 随机选择,我们就选P1和P2

2.计算小弟和大哥的距离:P3到P1的距离从图上也能看出来(勾股定理),是√10 = 3.16;P3到P2的距离√((3-1)^2+(1-2)^2 = √5 = 2.24,所以P3离P2更近,P3就跟P2混。同理,P4、P5、P6也这么算,如下:

round1

P3到P6都跟P2更近,所以第一次站队的结果是:

  • 组A:P1

  • 组B:P2、P3、P4、P5、P6

3.人民代表大会: 组A没啥可选的,大哥还是P1自己,组B有五个人,需要选新大哥,这里要注意选大哥的方法是每个人X坐标的平均值和Y坐标的平均值组成的新的点,为新大哥,也就是说这个大哥是“虚拟的”。因此,B组选出新大哥的坐标为:P哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。综合两组,新大哥为P1(0,0),P哥(6.2,5.6),而P2-P6重新成为小弟。

4.再次计算小弟到大哥的距离

round2

这时可以看到P2、P3离P1更近,P4、P5、P6离P哥更近,所以第二次站队的结果是:

  • 组A:P1、P2、P3

  • 组B:P4、P5、P6(虚拟大哥这时候消失)

5.第二届人民代表大会: 按照上一届大会的方法选出两个新的虚拟大哥:P哥1(1.33,1) P哥2(9,8.33),P1-P6都成为小弟。

6.第三次计算小弟到大哥的距离

round3

这时可以看到P1、P2、P3离P哥1更近,P4、P5、P6离P哥2更近,所以第二次站队的结果是:

  • 组A:P1、P2、P3

  • 组B:P4、P5、P6

我们发现,这次站队的结果和上次站队结果没有任何变化,说明已经收敛,聚类结束,聚类结果和我们最开始设想的结果完全一致。

K-Means算法思想

K-Means聚类算法是聚类算法之一,其中K表示类别的数量,即我们想要将数据分成几个类别,Means表示均值。K值决定了初始质心(通常是随机选择的中心)的数量,K值是几,必须有几个质心。简而言之,K-Means聚类算法是一种通过均值聚类数据点的算法。

实现过程

先从数据样本集中随机选取k个样本作为族中心,并计算所有样本与这 k 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。

实现kmeans算法的主要三点:

  (1)簇个数 k的选择,k为常数,需要事先设定
  (2)各个样本点到“簇中心”的距离
  (3)根据新划分的簇,更新“簇中心”

K-Means算法是将没有标注的 M 个样本通过迭代的方式聚集成K个簇,在对样本进行聚集过程中往往是以样本之间的距离作为指标划分。

K-Means算法要点是簇个数K的选择和距离度量,最优K值可通过肘部法则决定,距离一般采用欧式距离。

代码实现

如下图,采用聚类算法对该样本点进行5种划分聚类,即K=5个族。

聚类结果如下图所示:

代码:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs  # 导入产生模拟数据的方法
from sklearn.cluster import KMeans


# 1. 产生模拟数据
k = 5
X, Y = make_blobs(n_samples=1000, n_features=2, centers=k, random_state=1)


# 2. 模型构建
km = KMeans(n_clusters=k, init='k-means++', max_iter=30)
km.fit(X)


# 获取簇心
centroids = km.cluster_centers_
# 获取归集后的样本所属簇对应值
y_kmean = km.predict(X)


# 呈现未归集前的数据
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.yticks(())
plt.show()


#归集后的数据集呈现
plt.scatter(X[:, 0], X[:, 1], c=y_kmean, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='black', s=100, alpha=0.5)
plt.show()

Ending

前面说到过,KNN和K-Means听起来有些像,但本质是有区别的,这里我们就顺便说一下两者的异同吧。

相同:

  1. K值都是重点

  2. 都需要计算平面中点的距离

相异:KNN和K-Means的核心都是通过计算空间中点的距离来实现目的,只是他们的目的是不同的。KNN的最终目的是分类,而Kmeans的目的是给所有距离相近的点分配一个类别,也就是聚类。

简单说,就是画一个圈,KNN是让进来圈子里的人变成自己人,Kmeans是让原本在圈内的人归成一类人。

总结: K-Means是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。

参考:

https://www.cnblogs.com/lliuye/p/9144312.html

https://blog.csdn.net/qq_30377909/article/details/94596305

https://blog.csdn.net/sinat_36710456/article/details/88019323

https://blog.csdn.net/u013850277/article/details/88411966

完整代码下载,后台回复关键字项目实战 , 即可获取使用。

                                                     分享给更多朋友,转发,点赞,在看

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐