【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)

news/2024/5/20 7:54:23 标签: python, 聚类, 评价指标, k-means

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、聚类任务

设样本集S={x_1,x_2,…,x_m}包含m个未标记样本,样本x_i=(x_i^(1),x_i^(2),…,x_i^(n))是一个n维特征向量。

聚类在分簇过程的任务是建立簇结构,即要将S划分为k(有的聚类算法将k作为需事先指定的超参数,有的聚类算法可自动确定k的值)个不相交的簇C_1,C_2,…,C_k,C_l∩C_l^′=∅且⋃_l=1^k▒C_l=S,其中1≤l,l^′≤k,l≠l^′。记簇C_l的标签为y_l,簇标签共有k个,且互不相同。

记测试样本为x=(x^(1),x^(2),…,x^(n))。聚类在分配阶段的任务是根据簇结构将测试样本x分配到一个合适的簇(簇标签为y ̂)中

可以从决策函数、概率和神经网络三类模型来描述分簇过程和分配过程。

在分簇过程,决策函数聚类模型要建立起合适的从样本到簇标签的映射函数Y=f(X),X是定义域,它是所有样本特征向量的集合,Y是值域,它是所有簇标签的集合(在聚类算法里,簇标签没有实际含义,一般只是算法自动产生的簇的编号);

概率聚类模型要建立起正确的条件概率P ̂(Y|X);

神经网络聚类模型要利用一定的网络结构N,生成能够反映分簇结构的网络参数W,即得到合适的网络模型N(S,W)。

在分配过程,决策函数聚类模型依据决策函数Y=f(X)给予测试样本x一个簇标签y ̂;概率聚类模型依据条件概率P ̂(Y|X)计算在给定x时取每一个y ̂的条件概率值,取最大值对应的y ̂作为输出;神经网络聚类模型将x馈入已经训练好的网络N(S,W),从输出得到标签y ̂。 

决策函数聚类模型有kmeans、DBSCAN、OPTICS、Mean Shift等。

概率聚类模型有高斯聚类模型等。

用于聚类的神经网络有自组织特征映射(Self-Organizing Feature Map,SOM)网络。

聚类不仅可以是单独的任务,也可以对数据进行预处理,作为其它机器学习任务的前驱任务。

二、聚类算法评价指标

1:内部结构

内部指标关注分簇后的内部结构,目标是衡量簇内结构是否紧密、簇间距离是否拉开等。

设样本集为S={x_1,x_2,…,x_m}。若某聚类算法给出的分簇为C={C_1,C_2,…,C_k},定义:

1.样本x_m与同簇C_i其它样本的平均距离:

 2.样本x_m与不同簇C_j内样本的平均距离:

3.样本x_m与簇的最小平均距离:

 

4. 簇内样本平均距离:

 

5. 簇中心距离:

 2:轮廓系数(Silhouette Coefficient SC)

单一样本x_m的轮廓系数为:

一般使用的轮廓系数是对所有样本的轮廓系数取均值。SC值高表示簇内密集,簇间疏散。

该指标在slkearn.metrics包中有实现,函数原型为:silhouette_score()。

 3:DB指数(Davies-Bouldin Index DBI)

R_ij的分子是两个簇内样本平均距离之和,分母是两簇的中心距离,因此该指数越小说明簇内样本点更紧密、簇就间隔的越远。

该指标在slkearn.metrics包中也有实现,函数原型为:davies_bouldin_score()。

4:凸集与非凸集 

在欧式空间中,凸集在直观上就是一个向四周凸起的图形。在一维空间中,凸集是一个点,或者一条连续的非曲线(线段、射线和直线);在二维空间中,就是上凸的图形,如锥形扇面、圆、椭圆、凸多边形等;在三维空间中,凸集可以是一个实心的球体等。总之,凸集就是由向周边凸起的点构成的集合。

5:凸簇与非凸簇 

簇的成员的集合为凸集的簇,称为凸簇,否则,称为非凸簇

同簇内的样本间的距离很大,也就是说,簇内平均不相似度a(x_m)可能比b(x_m)还大,所以,SC甚至可能取负值。

衡量聚类效果的有两个方面的因素,分别是簇内密集程度和簇间隔程度。因为非凸簇的分布特点,簇内密集程度不再适合用簇内所有样本间的距离来衡量,簇间隔程度也不再适合用簇中心的距离来衡量。

6:ZQ系数 

定义众距离Z来衡量簇内密集程度。记MinPts_distance(x_m)为样本点x_m到它的第MinPts近邻居样本点的距离,则簇C_i的众距离Z_i为:

MinPts可以根据样本密集程度取1、2、…等值。

定义群距离Q来衡量簇的间隔程度。

1)两个簇的群距离Q是他们的样本点之间的距离的最小值:

 

2)也可以用点到簇的距离来定义群距离,记样本x_m到不同簇C_j的距离为:

 

即样本点到不同簇内点的最小值。簇C_i到C_j的群距离Q(C_i,C_j)为他们的均值:

 

用所有簇的众距离的均值除以所有簇间群距离的均值的结果作为评价聚类效果的指标,称为ZQ系数:

 

