聚类算法(KMeans)模型评估方法(SSE、SC)及案例

news2024/9/24 18:09:04
一、概述

        将相似的样本自动归到一个类别中,不同的相似度计算方法,会得到不同的聚类结果,常用欧式距离法;聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。是无监督学习算法

二、分类

根据聚类颗粒度:细聚类、粗聚类

根据实现方法

        K-means:按照 质心 分类,主要介绍K-means,通用、普遍;

        层次聚类:对数据进行逐层划分,直到达到聚类的类别个数;

        DBSCAN聚类:一种基于 密度 的聚类算法;

        谱聚类:是一种基于 图论 的聚类算法

三、KMeans方法
实现流程

1 、事先确定常数K ,常数K意味着最终的聚类类别数

2、随机选择 K 个样本点作为初始聚类中心

3、计算每个样本到 K 个中心的距离,选择最近的聚类中心点作为标记类别

4、根据每个类别中的样本点,重新计算出新的聚类中心点(平均值),如果计算得出的新中心点与原中心点一样则停止聚类,否则重新进行第 2 步过程,直到聚类中心不再变化

# 导包
from sklearn.cluster import KMeans

sklearn.cluster.KMeans ( n_clusters = 8 )

# 方法
estimator.fit_predict(x)

导包:from sklearn.cluster import KMeans

        sklearn.cluster.KMeans ( n_clusters = 8 )

参数:n_clusters:开始的聚类中心数量(整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数

方法:estimator.fit_predict(x)

评估:silhouette_score(x, y_pred)        # 评估 聚类效果,数值越大越好

案例

1 导包

# 1.导入工具包
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score  # 计算SC系数

2 创建数据集

# 2.创建数据集 1000个样本,每个样本2个特征 4个质心蔟数据标准差[0.4, 0.2, 0.2, 0.2]
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]],cluster_std = [0.4, 0.2, 0.2, 0.2], random_state=22)
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()

        n_samples:样本数
        n_features:特征数
        cluster_std:质心蔟数据标准差

3 实例化Kmeans模型并预测,并展示聚类效果

# 3 使用k-means进行聚类, 并使用CH方法评估
y_pred = KMeans(n_clusters=3, random_state=22).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()

4 评估聚类效果好坏

# 4 模型评估
print(silhouette_score(x, y_pred))

# 评估方法2
from sklearn.metrics import calinski_harabasz_score

calinski_harabasz_score(x, y_pred)
四、模型评估方法
1、误差平方和(SSE)

The sum of squares due to error

SSE 越小,表示数据点越接近它们的中心,聚类效果越好,主要考量:簇内聚程度

                                     参数:Ci 表示簇
                                                ​k 表示聚类中心的个数
        ​                                        p 表示某个簇内的样本
​                                                m 表示质心点

代码展示

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score

def dm01_SSE误差平方和求模型参数():
    sse_list = []

    # 产生数据random_state=22固定好
    x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)
    for clu_num in range(1, 100):
        my_kmeans = KMeans(n_clusters=clu_num,max_iter=100, random_state=0)
        my_kmeans.fit(x)
        sse_list.append(my_kmeans.inertia_ ) # 获取sse的值 

    plt.figure(figsize=(18, 8), dpi=100)
    plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))
    plt.grid()
    plt.title('sse')
    plt.plot(range(1, 100), sse_list, 'or-')
    plt.show()

         通过图像可观察到 n_clusters = 4时,sse开始下降趋缓,最佳值为4

2、“肘”方法 - K值确定

Elbow method

通过 SSE 确定 n_clusters 的值

1 对于n个点的数据集,迭代计算 k from 1 to n,每次聚类完成后计算 SSE

2 SSE 是会逐渐变小的,因为每个点都是它所在的簇中心本身。

3 SSE 变化过程中会出现一个拐点,下降率突然变缓时即认为是最佳 n_clusters 值。

4 在决定什么时候停止训练时,肘方法同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。

3、轮廓系数法(SC)

Silhouette Coefficient

考虑簇内的内聚程度(Cohesion),簇外的分离程度(Separation)

计算过程

1 计算每一个样本 i 到同簇内其他样本的平均距离 ai,该值越小,说明簇内的相似程度越大

2 计算每一个样本 i 到最近簇 j 内的所有样本的平均距离 bij,该值越大,说明该样本越不属于其他簇 j

根据下面公式计算该样本的轮廓系数:

                        a:样本 i 到 簇内其他样本的平均距离
                        b:样本 i 到其他簇间的距离平均值的 最小值

3 计算所有样本的平均轮廓系数

4 轮廓系数的范围为:[-1, 1],SC值越大聚类效果越好

代码展示

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

def dm02_轮廓系数SC():
    tmp_list = []

    # 产生数据random_state=22固定好
    x, y = make_blobs(n_samples=1000, n_features=2,centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)
    
    for clu_num in range(2, 100):
        my_kmeans = KMeans(n_clusters=clu_num,max_iter=100, random_state=0)
        my_kmeans.fit(x)
        ret = my_kmeans.predict(x)
        tmp_list.append(silhouette_score(x, ret))  # sc

    plt.figure(figsize=(18, 8), dpi=100)
    plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))
    plt.grid()
    plt.title(‘sse’)
    plt.plot(range(2, 100), tmp_list, ‘ob-’)
    plt.show()

         通过图像可观察到 n_clusters=4 取到最大值; 最佳值为 4

