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

机器学习之K-means(K-均值)算法

一、什么是 K-Means 聚类

K-Means 是一种经典的无监督学习算法,主要用于解决聚类问题。它的核心思想是将 n 个样本点划分为 k 个不同的簇,使得每个簇内的样本点具有较高的相似度,而不同簇之间的样本点差异较大。与监督学习不同,聚类不需要预先标记好的训练数据,算法会自动从数据中发现模式和结构,非常适合探索性数据分析。

二、聚类

什么是聚类?通俗说,聚类是将一堆数据划分成到不同的组中。

聚类(Clustering)的通俗定义:将一堆数据划分到不同的组中。一种无监督学习,其产生的类别是未知的。

聚类的学术定义:把一个数据对象的集合划分成簇(子集),使簇内对象彼此相似,簇间对象不相似的过程。

在聚类算法中,常用的是 K-means 和 DBSCAN,但本文聚焦 K-means 。

HMM即隐马尔可夫模型(HiddenMarkovModel)在语音识别、机器翻译、中文分词、命名实体识别、词性标注、基因识别等领域有广泛的使用。

三、K-Means 算法原理

K-Means 算法的工作流程可以概括为以下几个步骤:

距离度量通常使用欧氏距离,对于样本点 x 和质心 c,计算公式为:

                     

1.K-means如何确定 K 值?

K-means 常常根据 SSE 和轮廓系数确定 K 值。

  1. 初始化:随机选择 k 个样本点作为初始质心(聚类中心)
  2. 分配样本:计算每个样本点到各个质心的距离,将样本点分配到距离最近的质心所在的簇
  3. 更新质心:计算每个簇中所有样本点的均值,将其作为新的质心
  4. 迭代优化:重复步骤 2 和步骤 3,直到质心的位置变化小于预设阈值或达到最大迭代次数
  5. 收敛:当质心不再明显变化时,算法收敛,得到最终的聚类结果

方法一:尝试不同k值:多选取几个k值,对比聚类效果,选择最优的k值。

方法二:结合业务特点:假定想要把文章分为兵乒球,篮球,综合三个类型,就设定k=3。

方法三:根据SSE和轮廓系数:SSE越小,聚类效果越好;轮廓系数越大,聚类效果越好。

2. K-means如何选取初始中心点?

K-means选择不同的初始中心,会得到不同的聚类结果。

K-means 常使用 K-means++ 方法确定初始中心点。

K-means++:选择初始的聚类中心之间的相互距离要尽可能的远。

二分K-means:选择误差最大的类,进行二分分裂。

3. K-means如何处理空簇?

聚类中心没有被分配到样本,常常将其删除。

空簇问题:K-means中计划聚成20类,结果才聚成19类,1类为空。

空簇原因:聚类中心没有被分配到样本。

解决办法

  • 法一:其他簇心的均值点
  • 法二:删除空族
  • 法三:最远离聚类中心的点

4. K- means特征工程

类别特征、大数值特征都不适用于 K-means 聚类。

原因:K-means是基于距离的,而类别没有距离。

k-means对异常值明显,比如年龄、金额等。

5.K- means评估

什么样的 K-means 聚类才是好的 K-means 聚类?

实际应用中,常常把 SSE(Sum of Squared Errors,误差平方和) 与轮廓系数(Silhouette Coefficient)结合使用,评估聚类模型的效果。

SSE:误差平方和(Sum of Squared Errors)最小,聚类效果最好。

轮廓系数(Silhouette Coefficient):轮廓系数越大,聚类效果越好。

6. SSE

SSE越小,聚类效果越好。

7.轮廓系数

轮廓系数越大,聚类效果越好。

四、K-Means 的优缺点分析

优点:

  • 算法简单易懂,实现方便
  • 计算效率高,适合处理大规模数据集
  • 聚类结果可解释性强

缺点:

  • 需要预先指定 K 值,对结果影响较大
  • 对初始质心的选择敏感,可能陷入局部最优
  • 对噪声和异常值敏感
  • 不适合发现非凸形状的簇

五、项目案列

基于 K-Means 聚类的啤酒数据分析与最佳聚类数探索

在数据分析领域,聚类分析是一种重要的无监督学习方法,可用于发现数据中的自然分组结构。本项目以啤酒相关数据(包含热量、钠含量、酒精含量、成本等属性)为研究对象,利用 K-Means 聚类算法对其进行分析,通过轮廓系数确定最佳聚类数,挖掘不同啤酒在这些属性上的聚类特征,为啤酒市场细分、产品研发等提供数据参考 。

实现步骤:

(一)数据读取与预处理

数据读取:
使用 pandas 的 read_csv 函数读取啤酒数据文件 data.txt,由于数据是以空格分隔,设置 sep=' ' ,并指定编码为 utf-8 ,确保正确读取数据内容,代码如下:

beer = pd.read_csv('data.txt', sep=' ', encoding='utf-8')

特征提取:

提取除啤酒名称外的其他列作为特征数据 x,这些特征将用于后续聚类分析,代码为:

x = beer.iloc[:, 1:]

(二)确定最佳聚类数(K 值)

  1. 轮廓系数介绍
    轮廓系数(Silhouette Score)是评估聚类效果的常用指标,其取值范围在 [-1, 1] 之间。值越接近 1,表示聚类效果越好,即类内样本相似度高,类间样本差异大;值越接近 -1,则聚类效果越差 。
  2. 遍历不同 K 值计算轮廓系数
    定义要尝试的聚类数列表 k = [2, 3, 4, 5, 6],通过遍历该列表,对每个 k 值,使用 KMeans 算法进行聚类,并计算对应的轮廓系数。为避免算法因初始化中心不同导致结果波动,设置 n_init=10 (指定算法运行次数,取最优结果),代码如下:
