【机器学习】——聚类相关理论及性能度量

1. 聚类的概念

  聚类是一种无监督学习,即训练数据中是不含标签等标记信息的。聚类就是根据给定样本内部的特征,将其划分到若干个类别,每个类别就是一个簇,聚类的结果就是使得同一簇内的样本尽可能相似,即相似度较大,而不同簇之间相似度尽可能小。而此相似度的衡量可通过样本间的距离衡量。简单来说,聚类就是我们平时所说的“物以类聚”。

2. 硬聚类和软聚类

通过聚类得到的结果是若干个簇,其本质是样本的子集。
硬聚类:聚类得到的结果中,一个样本只属于一个簇,也就是说任意两个簇的交集为空集。
软聚类:一个样本可以被划分到多个簇,即:两个簇的交集不为空集。

3. 聚类应用场景

  • 客户群体划分
      在一些商业应用中,商家或平台往往会对不同客户群体采取不同的营销策略,但对客户群体的类型定义可能不太容易,这时可先对用户数据进行聚类,根据聚类结果将客户细分,判断其类别,制定个性化的营销策略。
  • 社交网络分析
      识别在同一个圈子的朋友,判断哪些人可能互相认识。在信息化时代,社交网络是我们获取信息、分享信息、沟通交流的主要途径,六度空间理论是否是一个伪理论?我们可以利用聚类的方式将一群人划分到不同簇,同一个簇内的人就可能是同一圈子的志同道合的朋友。
  • 文档处理
      对相似内容的文档进行划分。在我们在进行某方面文献、文档检索时,会出现很多相似文档,这就是相似文档推荐,其内部应用的就是衡量文档的相似度,将相似文档划分为一个簇。
  • 异常值检测
      利用聚类识别可能的离群点,所谓离群点就是相对于整体而言的少数孤立点,这些点的行为特征与整体数据有很大不一致性,在多数数据处理中会将其作为异常值、噪声点清洗掉,但在某些特定业务中,如:诈骗检测、工业生产质量检测等,异常点往往是关注的重点。

4. 聚类算法的划分

  原型聚类:K均值聚类算法、高斯混合聚类
  层次聚类:包括聚合聚类(AGNES算法)和分裂聚类
  模糊聚类:EM算法
  密度聚类:DBSCAN算法

4. 聚类性能度量

  我们期望得到的聚类结果是具有“簇内高相似度、簇间低相似度”。为了评估聚类结果的好坏,需要明确聚类性能度量指标。性能度量主要有外部指标和内部指标。

4.1外部指标

外部指标:将聚类结果与某个参考模型比较。常用的外部指标有:JC、FMI、RI。

给定数据集:
            在这里插入图片描述

聚类得到的簇划分为
            在这里插入图片描述
,用λ表示每个簇的标记向量,参考模型的簇划分为

            在这里插入图片描述
,用λ*表示每个簇的标记向量,定义:
          在这里插入图片描述
SS代表在聚类结果中隶属于相同簇且在参考模型中也隶属于相同簇的样本对的集合。a为集合SS中样本数量。
          在这里插入图片描述
SD代表在聚类结果中隶属于相同簇,但在参考模型中隶属于不同簇的样本对的集合。b为集合SD中样本数量。

          在这里插入图片描述
DS代表在聚类结果中隶属于不同簇,但在参考模型中隶属于相同簇的样本对的集合。c为集合DS中样本数量。

          在这里插入图片描述
DD代表在聚类结果中隶属于不同簇,在参考模型中也隶属于不同簇的样本对的集合。d为集合DD中样本数量。
因为在硬聚类问题中,每个样本对只能出现在一个集合中,所以a+b+c+d=m(m-1)/2(样本对数量)。

1)Jaccard系数:
              在这里插入图片描述
其含义为样本集合交集大小与样本集合并集大小的比值。刻画了所有属于同一类的样本对同时在聚类结果和参考模型中隶属于同一簇的样本对所占比例。
Python代码计算Jaccard系数(以在iris数据集应用Kmeans算法的聚类结果为例):

#KMeans对iris数据集聚类
from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=3)
kmeans.fit(iris_data_scale)#标准化之后的数据
#计算KMeans聚类方法在iris数据的Jaccard系数
import numpy as np
from sklearn.metrics import jaccard_score
y_pred = pd.DataFrame(kmeans.labels_)#利用kmeans对iris数据聚类的结果
y_true =iris.iloc[:,-1]#将原iris数据集的标签中setosa用0表示,virginica用1表示,versicolor用2表示
jc=jaccard_score(y_true, y_pred,average='micro')
print(jc)
>>>0.6759776536312849

2)FMI指数:
            在这里插入图片描述
  在聚类结果中属于同一簇的样本对中,同时属于参考模型的样本对的比例为p1=a/a+b;在参考模型中属于同一簇的样本对中,同时属于聚类结果的样本对比例为p2=a/a+c,FM指数就是p1和p2的几何平均sqrt(p1*p2) 。
Python代码计算FMI指数:

#计算KMeans聚类方法在iris数据的FMI系数
from sklearn.metrics.cluster import fowlkes_mallows_score
y_pred = np.array(kmeans.labels_)
y_true =np.array(iris.iloc[:,-1])
fm=fowlkes_mallows_score(y_true,y_pred)
print(fm)
>>>0.712634358238645

3)Rand指数:
            在这里插入图片描述
  刻画了隶属于聚类结果中同一簇,且隶属于参考模型中同一簇的样本对和既不隶属于聚类结果中同一簇,又不隶属于参考模型中同一簇的样本对之和占所有样本对的比例。

Python代码计算Rand指数:

#计算KMeans聚类方法在iris数据的RI系数
from sklearn.metrics.cluster import adjusted_rand_score
y_pred = np.array(kmeans.labels_)
y_true =np.array(iris.iloc[:,-1])
ari = adjusted_rand_score(y_true,y_pred)
print(ari)
>>>0.5717394882425836

  以上三种外部指标的取值范围均为[0,1],其值越大越好。

4.2内部指标

内部指标:不利用参考模型相应的簇,直接考察聚类结果。常用内部指标有:DBI和DI。

考虑聚类结果的簇划分,
        在这里插入图片描述

定义:簇C内样本间平均距离:
        在这里插入图片描述
簇C内样本间最大距离:
        在这里插入图片描述

两个簇之间的最小距离:
        在这里插入图片描述

两个簇的中心距离:
        在这里插入图片描述
1)DBI指数:其值越小越好
        在这里插入图片描述
Python代码计算DBI指数:

#计算KMeans聚类方法在iris数据的DBI指数
from sklearn.metrics import davies_bouldin_score
X=iris.iloc[:,:4]
labels=kmeans.labels_
dbi=davies_bouldin_score(X, labels)
print(dbi)
>>>0.7697340140206764

2)Dunn指数:其值越大越好
        在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46568930/article/details/110453300