【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~
一、聚类任务
设样本集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])))
创作不易 觉得有帮助请点赞关注收藏~~~
【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)相关推荐
- python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...
原标题:[Python量化投资]趋向系统指标策略 ADX.DMI指标用于股票池(附源码) [什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋 ...
- 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战
关键词提取和文本摘要算法TextRank详解及实战 写在前面 最近一直没有更新文章,实在惭愧.伴随着小老弟的职业方向由风控转向了NLP,后面的文章也会集中在NLP领域,希望大家能够继续支持~ 导读 本 ...
- python模拟火车订票系统代码_Python3.6实现12306火车票自动抢票,附源码
原标题:Python3.6实现12306火车票自动抢票,附源码 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已 ...
- python机器学习之基于内容的推荐算法中推荐麻辣香锅菜品实战(附源码)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 推荐算法相信大家都不陌生,日常生活的各种APP都会根据你的喜好和特征来给你推荐,接下来详细介绍一下其中的基于内容的推荐算法 基于内容的模式起源于信 ...
- 【Python机器学习】决策树、逻辑回归、神经网络等模型对电信用户流失分类实战(附源码和数据集)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 电信用户流失分类 该实例数据来自kaggle,它的每一条数据为一个用户的信息,共有21个有效字段,其中最后一个字段Churn标志该用户是否流失 1 ...
- 【Python机器学习】KNN进行水果分类和分类器实战(附源码和数据集)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ KNN算法简介 KNN(K-Nearest Neighbor)算法是机器学习算法中最基础.最简单的算法之一.它既能用于分类,也能用于回归.KNN通 ...
- 【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)
需要源码请点赞关注收藏后评论区留言私信~~~ 一.统计分词 统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率. 二.隐马尔可 ...
- 我用Python逆向登录世界上最大的游戏平台,steam加密手段有多高明【内附源码】
大家好,我是辣条. 前言 今天带来爬虫实战的第30篇文章.在挑选游戏的过程中感受学习,让你突飞猛进.python爬虫实战:steam逆向RSA登录解析. 采集目标 网址:steam 工具准备 开发工具 ...
- 【Python自然语言处理+tkinter图形化界面】实现智能医疗客服问答机器人实战(附源码、数据集、演示 超详细)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.问答智能客服简介 QA问答是Question-and-Answer的缩写,根据用户提出的问题检索答案,并用用户可以理解的自然语言回答用户,问答 ...
最新文章
- WebViewJavascriptBridge原理解析
- Galaxy nexus i9250 android 4.2 一键root
- plsql(轻量版)_游标的使用1
- TCP/IP 三次握手和四次挥手
- 几种流行Webservice框架性能对照
- Jenkins 随笔
- ndarry转置二阶及以上的矩阵
- 系统架构设计师-软件水平考试(高级)-理论-项目管理
- Js实现文字水平滚动
- 多尺度地理加权回归(MGWR),地理加权回归(GWR),最小二乘法(OLS)回归模型的对比分析
- matlab 车牌汉字识别系统,基于MATLAB车牌自动识别系统设计毕业设计论文最新版...
- python: 产品选型小软件
- 网易社招面试几轮?网易java社招面试题分享
- ML Hyperlink
- RepeatMasker使用
- GBase8d产品admin目录下的文件及文件夹说明
- java3D实现空间立方体,纯CSS3实现一个旋转的3D立方体盒子
- 转载---Cesium简介
- linux系统ps命令的参数a与-a表示的讨论
- 移动互联网大讨论(二):电话号码:移动互联网最后一个ID