python 机器学习——聚类性能评估

news/2024/5/20 7:02:04 标签: 聚类, 机器学习, python

聚类性能评估

  • 一、综述
  • 二、Rand index(兰德指数)(RI) 、Adjusted Rand index(调整兰德指数)(ARI)
  • 三、Silhouette Coefficient(轮廓系数)(s(i))
  • 四、建模实例
  • 参考文献:

一、综述

聚类性能度量亦称聚类“有效性指标”(validity index)。与监督学习中的性能度量作用类似,对聚类结果,我们需要通过某种性能度量来评估其好坏;另一方面,若明确了最终将要使用的性能度量,则可直接将其作为聚类过程的优化目标,从而更好地得到符合要求的聚类结果。

聚类是将样本集 D 划分为若干互不相交的子集,即样本簇。那么什么样的聚类结果比较好?直观上看,我们希望“物以类聚”,即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同。换言之,希望聚类结果的“簇内相似度”(intra-cluster similarity)高且“簇间相似度”(inter-cluster similarity)低。

聚类性能度量大致有两类。一类是将聚类结果与某个“参考模型”(reference model,即给定预期的划分结果,也就是给出参考答案)进行比较,称为“外部指标”(external index);另一类是直接考察聚类结果而不利用任何参考答案的模型,称为“内部指标”(internal index)。

二、Rand index(兰德指数)(RI) 、Adjusted Rand index(调整兰德指数)(ARI)

RI 取值范围为 [0,1],值越大意味着聚类结果与真实情况越吻合。 RI 越大表示聚类效果准确性越高 同时每个类内的纯度越高。为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index)被提出,它具有更高的区分度。ARI 取值范围为[−1,1],值越大意味着聚类结果与真实情况越吻合。从广义的角度来讲,ARI 衡量的是两个数据分布的吻合程度。

三、Silhouette Coefficient(轮廓系数)(s(i))

(1) 计算样本 i 到同簇其他样本的平均距离 ai。ai 越小,说明样本 i 越应该被聚类到该簇。将 ai 称为样本 i 的簇内不相似度。簇 C 中所有样本的 ai 均值称为簇 C 的簇不相似度。

(2) 计算样本 i 到其他某簇 Cj 的所有样本的平均距离 bij,称为样本 i 与簇 Cj 的不相似度。定义为样本 i 的簇间不相似度:bi =min{bi1, bi2, …, bik} bi 越大,说明样本 i 越不属于其他簇。

(3) 根据样本 i 的簇内不相似度 ai 和簇间不相似度 bi ,定义样本 i 的轮廓系数:
在这里插入图片描述
可见轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。s(i)为 0 说明该点处于两类交界上。

四、建模实例

在上一节“手写数字识别”k-means 聚类建模的基础上,对该模型聚类性能进行评估。考虑到该数据集为识别数字,因此有明确的目标类别,使用外部指标进行性能评价。其中外部指标选择 ARI(Adjusted Rand Index)。另外生成一组数据点,用以演示内部指标的使用。内部指标选择轮廓系数(Silhouette Coefficient)来度量聚类结果的质量。

python"># 分别导入 numpy、matplotlib 以及 pandas,用于数学运算、作图以及数据分析。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 使用 pandas 分别读取训练数据与测试数据集。
digits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)
digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes', header=None)
# 从训练与测试数据集上都分离出 64 维度的像素特征与 1 维度的数字目标。
X_train = digits_train[np.arange(64)]
y_train = digits_train[64]
X_test = digits_test[np.arange(64)]
y_test = digits_test[64]
# 从 sklearn.cluster 中导入 KMeans 模型。
from sklearn.cluster import KMeans
# 初始化 KMeans 模型,并设置聚类中心数量为 10。
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train)
# 逐条判断每个测试图像所属的聚类中心。
y_pred = kmeans.predict(X_test)

性能评估

python"># 从 sklearn 导入度量函数库 metrics。
from sklearn import metrics
# 使用 ARI 进行 KMeans 聚类性能评估。
print(metrics.adjusted_rand_score(y_test, y_pred))

运行结果如下:
在这里插入图片描述

python"># 导入 numpy。
import numpy as np
# 从 sklearn.cluster 中导入 KMeans 算法包。
from sklearn.cluster import KMeans
# 从 sklearn.metrics 导入 silhouette_score 用于计算轮廓系数。
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 分割出 3*2=6 个子图,并在 1 号子图作图。
plt.subplot(3,2,1)
# 初始化原始数据点。
x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
X = np.vstack((x1, x2)).transpose()

