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

机器学习算法-k-means

今天我们用 「超市顾客分组」 的例子来讲解K-means算法,从原理到实现一步步拆解,保证零基础也能懂!


🛒 例子背景

假设你是超市经理,手上有顾客的以下数据:

顾客ID每月消费金额(元)每周到店次数
130002
250008
335003
470006
520001

你想把顾客分成 3个群体,分别制定营销策略,该怎么做?


🌟 K-means原理

1. 核心思想

"物以类聚" —— 让相似特征的顾客自动聚成一类
➡️ 通过计算距离,把数据划分到最近的簇(cluster)

2. 算法步骤

1️⃣ 随机选3个初始中心点(比如选顾客1/2/3作为初始中心)
2️⃣ 把所有顾客分到最近的中心(按距离计算)
3️⃣ 重新计算中心点(取各簇的平均值)
4️⃣ 重复2-3步直到中心点不再变化

3. 距离计算(欧氏距离)

比如顾客4(7000,6)到中心点(5000,8)的距离:
√[(7000-5000)² + (6-8)²] = √(4,000,000 + 4) ≈ 2000


🎯 具体分步演示

初始随机中心

  • 中心1:顾客1 (3000,2)

  • 中心2:顾客2 (5000,8)

  • 中心3:顾客3 (3500,3)

第一轮分组

  1. 顾客4到三个中心的距离:

    • 到中心1:√[(7000-3000)²+(6-2)²] ≈ 4000

    • 到中心2:≈2000

    • 到中心3:≈3504
      → 归到中心2的簇

  2. 同理分组其他顾客

重新计算中心

  • 中心2的新位置 = (5000+7000)/2=6000, (8+6)/2=7 → (6000,7)

重复直到稳定(通常3-5轮)


🛠️ Python代码实现

from sklearn.cluster import KMeans
import numpy as np# 准备数据
X = np.array([[3000, 2],[5000, 8],[3500, 3],[7000, 6],[2000, 1]
])# 创建模型(分3类)
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)# 查看结果
print("簇中心点坐标:\n", kmeans.cluster_centers_)
print("各顾客所属簇:", kmeans.labels_)# 预测新顾客
new_customer = np.array([[4000, 4]])
print("新顾客所属簇:", kmeans.predict(new_customer))

输出示例

簇中心点坐标:[[ 3333.33   2.  ]  # 低频低消费组[ 6000.     7.  ]  # 高频高消费组[ 2000.     1.  ]] # 低频低消费组(可能异常值)
各顾客所属簇: [0 1 0 1 2]
新顾客所属簇: [0]

📊 结果解读

簇号特征营销策略
0中等消费,低频到店发送折扣券刺激消费
1高消费,高频到店推送VIP专属福利
2低消费,低频到店发送新商品试用邀请

🔍 关键细节

  1. 如何选K值?

    • 肘部法则(Elbow Method):观察不同K值时误差下降的拐点

  2. 特征标准化很重要!

    • 消费金额(3000-7000)和到店次数(1-8)量纲不同,需先标准化:

      from sklearn.preprocessing import StandardScaler
      X_scaled = StandardScaler().fit_transform(X)
       
  3. 算法局限性

    • 对初始中心敏感(可能局部最优)→ 多跑几次选最好结果

    • 只适合球形分布数据(对复杂形状需用DBSCAN等算法)


🌰 实际应用场景

  1. 用户画像:电商用户分群

  2. 图像压缩:用16种颜色代表所有像素(K=16)

  3. 异常检测:离所有中心点远的点可能是异常

http://www.lryc.cn/news/2396525.html

相关文章:

  • ADQ36-2通道2.5G,4通道5G采样PXIE
  • LLM:decoder-only 思考
  • 数字创新智慧园区建设及运维方案
  • 【科研绘图系列】R语言绘制森林图(forest plot)
  • Springcloud Alibaba自定义负载均衡详解
  • 深度学习---负样本训练
  • SpringAI+DeepSeek大模型应用开发实战
  • 【Python Cookbook】文件与 IO(一)
  • STM32 HAL库函数学习 GPIO篇
  • 如何以 9 种方式将照片从 iPhone 传输到笔记本电脑
  • 根据jvm源码剖析类加载机制
  • Mixly1.0/2.0/3.0 (windows系统) 安装教程及使用常见问题解决
  • DDS通信中间件——DDS-TSN规范
  • JWT安全:弱签名测试.【实现越权绕过.】
  • MATLAB实现井字棋
  • Baklib知识中台加速企业服务智能化实践
  • 在AIX环境下修改oracle 11g rac的IP地址
  • VMware Tools 手动编译安装版
  • android平台驱动开发(六)--Makefile和Kconfig简介
  • 【手写系列】手写线程池
  • python学习打卡day40
  • redis高并发问题
  • Live Helper Chat 安装部署
  • ARXML解析与可视化工具
  • PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
  • LeetCode 热题 100 208. 实现 Trie (前缀树)
  • python爬虫:RoboBrowser 的详细使用
  • 在日常管理服务器中如何防止SQL注入与XSS攻击?
  • Wkhtmltopdf使用
  • ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案