scores = []
k_list = [2, 3, 4, 5, 6]
for i in k_list:model = KMeans(n_clusters=i, n_init=10)  model.fit(x)labels = model.labels_score = metrics.silhouette_score(x, labels)scores.append(score)

3.确定最佳 K 值

通过 numpy 的 argmax 函数找到轮廓系数最大值对应的索引,进而从 k_list 中确定最佳聚类数 best_k,代码为:

best_k = k_list[np.argmax(scores)]
print("最佳K值:", best_k)

(三)最佳 K 值聚类及效果评估

  1. 最佳 K 值聚类:使用确定的最佳 K 值,再次构建 KMeans 模型进行聚类,得到最终的聚类标签 labels,代码如下:
model = KMeans(n_clusters=best_k, n_init=10)
model.fit(x)
labels = model.labels_

2.聚类效果评估
计算并输出最佳 K 值下聚类结果的轮廓系数,评估聚类效果,代码为:

print('轮廓系数:', metrics.silhouette_score(x, labels))

(四)聚类结果可视化

可基于 matplotlib 绘制散点图等,将不同聚类的啤酒数据在特征空间中展示出来。例如,选取两个特征维度(如热量和钠含量),以聚类标签区分颜色绘制散点图,代码示例(需根据实际特征调整):

plt.scatter(x.iloc[:, 0], x.iloc[:, 1], c=labels)
plt.xlabel(beer.columns[1])
plt.ylabel(beer.columns[2])
plt.title(f'K-Means Clustering Result with Best K={best_k}')
plt.show()

完整代码及运行结果如下:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import metrics
from sklearn.cluster import KMeans# 根据实际情况修改分隔符,比如空格分隔就用sep=' ',逗号分隔用sep=','
beer = pd.read_csv('data.txt', sep=' ', encoding='utf-8')  # 这里修改了sep参数
x = beer.iloc[:, 1:]
scores = []
k = [2, 3, 4, 5, 6]for i in k:model = KMeans(n_clusters=i, n_init=10)  # 增加了n_init参数,避免警告model.fit(x)labels = model.labels_score = metrics.silhouette_score(x, labels)scores.append(score)best_k = k[np.argmax(scores)]
print("最佳K值:", best_k)model = KMeans(n_clusters=best_k, n_init=10)
model.fit(x)
labels = model.labels_
print('轮廓系数:', metrics.silhouette_score(x, labels))
plt.scatter(x.iloc[:, 0], x.iloc[:, 1], c=labels)
plt.xlabel(beer.columns[1])
plt.ylabel(beer.columns[2])
plt.title(f'K-Means Clustering Result with Best K={best_k}')
plt.show()

本项目通过 Python 结合 pandasnumpymatplotlibsklearn 等库,实现了对啤酒数据的 K-Means 聚类分析。利用轮廓系数确定最佳聚类数,有效评估聚类效果,挖掘出啤酒数据在多属性下的聚类特征。后续可进一步拓展,如结合更多元的啤酒数据(市场销量、用户评价等)深化分析,或尝试其他聚类算法(如层次聚类)进行对比,丰富项目成果,为啤酒行业相关决策提供更全面的数据支撑 。

http://www.xdnf.cn/news/17464.html

相关文章:

  • Unity3D游戏中如何制作空气墙
  • actuary notes[2]
  • Spring Boot整合knife4j实战
  • BGP综合大实验
  • 152-基于CWT-CNN-BiGRU-Attention-SABO-LSSVM对滚动轴承的故障诊断
  • iceberg安装部署
  • java报错“ NoSuchMethodError:com.test.Service.doRoomList(Ljava/lang/String;)V解决方案
  • Text2SQL 自助式数据报表开发(Chat BI)
  • “骑行热”正当时,维乐Eden ANGEL坐垫守护舒适与健康
  • Kafka 生产者与消费者分区策略全解析:从原理到实践
  • 消息队列系统测试报告
  • 一周学会Matplotlib3 Python 数据可视化-绘制条形图(Bar)
  • 【Vue✨】Vue3 中英文切换功能实现
  • java生成用户登录token
  • 人工智能-python-机器学习-模型选择与调优实战指南:从交叉验证到朴素贝叶斯分类
  • MyBatis的xml中字符串类型判空与非字符串类型判空处理方式
  • Pytorch深度学习框架实战教程12:Pytorch混合精度推理,性能加速147%的技术实现
  • 深度解析Linux设备树(DTS):设计原理、实现框架与实例分析
  • 算术运算符指南
  • 如何用分析方法解决工作中的问题?
  • Day11 原理篇
  • 滚动条开始滚动时,左侧导航固定,当左侧内容触底到footer时左侧内容取消固定并跟随滚动条滚动
  • 【Python 小脚本·大用途 · 第 2 篇】
  • 女子试穿4条裤子留下血渍赔50元引争议:消费责任边界在哪?
  • 【星闪】Hi2821 | UART通用异步收发器 + 串口中断收发例程
  • 【人工智能99问】BERT的原理什么?(23/99)
  • 开启单片机
  • 编程基础之多维数组——矩阵交换行
  • 【YOLOv8改进 - C2f融合】C2f融合Outlook Attention:将细粒度特征编码到 token 中, 提高在图像分类和语义分割等任务中的性能
  • 【算法题】:斐波那契数列