算法的好坏,都要有相应的指标来衡量。尤其聚类的特殊性,也有一些特殊的算法。

衡量指标

这里介绍7种能够用于不同场景下聚类算法的衡量指标:

  1. 混淆矩阵
  2. 均一性
  3. 整性
  4. V-measure
  5. 调整兰德系数(ARI)
  6. 调整互信息(AMI)
  7. 轮廓系数(Silhouette)

前三个就是混淆矩阵那些。前五个衡量时引入了y,用的比较少,做个了解就可。为什么呢?都有y值了,我完全可以直接用分类,干吗用聚类。轮廓系数用的比较多。

1)混淆矩阵
这里就不提了,前面的文章《机器学习(概述二)——开发流程》 已经做过详细的介绍。

2)均一性(类似正确率)
一个簇中只包含一个类别的样本,则满足均一性;其实也可以认为就是正确率(每个聚簇中正确分类的样本数占该聚簇总样本数的比例和)
p=1k∑i=1kN(Ci==Ki)N(Ki)p=\frac{1}{k} \sum_{i=1}^k \frac{N(C_i ==K_i)}{N(K_i)}p=k1​i=1∑k​N(Ki​)N(Ci​==Ki​)​

3)完整性(类似召回率)
同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占该类型的总样本数比例的和。
r=1k∑i=1kN(Ci==Ki)N(Ci)r=\frac{1}{k} \sum_{i=1}^k \frac{N(C_i ==K_i)}{N(C_i)}r=k1​i=1∑k​N(Ci​)N(Ci​==Ki​)​

4)V-measure
均一性和完整性的加权平均
Vβ=(1+β2)⋅prβ2⋅p+rV_\beta = \frac{(1+\beta^2) \cdot pr}{\beta^2 \cdot p + r}Vβ​=β2⋅p+r(1+β2)⋅pr​

5)调整兰德系数(ARI)
Rand index(兰德指数)(RI),RI取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。
RI=a+bC2nsamplesRI=\frac{a+b}{C_2^{n_{samples}}}RI=C2nsamples​​a+b​
其中C表示实际类别信息,K表示聚类结果,a表示在C与K中都是同类别的元素对数(也就是行),b表示在C与K中都是不同类别的元素对数(也就是列),C2nsamplesC_2^{n_{samples}}C2nsamples​​表示数据集中可以组成的对数,即从样本中取两个.

调整兰德系数(ARI,Adjusted Rnd Index),ARI取值范围[-1,1],值越大,表示聚类结果和真实情况越吻合。从广义的角度来将,ARI是衡量两个数据分布的吻合程度的。
ARI=(RI−E[RI])max⁡⁡[RI]−E[RI]E[RI]表示均值ARI=\frac{(RI−E[RI])}{\max⁡ [RI]−E[RI]}\quad\quad E[RI]表示均值ARI=max⁡[RI]−E[RI](RI−E[RI])​E[RI]表示均值