五、案例:顾客数据聚类分析

已知:客户性别、年龄、年收入、消费指数

需求:对客户进行分析,找到业务突破口,寻找黄金客户

 肘方法、sh系数代码实现:

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

# 聚类分析用户分群
def dm01_聚类分析用户群():
    dataset = pd.read_csv('data/customers.csv')
    dataset.info()
    print('dataset-->\n', dataset)

    X = dataset.iloc[:, [3, 4]]
    print('X-->\n', X)
    
    mysse = []
    mysscore = []
    
    # 评估聚类个数
    for i in range(2, 11):
    mykeans = KMeans(n_clusters=i)
    mykeans.fit(X)
    mysse.append(mykeans.inertia_)      # inertia 簇内误差平方和
    ret = mykeans.predict(X)
    mysscore.append(silhouette_score(X, ret))    # sc系数 聚类需要1个以上的类别

    plt.plot(range(2, 11), mysse)
    plt.title('the elbow method')
    plt.xlabel('number of clusters')
    plt.ylabel('mysse')
    plt.grid()
    plt.show()

    plt.title('sh')
    plt.plot(range(2, 11), mysscore)
    plt.grid(True)
    plt.show()

效果分析:

         通过肘方法、sh系数都可以看出,聚成5类效果最好

客户分群代码实现:

