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

聚类算法-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 plt

plt.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 plt

plt.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 的选择通常不直观。
    • 结果可能受到初始质心选择的影响,可能导致局部最优解。
    • 对异常值(噪声)和簇的形状(非球形)敏感。

http://www.kler.cn/news/290211.html

相关文章:

  • 【60天备战软考高级系统架构设计师——第八天:设计模式概述】
  • Spring Boot项目中结合MyBatis详细使用
  • “智能化自动化” 架构之4:中间建模脑的软件设计三大原则-依赖倒置控制反转和依赖注入
  • 在react中利用three.js 渲染模型 让鼠标拖拽是模型转动
  • redhat7.9安装zsh以及常用插件
  • 具有平面规则性的单目视觉惯性里程计
  • 反射API与AOP在微服务治理中的实践与思考
  • 飞利浦开放式耳机怎么样?南卡、飞利浦、QCY耳机真实测评
  • 【Leetcode 2399 】 检查相同字母间的距离 —— 哈希表
  • git分支的管理
  • Windows 欺骗主机 Burn-In 的自动化工具
  • Mysql-慢SQL的处理以及SQL优化
  • webpack--处理资源
  • 【linux002】目录操作命令篇 - ls 命令
  • 用table展示表头和侧边都是动态
  • 注册安全分析报告:央视网
  • 基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统
  • ElementPlus实现页面,上部分是表单,下部分是表格
  • 从PX4源码PX4-Autopolite中的Boards中选择适合自己移植的版本
  • 828华为云征文|华为云Flexus X实例docker部署srs6并调优,协议使用webrtc与rtmp
  • 基于Python的网络编程
  • C1-1 ABB二次SDK开发——C#Window窗体-环境配置(带ABB二次开发SDK资源包)
  • 【赵渝强老师】MongoDB的MMAPv1存储引擎
  • Java 集合性能优化
  • 临时表的魔力:SQL中的快速缓存与数据处理
  • 前端常见文件下载方式总结
  • 已经存在的项目如何变成git的一个repository
  • springboot集成guava布隆过滤器
  • 24/9/3算法笔记 kaggle泰坦尼克
  • goalng http client的MaxIdleConnsPerHost,MaxIdleConns,MaxConnsPerHost参数设置总结