当前位置: 首页 > news >正文

聚类算法-Kmeans聚类

一、K-means 聚类介绍

1.含义

K-means 聚类是一种非常流行的无监督学习算法,用于将数据点划分为预定义的 K 个簇(或组),其中每个簇由其质心(即簇中所有点的均值)定义。K-means 算法的目标是使簇内的点尽可能紧密地聚集在一起,同时使不同簇之间的点尽可能远离。

2.基本步骤:

  • 选择 K 值:首先,你需要决定将数据分成多少个簇,即 K 的值。K 的选择通常是基于问题的上下文或通过一些启发式方法(如肘部法则)来确定。
  • 初始化质心:随机选择 K 个数据点作为初始的簇质心。质心可以是数据集中的任意点,但通常选择相距较远的点作为起始点,以避免局部最优解。
  • 分配簇:对于数据集中的每个点,将其分配到最近的质心所在的簇。通常使用欧几里得距离来测量点与质心之间的距离。
  • 更新质心:对于每个簇,重新计算其质心(即簇内所有点的均值)。
  • 重复迭代:重复步骤 3 和 4,直到质心的位置不再显著变化或达到预设的迭代次数。
  • 输出结果:最终,算法会输出 K 个簇和它们的质心。

二、代码实现

1.数据预处理

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics# 读取文件
beer = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
# 传入变量
X = beer.drop(columns=beer.columns[0])
  • 使用pandas的read_table函数读取名为data.txt的文本文件,该文件中的数据通过空格分隔,并指定编码为utf8。
  • 通过drop(columns=beer.columns[0])删除数据框beer的第一列,因为这一列不包含用于聚类的特征。剩下的列(特征)被存储在X中。

2.交叉验证

# 交叉验证
scores = []
max_range = np.arange(2,10)
for k in max_range:labels = KMeans(n_clusters=k).fit(X).labels_score = metrics.silhouette_score(X, labels)  # 轮廓系数scores.append(score)
K = max_range[np.argmax(scores)]
print(K)
print(scores)
  • 使用一个循环来尝试不同的K值(从2到9),对于每个K值,使用KMeans类进行聚类,并计算聚类结果的轮廓系数得分。轮廓系数得分范围从-1到1,得分越高表示聚类效果越好。
  • 将每个K值对应的轮廓系数得分存储在scores列表中。
  • 使用np.argmax(scores)找到scores列表中的最大值索引,该索引对应的K值即为最优的聚类数。打印出最优的K值和对应的轮廓系数得分列表。

3.绘制得分结果

import matplotlib.pyplot as pltplt.plot(list(range(2, 10)), scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
  • 使用matplotlib库绘制轮廓系数得分随K值变化的折线图,以便直观地观察不同K值下的聚类效果。

4.最终聚类

# 聚类
km = KMeans(n_clusters=K).fit(X)
beer['cluster'] = km.labels_score = metrics.silhouette_score(X, beer.cluster)
print(score)
  • 使用选定的最优K值对原始数据进行K-means聚类。
  • 将聚类标签添加到原始数据框beer中,作为新列cluster。
  • 再次计算并打印使用最优K值聚类后的轮廓系数得分,以验证聚类效果。

5.全部代码

这段代码主要执行了以下几个步骤,用于对啤酒数据集(存储在data.txt文件中)进行K-means聚类,并通过轮廓系数(Silhouette Score)来评估不同聚类数(K值)下的聚类效果,最终选择最优的K值进行聚类,并展示聚类结果和对应的轮廓系数得分。

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics# 读取文件
beer = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
# 传入变量
X = beer.drop(columns=beer.columns[0])
"""
根据分成不同的族,自动计算轮廓系数得分
"""
# 交叉验证
scores = []
max_range = np.arange(2,10)
for k in max_range:labels = KMeans(n_clusters=k).fit(X).labels_score = metrics.silhouette_score(X, labels)  # 轮廓系数scores.append(score)
K = max_range[np.argmax(scores)]
print(K)
print(scores)# 绘制得分结果
import matplotlib.pyplot as pltplt.plot(list(range(2, 10)), scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
# 聚类
km = KMeans(n_clusters=K).fit(X)
beer['cluster'] = km.labels_score = metrics.silhouette_score(X, beer.cluster)
print(score)

三、总结

K-means 聚类广泛应用于市场细分、图像分割、文档聚类等领域。例如,在市场营销中,可以将客户划分为不同的群体,以便进行更针对性的推广策略;在图像处理中,可以将图像分割成多个区域,以便进一步分析或压缩。但同时也拥有自己的优缺点。

  • 优点:
    • 简单易实现。
    • 对大数据集具有较好的可扩展性。
    • 当簇的密度大致相同且簇间分离良好时,效果非常好。
  • 缺点:
    • 需要预先指定 K 值,而 K 的选择通常不直观。
    • 结果可能受到初始质心选择的影响,可能导致局部最优解。
    • 对异常值(噪声)和簇的形状(非球形)敏感。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基础闯关4
  • CentOS7虚拟机下安装及使用Docker
  • qt5.15.2在线安装选项不见了?怎么办?
  • 【Pythonj进阶】Python中的日志记录与监控:跟踪和分析应用程序行为
  • union 的正确食用方法
  • 文件包含漏洞PHP伪协议利用方法
  • Mac 安装 jdk 8详细教程
  • 有限体积法:基于一维稳态扩散问题及其程序实现
  • 计算机网络 第2章 物理层
  • 农产品自主供销系统小程序的设计
  • 94.游戏的启动与多开-互斥量对开检测
  • 同三维S61-20SDI 20倍 HDMI SDI USB3.0 网口 3高清摄像机
  • Azure AI Search 中的二进制量化:优化存储和加快搜索速度
  • 【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)
  • python07-单元测试框架unittest1-1
  • [译]CSS 居中(Center)方法大合集
  • 【附node操作实例】redis简明入门系列—字符串类型
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Angular2开发踩坑系列-生产环境编译
  • EventListener原理
  • express.js的介绍及使用
  • extjs4学习之配置
  • JavaScript新鲜事·第5期
  • mongodb--安装和初步使用教程
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SpriteKit 技巧之添加背景图片
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 反思总结然后整装待发
  • 飞驰在Mesos的涡轮引擎上
  • 利用DataURL技术在网页上显示图片
  • 区块链将重新定义世界
  • 消息队列系列二(IOT中消息队列的应用)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​低代码平台的核心价值与优势
  • ## 1.3.Git命令
  • $.ajax()参数及用法
  • $.each()与$(selector).each()
  • (21)起落架/可伸缩相机支架
  • (3)选择元素——(17)练习(Exercises)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (java)关于Thread的挂起和恢复
  • (Java数据结构)ArrayList
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (分类)KNN算法- 参数调优
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .gitignore文件忽略的内容不生效问题解决
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 后台导出excel ,word