def dm02_聚类分析用户群():
    dataset = pd.read_csv('data/customers.csv')
    X = dataset.iloc[:, [3, 4]]
    
    mykeans = KMeans(n_clusters=5)
    mykeans.fit(X)
    y_kmeans = mykeans.predict(X)
    
    # 把类别是0的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
    plt.scatter(X.values[y_kmeans == 0, 0],X.values[y_kmeans == 0, 1], s=100, c='red', label='Standard')
    
    # 把类别是1的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
    plt.scatter(X.values[y_kmeans == 1, 0],X.values[y_kmeans == 1, 1], s=100, c='blue', label='Traditional')

    # 把类别是2的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
    plt.scatter(X.values[y_kmeans == 2, 0],X.values[y_kmeans == 2, 1], s=100, c='green', label='Normal')

    plt.scatter(X.values[y_kmeans == 3, 0],X.values[y_kmeans == 3, 1], s=100, c='cyan', label='Youth')

    plt.scatter(X.values[y_kmeans == 4, 0],X.values[y_kmeans == 4, 1], s=100, c='magenta', label='TA')

    plt.scatter(mykeans.cluster_centers_[:, 0],mykeans.cluster_centers_[:, 1], s=300, c='black', label='Centroids’)
    
    plt.title('Clusters of customers')
    plt.xlabel('Annual Income (k$)')
    plt.ylabel('Spending Score (1-100)')
    plt.legend()
    plt.show()

客户分群效果展示:

         从图中可以看出,聚成5类,右上角属于挣的多,消费也多的黄金客户群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3开发移动端H5页面中video无交互自动播放完美解决方案

链接 官网:https://jsmpeg.com/ github:https://github.com/phoboslab/jsmpeg 官方例子:https://jsmpeg.com/perf.html 在线video转ts文件:https://convertio.co/zh/mp4-ts/ 踩坑 一、不用使用任何npm、yarn等安装 npm i jsmpe…

C#用Math.Round和double.TryParse方法实现四舍五入

目录 一、涉及到的知识点 1.double.TryParse()方法 2.Math.Round(Decimal, Int32) 方法 3.comboBox1没有选项 二、示例 1.源码 2.生成 一、涉及到的知识点 1.double.TryParse()方法 详见本文作者写的其他文章&#xff0…

消息中间件之Kafka(一)

1.简介 高性能的消息中间件,在大数据的业务场景下性能比较好,kafka本身不维护消息位点,而是交由Consumer来维护,消息可以重复消费,并且内部使用了零拷贝技术,性能比较好 Broker持久化消息时采用了MMAP的技…

像操作本地文件一样操作linux文件 centos7环境下samba共享服务搭建详细教程

1.安装dnf yum -y install dnf 2.安装samba dnf install samba -y 3.配置 3.1创建并设置用户信息 #创建用户 useradd -M -s /sbin/nologin samba echo 123|passwd --stdin samba mkdir /home/samba chown -R samba:samba /home/samba smbpasswd -a samba smaba设置密码示…

nodejs下载安装

一、node下载安装 官网下载 官网 根据自己电脑系统选择合适的版本进行下载,我这里选择window 64 位 下载完点击安装 打开cmd查看安装 此处说明下:新版的Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js…

实现仿ChatGPT光标跟随效果

先看效果 实现效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>光标闪烁效果</title>…

使用 MinIO 和 PostgreSQL 简化数据事件

本教程将教您如何使用 Docker 和 Docker Compose 在 MinIO 和 PostgreSQL 之间设置和管理数据事件&#xff0c;也称为存储桶或对象事件。 您可能已经在利用 MinIO 事件与外部服务进行通信&#xff0c;现在您将通过使用 PostgreSQL 自动化和简化数据事件管理来增强数据处理能力…

机器人导纳控制实现框架

Safe, Stable and Intuitive Control for Physical Human-Robot Interaction - 知乎关于文章《Safe, Stable and Intuitive Control for Physical Human-Robot Interactio》的简记。 Safe, Stable and Intuitive Control for Physical Human-Robot Interaction目的根据力导数作…

设计一个网页爬虫

定义 User Case 和 约束 注意&#xff1a;没有一个面试官会阐述清楚问题&#xff0c;我们需要定义Use case和约束 Use cases 我们的作用域只是处理以下Use Case&#xff1a; Service 爬取一批 url 生成包含搜索词的单词到页面的反向索引给页面生成标题和片段– 标题和片段是…

ptrade 通过mysql的链接开发一个量化管理平台。

这里只写一下界面及想法。不进行代码的实现。因为对流程不是很熟 ###界面 数据库的链接&#xff1a; ptrade USER 可转债量化分析 PASSWORD 123456 MYSQL_HOST mysql.sqlpub.com MYSQL_PORT 3306 MYSQL_DB ptradedef get_mysql_conn():import pymysqltry:conn pym…

maven编译时依赖报错 Caused by: java.util.zip.ZipException: zip file is empty 错误。

出现这种报错时&#xff0c;可能是maven仓库下对应的依赖出现了问题&#xff0c;需要讲报错依赖位置的依赖进行删除&#xff0c;在编译的时候就会重新下载&#xff0c;就不会出现错误了。 rm -rf /Applications/software/env/repository/org/apache/orc/orc-core/1.9.1/

Yield Guild Games 宣布与区块链游戏中心 Iskra 建立战略合作伙伴关系

Yield Guild Games (YGG) 宣布将向 Iskra 引入其任务系统&#xff0c;Iskra 是一个 Web3 游戏中心和发布平台&#xff0c;拥有超过 400 万注册钱包和 10 万月度活跃用户 (MAU)。在 LINE、Kakao、Wemade 和 Netmarble 等公司的支持下&#xff0c;Iskra 将游戏玩家和游戏工作室聚…

验收测试的重要性:确保交付高质量产品

在软件开发生命周期中&#xff0c;验收测试扮演着至关重要的角色&#xff0c;它不仅是项目的最后一道关卡&#xff0c;更是确保交付高质量产品的关键步骤。本文将介绍验收测试的重要性&#xff0c;以及它在软件开发过程中的作用。 1. 确认功能符合需求 验收测试的首要任务是验证…

逆向思维,去重Cube计算优化新技巧

场景描述 在做数据汇总计算和统计分析时&#xff0c;最头疼的就是去重类指标计算&#xff08;比如用户数、商家数等&#xff09;&#xff0c;尤其还要带多种维度的下钻分析&#xff0c;由于其不可累加的特性&#xff0c;几乎每换一种统计维度组合&#xff0c;都得重新计算。数…

匿名发送短信

匿名发送短信 匿名发送短信啦&#xff01;不用程序猿&#xff0c;也能定制专属推送消息&#xff01;每日小惊喜&#xff01; 还可以领取课程资料&#xff01;软考中级软件设计师&#xff0c;高级信息系统项目管理师&#xff01; 先说在哪里 微信搜公众号&#xff1a;暮看云 微…

人工智能 | 自然语言处理的发展历程

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 自然语言处理的发展 方向一&#xff1a;技术进步1. 基于规则的语法&#xff08;1950-1990&#xff09;2. 统计语言处理&#xff08;1990-2010&#xff09;3. 基于深度学…

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

计算机网络-标准化工作及相关组织与性能指标(标准分类 标准化工作 RFC 速率 带宽 吞吐量 时延 时延带宽积 RTT 利用率)

文章目录 标准化工作及相关组织标准化工作标准分类RFC流程标准化的相关组织小结 性能指标速率带宽吞吐量时延发送时延传播时延排队时延与处理时延补充 高速链路 时延带宽积往返时间RTT利用率小结 标准化工作及相关组织 标准化工作 即需要统一标准&#xff0c;这样才能兼容 …

Linux 时间同步 - Chrony服务

Linux 时间同步 - Chrony服务 引言一、简单使用二、详解2.1 chrony.conf2.2 chronyd2.3 chronyc 引言 为什么需要时间同步? 其意义可参考秦朝统一度量衡&#xff0c;车同轨&#xff0c;书同文。核心就是方便协同工作。 Chrony能更精确、更快的同步时钟&#xff0c;传统ntp需要…

014集:python访问互联网:网络爬虫实例—python基础入门实例

以pycharm环境为例&#xff1a; 首先需要安装各种库(urllib&#xff1a;requests&#xff1a;Openssl-python等) python爬虫中需要用到的库&#xff0c;大致可分为&#xff1a;1、实现 HTTP 请求操作的请求库&#xff1b;2、从网页中提取信息的解析库&#xff1b;3、Python与…