# 在 1 号子图做出原始数据点阵的分布。
# 限制 x,y 轴取值范围
plt.xlim([0, 10])
plt.ylim([0, 10])
# 打印标题Instances
plt.title('Instances')
# 绘制散点图
plt.scatter(x1, x2)
# 设置颜色和标记列表
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b']
markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
# 设置聚类数 K 
clusters = [2, 3, 4, 5, 8]
subplot_counter = 1
sc_scores = []
for t in clusters:
    subplot_counter += 1
    plt.subplot(3, 2, subplot_counter)
    kmeans_model = KMeans(n_clusters=t).fit(X)
    for i, l in enumerate(kmeans_model.labels_):
        plt.plot(x1[i], x2[i], color=colors[l], marker=markers[l], ls='None')
    plt.xlim([0, 10])
    plt.subplots_adjust(hspace=1,wspace=1.5) # 子图之间加宽放在重叠
    plt.ylim([0, 10])
    sc_score = silhouette_score(X, kmeans_model.labels_, metric='euclidean')
    sc_scores.append(sc_score)
    # 绘制轮廓系数与不同类簇数量的直观显示图。
    plt.title('K = %s, silhouette coefficient= %0.03f' %(t, sc_score))

在这里插入图片描述

python"># 绘制轮廓系数与不同类簇数量的关系曲线。
plt.figure()
plt.plot(clusters, sc_scores, '*-')
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Coefficient Score')
plt.show()

在这里插入图片描述

由此可见,当聚类中心数量为 3 的时候,轮廓系数最大,此时也可观察到聚类中心数量为 3 也符合数据的分布特点,的确是较为合理的类簇数量。

参考文献:

[1] 周志华. 机器学习[M]. 清华大学出版社, 北京, 2016.
[2] 范淼,李超.Python 机器学习及实践[M].清华大学出版社, 北京, 2016.


http://www.niftyadmin.cn/n/1446782.html

相关文章

Codeforces 191C Fools and Roads(树链剖分)

题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数,然后有M次操作,每次从u移动到v,问说每条边被移动过的次数。 解题思路:树链剖分维护边,用一个数组标记即可,不…

怎样才能将query string从一个asp文件传送到另一个(转)

怎样才能将query string从一个asp文件传送到另一个前者文件加入下句: Response.Redirect("second.asp?" & Request.ServerVariables("QUERY_STRING")) 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/1029452…

Apache中文官网全面战略合作伙伴关系

2019独角兽企业重金招聘Python工程师标准>>> 今天终于和Apache中文官网(ApacheCN)建立全面战略合作伙伴关系,ApacheCN将努力打造成中国最权威的Apache官网。同时可以访问合作域名http://wiki.geekidentity.com/ ,我翻译…

穿上新衣,手提干货,Greenplum中文社区网站回来啦!

了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站 在休息一段时间后, Greenplum中文社区网站整装待发啦! 穿上新衣,手提干货, 以前有的一点都不会少, 我们为你准备了更多! 快来 https:…

普通交换机上的网卡绑定(转)

前面老欧说的“双网卡绑定”前提是必须带TRUNK的交换机,这种“交换机”可能只有大网吧或无盘网吧才会买吧?而我的则可以在普通交换机上实现双网卡的绑定。呵呵!望“斑竹”加精啊!望大家也多顶顶让更多的人知道此方法。&#xff0d…

python 机器学习——Kmeans之K值的选取原理

Kmeans之K值的选取参考一般而言,没有所谓最好的选择聚类数的方法,通常情况下是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用 K-means 算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。当人们在讨论选择…

fzu 2082 过路费(树链剖分)

题目链接&#xff1a;fzu 2082 过路费 题目大意&#xff1a;略。 解题思路&#xff1a;树链剖分裸题。 #include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn 50005; typedef long long ll;#define lson(x) ((x…

跟着内核学框架-从misc子系统到3+2+1设备识别驱动框架

misc子系统在Linux中是一个非常简单的子系统&#xff0c;但是其清晰的框架结构非常适合用来研究设备识别模型。本文从misc子系统的使用出发&#xff0c;通过了解其机制来总结一套的设备识别的驱动框架&#xff0c;即使用使用同一个驱动&#xff0c;向上提供多个设备文件接口&am…