K-Means属于聚类算法的一种。聚类又属于无监督学习的一种,无监督的算法在训练的时候只需要特征矩阵X,不需要标签。
聚类的目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务 需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。比如在商业中,如果我们手头有大量 的当前和潜在客户的信息,我们可以使用聚类将客户划分为若干组,以便进一步分析和开展营销活动。
可以看出,聚类的最终目的是分类,但是聚类和分类的区别在于:分类是由训练集和测试集的,也就是说事先我们已经有了一部分的带标签的数据(带有分好类别的数据),其任务是根据给定的训练集来对测试集进行分类,这些测试数据集的类别是固定的,它一定会属于某一个类别;而聚类的不同在于它没有所谓的训练集和测试集,并且事先我们也不知道每条数据属于什么类别、属于哪一类,以及一共有多少类,这些信息都是事先无所知的,其任务是按照某种方式,将这类数据按照其相似性,将其分为不同的簇,每一簇的相似性较高,而不同簇的相似度较低。下面一个图形象地展示了其二者的不同之处:
总的来讲:
聚类的核心是:将数据分成多个组,探索每个组的数据是否有联系;
分类的核心是:从已经分组的数据中去学习,把新数据放到已经分好的组中。
聚类的算法有: 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可能设定得 太大或者太小.