|
K-Means聚类一般根据群体的某些标签值或某些属性,对群体进行分组,属于无监督学习。
1. 聚类与分类
聚类与分类最大的区别就是,聚类就是在未知分类规则的情况下对样本集进行分群,分类就是在特征空间中用已知的规则对样本进行判别或者预测。
分类:对于分类来说,在对数据集分类时,我们是知道这个数据集是有多少种类的,比如对用户进行性别分类,我们会下意识很清楚知道分为“男”,“女”两类。
聚类:而对于聚类来说,在对数据集操作时,我们是不知道该数据集包含多少类,我们要做的,是将数据集中相似的数据归纳在一起。比如预测用户的好朋友团体,我们不知道用户和谁玩的好玩的不好,我们通过他们的相似度进行聚类,聚成n个团体,这就是聚类。
2. 算法步骤
聚类算法有很多种(几十种),K-Means是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
下面,我们描述一下K-means算法的过程,为了尽量不用数学符号,所以描述的不是很严谨,大概就是这个意思,“物以类聚、人以群分”:
1.首先输入k的值,即我们希望将数据集经过聚类得到k个分组;
2.从数据集中随机选择k个数据点作为初始大哥(质心,Centroid);
3.对集合中每一个小弟,计算与每一个大哥的距离(距离的含义后面会讲),离哪个大哥距离近,就跟定哪个大哥;
4.这时每一个大哥手下都聚集了一票小弟,这时候召开人民代表大会,每一群选出新的大哥(其实是通过算法选出新的质心);
5.如果新大哥和老大哥之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止;
6.如果新大哥和老大哥距离变化很大,需要迭代3~5步骤。
3. 举个例子 —— 公式计算
下图 P1(0,0)、P2(1,2)、P3(3,1)、P4(8,8)、P5(9,10)、P6(10,7) 6个点,从坐标轴上看应该分成两组,前三个点P、P2、P3一组,后三个点P4、P5、P6 一组。现在手工执行K-Means,体会一下过程,同时看看结果是否和预期一致。
选择初始大哥: 我们就选P1和P2
计算小弟和大哥的距离: P3到P1的距离从图上也能看出来(勾股定理),是√10 = 3.16;P3到P2的距离√((3-1)2+(1-2)2 = √5 = 2.24,所以P3离P2更近,P3就跟P2混。同理,P4、P5、P6也这么算,如下:
P3到P6都跟P2更近,所以第一次站队的结果是:
组A:P1
组B:P2、P3、P4、P5、P6
人民代表大会: 组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重新成为小弟
再次计算小弟到大哥的距离:
这时可以看到P2、P3离P1更近,P4、P5、P6离P哥更近,所以第二次站队的结果是:
组A:P1、P2、P3
组B:P4、P5、P6(虚拟大哥这时候消失)
第二届人民代表大会: 按照上一届大会的方法选出两个新的虚拟大哥:P哥1(1.33,1) P哥2(9,8.33),P1-P6都成为小弟
第三次计算小弟到大哥的距离:
这时可以看到P1、P2、P3离P哥1更近,P4、P5、P6离P哥2更近,所以第二次站队的结果是:
组A:P1、P2、P3
组B:P4、P5、P6
我们发现,这次站队的结果和上次没有任何变化了,说明已经收敛,聚类结束,聚类结果和我们最开始设想的结果完全一致。
4. 举个例子 —— python
- from sklearn.cluster import KMeans
- import numpy as np
- import matplotlib.pyplot as plt
- X = np.array([[0,0],[1,2],[3,1],[8,8],[9,10],[10,7]])# 接下来进行k-means聚类,random seed我们选择0,聚类的数目为2。# 方法fit_predict的作用是计算聚类中心,并为输入的数据加上分类标签。
- y_pred = KMeans(n_clusters=2, random_state=0).fit_predict(X)# 然后来通过图形化的手段展示一下聚类的效果,注意我们把其中一类着成红色,另外一类则着成绿色。
- plt.figure(figsize=(5,4))
- color =("red","green")
- colors=np.array(color)[y_pred]
- plt.scatter(X[:,0], X[:,1], c=colors)
- plt.show()
复制代码
- # 下面我们再演示fit方法的使用,它仅仅产生聚类中心(其实也就是建模),然后我们引入两个新的点,并利用已经建立的模型预测它们的分类情况。
- kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
- new_data = np.array([[3,3],[15,15]])
- colors2 = np.array(color)[kmeans.predict([[3,3],[15,15]])]
- plt.figure(figsize=(5,4))
- plt.scatter(new_data[:,0], new_data[:,1], c=colors2, marker='x')
- plt.show()
复制代码
5. 评价
优点:
原理比较简单,实现也是很容易,收敛速度快聚类效果较优算法的可解释度比较强主要需要调参的参数仅仅是簇数k
缺点:
K值的选取不好把握(手肘法,k与样本点到各点距离平方和做一条曲线)无法解决簇分布差别比较大的情况(比如不均衡样本),则聚类效果不佳采用迭代方法,会受迭代次数影响,得到的结果只是局部最优而不是全局最优对于离群点和噪音点敏感。例如在距离中心很远的地方手动加一个噪音点,那么中心的位置就会被拉跑偏很远初始值对结果影响较大,可能每次聚类结果都不一样
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|