K-Means和轮廓系数

news/2024/5/20 6:59:10 标签: 机器学习, 聚类, python

K-Means和轮廓系数

K-means(K均值)是机器学习中一种常见的无监督算法,它能够将未知标签的数据,根据它们的特征分成不同组,每一组数据又称为“簇”,每一簇的中心点称为“质心”。其基本原理过程如下:
1、任意选择K个初始质心(可以不是样本点),为每个样本点找到与其距离最近的质心,并将样本点与质心归为同一簇,从而生成K个簇;
2、当所有样本点都被分完,对于每一个簇,重新计算新的质心(同一簇中所有点的平均坐标值);
3、不断迭代,直到不会质心的位置不发生改变。
因此该算法最核心的参数是K,那么K该如何确定呢?
这里可以引入轮廓系数S:
在这里插入图片描述
计算公式如上图所示,其中,a表示样本点与同一簇中所有其他点的平均距离,即样本点与同一簇中其他点的相似度;b表示样本点与下一个最近簇中所有点的平均距离,即样本点与下一个最近簇中其他点的相似度。
K-Means追求的是对于每个簇而言,其簇内差异小,而簇外差异大,轮廓系数S正是描述簇内外差异的关键指标。由公式可知,S取值范围为(-1, 1),当S越接近于1,则聚类效果越好,越接近-1,聚类效果越差。

python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
python">#make_blobs函数是为聚类产生数据集,n_samples表示样本个数,n_features:表示数据的维度,默认为2
#centers:产生数据的中心点,默认值为3,cluster_std为数据集的标准差,浮点数或者浮点数列,默认值为1.0
x, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

# 绘图,查看数据样本的分布
fig, ax = plt.subplots(1)
fig.set_size_inches(8,6)
ax.scatter(x[:, 0], x[:, 1], marker='o', s=8)
plt.show()

在这里插入图片描述
数据集一共由两列特征组成,即横轴和纵轴。实际应用中,数据往往会有许多列特征,一般需要先通过降维算法(如PCA)将多维特征压缩至二维或者三维,才能可视化。观察上图,乍一看,数据应该能被分成4簇,但有的人觉得分成2簇(左下1簇,右上1簇),或者分成3簇(最下面1簇,中间1簇,右上1簇)也是合理的。

那么到底能分成几类呢?这时就需要通过轮廓系数来帮我们确定。

python"># 给定K值(n_clusters)的范围
n_clusters = range(2, 5)

# 循环绘图
for n in n_clusters:
    # 创建绘图区域
    fig, ax = plt.subplots(1)
    fig.set_size_inches(8, 6)
    
    # 实例化
    cluster = KMeans(n_clusters=n,random_state=10).fit(x)
    # 访问labels_属性,获得聚类结果
    y_pred = cluster.labels_
    # 访问cluster_centers_属性,获得质心坐标
    centroid = cluster.cluster_centers_
    # 计算平均轮廓系数
    silhouette_avg = silhouette_score(x, y_pred)
    
    # 绘制聚类结果
    # y_pred==i会返回布尔数组,从而获得那些被分为同一类的点
    for i in range(n):
        ax.scatter(x[y_pred==i, 0],x[y_pred==i, 1],marker='o',s=8,alpha=0.7)   
    # 绘制质心
    ax.scatter(centroid[:, 0],centroid[:, 1],marker='x',s=30,c='k')   
    # 设置图表标题
    ax.set_title('result of KMeans(n_clusters={})'.format(n))   
    # 设置x轴标题
    ax.set_xlabel('feature_1')    
    # 设置y轴标题
    ax.set_ylabel('feature_2')   
    # 设置总标题,用来描述轮廓系数的值
    plt.suptitle('The average silhouette value is {:.4f}.'.format(silhouette_avg),
                 fontsize=14, fontweight='bold')
    plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行代码后,系统帮我们自动生成了3张图,并告诉我们每张图中,K的取值和平均轮廓系数值。可以看到K=2时,S=0.7050;K=3,S=0.5882;K=4,S=0.6505。当数据集被分为4簇时,轮廓系数比为3簇的高,因此我们舍弃K=3。然而当K=2时,得分竟然是最高的,这与我们最初创建数据集时给的真实分类centers=4是不一致的!
这恰恰说明了:

① 轮廓系数确实能帮助我们确定K的取值,并且分数越接近1,越能代表更好的聚类效果;

② 分数最高的K值,并不一定是正确的聚类结果(虽然我们可能并不知道真实的分类);

③ 实际应用中,需要紧密结合轮廓系数与业务需求,才能得到恰当的结果;


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

相关文章

五一名宿现涨价毁约潮会涨多少?没人订会降价吗?

五一名宿现涨价毁约潮会涨多少?没人订会降价吗?#五一民宿现涨价毁约潮 民宿宁愿罚款也要退订涨价#与财同行微信时刻 五一名宿现涨价毁约潮会涨多少?没人订会降价吗?

MIPS指令集-mars-cpu

MIPS通用寄存器 MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下: 下表描述32个通用寄存器的别名和用途 REGISTER NAME USAGE $0 $zero 常量0(constant value 0) $1 $at 保留给汇编器(Reserved f…

华为OD机试真题(Java),密码验证合格程序(100%通过+复盘思路)

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行) 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出:OK&…

项目沟通管理5大技巧 第4个很重要

1、充分使用twitter管理沟通模型 项目沟通会议可以充分使用witter的管理沟通模型,提高会议沟通效率。使用此模型,主要是有三步: 第一步:倾听,项目经理需要保持中立的立场,不先表态,让团队成员畅…

Ubuntu20.04使用多卡训练HyperNetwork模型和LoRA模型全流程及疑难问题解决方案

目录 一. LoRA模型多卡训练1.1 安装xformer等库1.2 设置路径1.3 多卡训练 二. LoRA模型多卡训练疑难报错解决方案多卡训练报错 软硬件配置: CPU: AMD 5800 8core 16Thread GPU: NVIDIA RTX 3090 *1 NVIDIA TITAN RTX *1 OS: Ubuntu20.04 一. LoRA模型多卡训练 1.1 …

Linux网络——部署YUM仓库

Linux网络——部署YUM仓库 一、YUM仓库服务1.准备安装源:①.软件仓库的提供方式②.RPM软件包的来源③.构建CentOS7软件仓库④.在软件仓库中加入非官方RPM包组⑤.访问yum仓库 2.yum下载软件包的方式①..开启缓存下载②.通过yum命令的选项下载③.通过yumdownloader命令…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题142环形链表II) 2023.4.24

目录 前言算法题(LeetCode刷题142环形链表II)—(保姆级别讲解)分析题目:算法思想环形链表II代码:补充 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写…

MyBatisPlus代码生成器使用

MybatisPlus特点 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 强大的 CRUD 操作:内置通用 Mappe…