6)调整互信息(AMI)
调整互信息(AMI,Adjusted Mutual Information),类似ARI,内部使用信息熵
S={s1,s2,...,sN}U={U1,U2,...,UR}V=V1,V2,...,VCS=\{s_1,s_2,...,s_N\} \quad U=\{U_1,U_2,...,U_R\} \quad V={V_1,V_2,...,V_C} S={s1​,s2​,...,sN​}U={U1​,U2​,...,UR​}V=V1​,V2​,...,VC​Ui∩Uj=Vi∩Vj=∅∪i=1RUi=∪j=1CVj=Snij=∣Ui∩Vj∣U_i \cap U_j = V_i \cap V_j = \emptyset \quad \cup _{i=1}^R U_i = \cup_{j=1}^C V_j = S \quad n_{ij} =|U_i \cap V_j| Ui​∩Uj​=Vi​∩Vj​=∅∪i=1R​Ui​=∪j=1C​Vj​=Snij​=∣Ui​∩Vj​∣P(i)=∣Ui∣NP(j)=∣Vi∣NH(U)=−∑i=1RP(i)log⁡P(i)H(V)=−∑j=1CP′(j)log⁡P′(j)P(i)=\frac{|U_i|}{N} \quad P(j)=\frac{|V_i|}{N} \quad H(U) = -\sum_{i=1}^R P(i) \log P(i) \quad H(V) = -\sum_{j=1}^C P^{'}(j) \log P^{'}(j) P(i)=N∣Ui​∣​P(j)=N∣Vi​∣​H(U)=−i=1∑R​P(i)logP(i)H(V)=−j=1∑C​P′(j)logP′(j)MI(U,V)=∑i=1R∑j=1CP(i,j)log⁡P(i,j)P(i)P′(j)P(i,j)=∣Ui∩Vj∣NMI(U,V)=\sum_{i=1}^R \sum_{j=1}^C P(i,j) \log \frac{P(i,j)}{P(i)P^{'}(j)} \quad P(i,j)=\frac{|U_i \cap V_j|}{N} MI(U,V)=i=1∑R​j=1∑C​P(i,j)logP(i)P′(j)P(i,j)​P(i,j)=N∣Ui​∩Vj​∣​AMI(U,V)=MI(U,V)−E{MI(U,V)}max⁡{H(U),H(V)}−E{MI(U,V)}AMI(U,V)=\frac{MI(U,V)-E\{MI(U,V)\}}{\max \{ H(U),H(V)\} -E\{MI(U,V)\}} AMI(U,V)=max{H(U),H(V)}−E{MI(U,V)}MI(U,V)−E{MI(U,V)}​
SSS 表示整个数据集,UUU 表示整个预测的数据集,VVV 实际数据集(y值),CCC 表示原始的,RRR 表示预测的。
一个样本只属于一个簇,所以 Ui∩Uj=∅U_i∩U_j=∅Ui​∩Uj​=∅;一个样本只能预测出一种结果,所以 Vi∩Vj=∅V_i∩V_j=∅Vi​∩Vj​=∅
nij=∣Ui∩Vj∣n_{ij}=|U_i∩V_j |nij​=∣Ui​∩Vj​∣,表示实际和预测是相同的个数.

7)轮廓系数(Silhouette)
簇内不相似度:计算样本 iii 到同簇其它样本的平均距离为 aia_iai​ ; $a_i $ 越小,表示样本 iii 越应该被聚类到该簇,簇 CCC中的所有样本的 aia_iai​ 的均值被称为簇 CCC 的簇不相似度。
簇间不相似度:计算样本 iii 到其它簇 CjC_jCj​ 的所有样本的平均距离 bijb_{ij}bij​ ,bi=min⁡{bi1,bi2,...,bik}b_i =\min \{b_{i1} ,b_{i2} ,...,b_{ik}\}bi​=min{bi1​,bi2​,...,bik​};bib_ibi​ 越大,表示样本 iii 越不属于其它簇。
轮廓系数:sis_isi​ 值越接近 1 表示样本 iii 聚类越合理,越接近 -1,表示样本i应该分类到另外的簇中,近似为 0,表示样本i应该在边界上;所有样本的 sis_isi​ 的均值被成为聚类结果的轮廓系数.
s(i)=b(i)−a(i)max⁡{a(i),b(i)}s(i)=\frac{b(i)−a(i)}{\max \{a(i),b(i)\}}s(i)=max{a(i),b(i)}b(i)−a(i)​
s(i)={1−a(i)b(i),a(i)<b(i)0,a(i)=b(i)b(i)a(i)−1,a(i)>b(i)s(i)=\begin{cases} 1-\frac{a(i)}{b(i)}, a(i)<b(i)\\ 0, a(i)=b(i)\\ \frac{b(i)}{a(i)}-1, a(i)>b(i)\\ \end{cases} s(i)=⎩⎪⎨⎪⎧​1−b(i)a(i)​,a(i)<b(i)0,a(i)=b(i)a(i)b(i)​−1,a(i)>b(i)​

我们希望的是最终结果越趋近于1越好

代码

基于scikit包中的创建模拟数据的API创建聚类数据,对K-Means算法和Mini Batch K-Means算法构建的模型进行评估。

API

调整兰德系数(ARI):sklearn.metrics.adjusted_rand_score(labels_true, labels_pred)

  • labels_true表示实际的
  • labels_pred表示预测的

V-measure:sklearn.metrics.v_measure_score(labels_true, labels_pred, beta=1.0)

调整互信息(AMI):sklearn.metrics.adjusted_mutual_info_score(labels_true, labels_pred, average_method=‘arithmetic’)

互信息(MI):sklearn.metrics.mutual_info_score(labels_true, labels_pred, contingency=None)

代码
我们采用上篇博客相同的内容。

import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn import metrics
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets.samples_generator import make_blobs  ## 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = Falsecenters = [[1, 1], [-1, -1], [1, -1]]
clusters = len(centers)       X, Y = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7, random_state=28)
Y # 在实际工作中是人工给定的,专门用于判断聚类的效果的一个值
### TODO: 实际工作中,我们假定聚类算法的模型都是比较可以,最多用轮廓系数/模型的score api返回值进行度量;
### 其它的效果度量方式一般不用
### 原因:其它度量方式需要给定数据的实际的y值 ===> 当我给定y值的时候,其实我可以直接使用分类算法了,不需要使用聚类

array([2, 0, 0, …, 2, 2, 1])

k_means = KMeans(init='k-means++', n_clusters=clusters, random_state=28)
t0 = time.time()
k_means.fit(X)
km_batch = time.time() - t0
print ("K-Means算法模型训练消耗时间:%.4fs" % km_batch)

K-Means算法模型训练消耗时间:0.0981s

batch_size = 100
mbk = MiniBatchKMeans(init='k-means++', n_clusters=clusters, batch_size=batch_size, random_state=28)
t0 = time.time()
mbk.fit(X)
mbk_batch = time.time() - t0
print ("Mini Batch K-Means算法模型训练消耗时间:%.4fs" % mbk_batch)

Mini Batch K-Means算法模型训练消耗时间:0.0460s

km_y_hat = k_means.labels_
mbkm_y_hat = mbk.labels_
print(km_y_hat) # 样本所属的类别

[0 2 2 … 1 1 0]

k_means_cluster_centers = k_means.cluster_centers_
mbk_means_cluster_centers = mbk.cluster_centers_
print ("K-Means算法聚类中心点:\ncenter=", k_means_cluster_centers)
print ("Mini Batch K-Means算法聚类中心点:\ncenter=", mbk_means_cluster_centers)
order = pairwise_distances_argmin(k_means_cluster_centers,  mbk_means_cluster_centers)
order

K-Means算法聚类中心点:
center= [[-1.0600799 -1.05662982]
[ 1.02975208 -1.07435837]
[ 1.01491055 1.02216649]]
Mini Batch K-Means算法聚类中心点:
center= [[ 0.99602094 1.10688195]
[-1.00828286 -1.05983915]
[ 1.07892315 -0.94286826]]

array([1, 2, 0], dtype=int64)

### 效果评估
score_funcs = [metrics.adjusted_rand_score,#ARImetrics.v_measure_score,#均一性和完整性的加权平均metrics.adjusted_mutual_info_score,#AMImetrics.mutual_info_score,#互信息
]## 2. 迭代对每个评估函数进行评估操作
for score_func in score_funcs:t0 = time.time()km_scores = score_func(Y,km_y_hat)print("K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs" % (score_func.__name__,km_scores, time.time() - t0))t0 = time.time()mbkm_scores = score_func(Y,mbkm_y_hat)print("Mini Batch K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs\n" % (score_func.__name__,mbkm_scores, time.time() - t0))

K-Means算法:adjusted_rand_score评估函数计算结果值:0.72526;计算消耗时间:0.199s
Mini Batch K-Means算法:adjusted_rand_score评估函数计算结果值:0.72421;计算消耗时间:0.002s

K-Means算法:v_measure_score评估函数计算结果值:0.65754;计算消耗时间:0.011s
Mini Batch K-Means算法:v_measure_score评估函数计算结果值:0.65780;计算消耗时间:0.003s

K-Means算法:adjusted_mutual_info_score评估函数计算结果值:0.65726;计算消耗时间:0.026s
Mini Batch K-Means算法:adjusted_mutual_info_score评估函数计算结果值:0.65757;计算消耗时间:0.006s

K-Means算法:mutual_info_score评估函数计算结果值:0.72231;计算消耗时间:0.003s
Mini Batch K-Means算法:mutual_info_score评估函数计算结果值:0.72264;计算消耗时间:0.002s

机器学习(聚类五)——聚类算法的衡量指标相关推荐

  1. 机器学习中回归问题的性能衡量指标

    回归问题的典型性能指标是均方根误差(RMSE),它测量的是预测过程中,预测错误的标准偏差(标准偏差是方差的算术平方根,而方差是离均平方差的平均数). 例如,RMSE等于50000就意味着,系统的预测值 ...

  2. 机器学习sklearn19.0聚类算法——Kmeans算法

    一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...

  3. 机器学习算法——聚类1(性能度量——外部指标Jaccard系统,FM指数,Rand指数;内部指标:DB指数,Dunn指数)

    1.聚类简介 在"无监督学习"中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础.此类学习任务中研究最多.应用最 ...

  4. 【机器学习】常用聚类算法 整理

    sparkML 常用聚类算法 http://spark.apache.org/docs/latest/mllib-clustering.html 如下为 机器学习聚类算法的理论知识: 在机器学习中,无 ...

  5. 机器学习入门:聚类算法-5

    机器学习入门:聚类算法 1.实验描述 本实验先简单介绍了一下各聚类算法,然后利用鸢尾花数据集分别针对KMeans聚类.谱聚类.DBSCAN聚类建模,并训练模型:利用模型做预测,并使用相应的指标对模型进 ...

  6. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  7. 机器学习认识聚类(KMeans算法)

    导读:机器是怎样学习的,都学到了什么?人类又是怎样教会机器学习的?本文通过案例给你讲清楚各类算法的原理和应用. 机器学习,一言以蔽之就是人类定义一定的计算机算法,让计算机根据输入的样本和一些人类的干预 ...

  8. 机器学习十大经典算法之K-Means聚类算法

    聚类介绍 聚类在机器学习,数据挖掘,模式识别,图像分析以及生物信息等领域有广泛的应用.聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都 ...

  9. 机器学习中的聚类算法有哪几种?

    目前,聚类算法被广泛应用于用户画像.广告推荐.新闻推送和图像分割等等.聚类算法是机器学习中一种"数据探索"的分析方法,它帮助我们在大量的数据中探索和发现数据的结构.那么机器学习中的 ...

最新文章

  1. yaf mysql_Yaf框架的配置
  2. Bootstrap4代码模板
  3. UnrealEngine4 学习总结备忘
  4. 编译fastdfs报错Makefile:59: recipe for target 'fdfs_monitor' failed
  5. ELK 日志管理系统,初次尝试记录
  6. VSCode下载安装和配置Java环境
  7. Nature综述|整合组学分析护航健康,推动精准医学时代的到来!
  8. 用计算机研究唐诗,妙哉,那个用文言文编程的小哥,竟从28万行唐诗中找出了对称矩阵...
  9. HTML网页图片背景以及图片自适应设置
  10. 数据挖掘思维和实战11 朴素贝叶斯:算一算你是否要买延误险
  11. java6发布_Minecraft Java版 1.13-pre6 发布
  12. VUE路由防卫功能举例
  13. h5 实现微信支付以及易宝银行卡支付
  14. 从线上卖到线下,秘籍在这里|千牛头条双11直播
  15. Spring父子类同属性父类属性隐藏
  16. 《Android 应用案例开发大全(第二版)》——1.5节第一个Android程序——Hello Android...
  17. echarts图表生成base64
  18. 跨境早报| 亚马逊FBA推配送新服务!Shopee全面开放巴西站点广告功能
  19. [生存志] 第33节 黄帝战蚩尤
  20. 移动互联网开发技术教学网站项目研究综述

热门文章

  1. [附源码]Python计算机毕业设计SSM佳音大学志愿填报系统(程序+LW)
  2. CAS单点登录(八)——多属性返回
  3. 图穷了,来搞一搞(内附源码)
  4. SSRF漏洞的利用与攻击内网应用
  5. 数论 毕达哥斯拉三元组 + 欧拉函数 + 容斥原理 hdu3939
  6. LOTUS调用RFC
  7. JAVA 线上故障排查全套路
  8. 怎么让文字不再div溢出,文字在div里面
  9. 【数据结构】插入排序的小细节和代码实现
  10. MapBox鼠标移入地图要素上,形状变更为手指