ZQ系数小表示簇内密集、簇间疏散 

三、聚类算法内部评价指标实战

SC DBI CH评价指标示例 效果如下图

 代码如下

import numpy as np
from time import time
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans

#np.random.seed(719) # 指定随机数种子,以确保每次运行可重复观察

samples = np.loadtxt("kmeansSamples.txt") # 加载数据集

print(54 * '_')
print('init\t\ttime\tinertia\tSC\tDBI\tCH') # 打印表头

n_init = 1 # 指定kmeans算法重复运行次数

estimator = KMeans(init='k-means++', n_clusters=3, n_init=n_init)  # k-means++方式指定初始簇中心
t0 = time() # 开始计时
estimator.fit(samples)
print('%-9s\t%.2fs\t%i\t%.3f\t%.3f\t%.3f'
          % ('k-means++', (time() - t0), estimator.inertia_,
             metrics.silhouette_score(samples, estimator.labels_, metric='euclidean'),
 
estimator.fit(samples)
print('%-9s\t%.2fs\t%i\t%.3f\t%.3f\t%.3f'
          % ('random', (time() - t0), estimator.inertia_,
             metrics.silhouette_score(samples, estimator.labels_, metric='euclidean'),
             metrics.davies_bouldin_score(samples, estimator.labels_),
             metrics.calinski_harabasz_score(samples, estimator.labels_)))

plt.scatter(samples[:,0],samples[:,1],c=estimator.labels_,linewidths=np.power(estimator.labels_+0.5, 2)) # 用不同大小的点来表示不同簇的点
plt.scatter(estimator.cluster_centers_[:,0],estimator.cluster_centers_[:,1],c='r',marker='^',linewidths=7) # 打印簇中心
plt.show()

ZQ评价指标示例

 

部分代码如下

from zqscore import ZQ_score
from sklearn.datasets import make_circles
noisy_circles = make_circles(n_samples=1000, factor=.5, noise=.05, random_state=15)
X = noisy_circles[0]
plt.axes(aspect='equal')
plt.scatter(X[:, 0], X[:, 1], marker='o', c=noisy_circles[1])
plt.show()
print("SC:\t"+str(metrics.silhouette_score(X, noisy_circles[1], metric='euclidean')))
print("DBI:\t"+str(metrics.davies_bouldin_score(X, noisy_circles[1])))
print("CH:\t"+str(metrics.calinski_harabasz_score(X, noisy_circles[1])))
print("ZQ:\t"+str(ZQ_score(X, noisy_circles[1])))

 创作不易 觉得有帮助请点赞关注收藏~~~


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

相关文章

【电脑使用】硬盘无法引导进入系统,无法退出BIOS

前言 因为想要给自己的笔记本添置装备,于是想着把老电脑上的固态拆下来,但是考虑到老电脑虽然不常用,但还是偶尔会用,不能是瘫痪状态,于是想把我之前淘到的一个机械硬盘换上去,结果发现无法引导进入系统&am…

毕业设计 - 基于 java web的网上花店销售系统设计与实现【源码+论文】

文章目录前言一、项目设计1. 模块设计数据流图功能模块2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 毕业设计项目: 网上花店销售系统的设计与实现 一、项目设计 1. 模块设计 数据流图 功能模块 1、首页(主界面) 提供简洁美观的主界…

通用插件框架体系-日志系统

通用插件框架体系-日志系统: 1.目的 日志是软件系统的基本功能,通过日志可以跟踪代码执行、分析问题。但日志系统作为一个辅助系统也有一些自己的要求。 1.执行效率足够快,不应对主业务产生影响。 2.可以根据需要控制输出的信息类容。 3.能适应复杂的项…

数据库的事务

作者:~小明学编程 文章专栏:MySQL 格言:目之所及皆为回忆,心之所想皆为过往 目录 什么是事务? 事务的特性 原子性 一致性 持久性 独立性 事务之间的影响 脏读 不可重复读 幻读 数据库的隔离级别 读未提交…

个人设计web前端大作业——HTML+CSS华为官网首页

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Docker入门(基础篇)

Docker入门Docker相关概念为什么需要DockerDocker的理念容器与虚拟机的比较Docker的安装与使用安装Dockerdocker 的三要素Docker常用命令Docker相关概念 为什么需要Docker 为什么会出现Docker了?现在我们假设你在开发一个项目,你使用的是一台笔记本电脑…

c++ 实现Djkstra寻路算法

前言 本文来自左程云左神分享的视频教程内容中间有一些地方写的比较随便,后面懒得改了,就在基础上加的;这一篇基本都是用的指针,你问我为什么要写成指针?我也不知道,大概是那会脑子抽了;理解Dj…

Nginx快速入门笔记

Nginx快速入门笔记 01、Nginx简介 架构:没有什么是加一层解决不了的什么是Nginx? Nginx是一个高性能的HTTP和方向代理web服务器,同时也提供了IMAP/POP3/SMTP(邮件HTTP)服务。Nginx的特点是占有内存少,并…