KNN和K-Means傻傻分不清?图解K-Meams算法
点击上方“码农的后花园”,选择“星标”公众号精选文章,第一时间送达之前讲解了有监督学习分类算法KNN,这期讲解无监督学习聚类算法K-Means(也称K-平均,K-均值),我们知道KNN和...
点击上方“码农的后花园”,选择“星标” 公众号
精选文章,第一时间送达
之前讲解了有监督学习分类算法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听起来有些像,但本质是有区别的,这里我们就顺便说一下两者的异同吧。
相同:
K值都是重点
都需要计算平面中点的距离
相异: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
完整代码下载,后台回复关键字:项目实战 , 即可获取使用。
分享给更多朋友,转发,点赞,在看
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)