K-Means 聚类算法:用生活场景讲解机器学习的“分组”方法

一、K-Means 算法概述

K-Means 是一种经典的无监督学习聚类算法,目的是将数据集中 n 个样本划分成 K 个簇(cluster),每个样本根据其特征被归入与之最接近的簇。简单来说,这就像在超市购物时,顾客会被根据购物习惯划分为"日用品顾客""高频食品顾客"和"零食顾客"三类,从而实现有针对性的促销。

"将 n 个样本划分成 K 个簇"的含义

假设你是一位校长,拥有 500 名学生的期中考试成绩数据。你希望根据成绩将学生划分成 3 个组:优秀、中等、需辅导。K-Means 算法会根据每位学生的数学、语文、英语成绩,将这些 500 名学生划分为这 3 个簇(即组)。


二、K-Means 算法步骤

  1. 确定聚类数量 K

    选择 K 个初始聚类中心点(可随机选择,也可以使用改进方法,如 K-Means++)。

  2. 分配样本点

    根据某种距离度量(通常是欧几里得距离),将每个样本点分配给距离最近的聚类中心。例如,在购物中心顾客分群中,距离最近的聚类中心可能代表"购物频率相似"的一类人群。

  3. 更新聚类中心

    计算每个簇中所有点的平均值,更新聚类中心位置。

  4. 重复步骤 2 和 3

    直到聚类中心的位置不再发生变化,或达到最大迭代次数。


三、K-Means 数学原理


四、K-Means 示例代码

1. Python 示例
复制代码
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

# 生成示例数据集(例如顾客的月消费额和购物频率)
X = np.array([[200, 5], [220, 6], [180, 4], [3000, 15], [3100, 16], [3050, 15]])

# 创建 KMeans 模型
kmeans = KMeans(n_clusters=2, random_state=0, n_init='auto').fit(X)

# 获取聚类标签
labels = kmeans.labels_
print("每个点的聚类标签:", labels)

# 聚类中心
centers = kmeans.cluster_centers_
print("聚类中心坐标:", centers)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x', label='聚类中心')
plt.title("K-Means 聚类示例:顾客消费数据分组")
plt.legend()
plt.show()
2. 输出

五、K-Means 聚类效果评估方法

  1. SSE(误差平方和)

    SSE 越小,表示聚类效果越好。

  2. 轮廓系数(Silhouette Coefficient)

    评估簇内一致性和簇间分离度,值在 [-1, 1] 之间,越接近 1 聚类效果越好。

  3. Calinski-Harabasz 指数

    衡量簇间方差和簇内方差之比,值越大效果越好。


六、选择最佳 K 值的方法

  1. 肘部法则(Elbow Method)

    通过绘制不同 KK 值对应的 SSE 曲线,找到曲线拐点处的 KK 值:

    复制代码
    sse = []
    for k in range(1, len(X) + 1):  # 让 k 最大值等于样本数量
        kmeans = KMeans(n_clusters=k, n_init='auto').fit(X)
        sse.append(kmeans.inertia_)
    
    plt.plot(range(1, len(X) + 1), sse, marker='o')
    plt.xlabel('簇数量 K')
    plt.ylabel('SSE')
    plt.title('肘部法则示例')
    plt.show()
  2. 轮廓系数法(Silhouette Score)

    计算不同 KK 值的轮廓系数,选择系数最大的 KK 值。


七、K-Means 的优缺点

优点
  • 简单易实现,计算效率高,尤其适用于大规模数据集。
  • 对高维数据同样适用。
  • 聚类结果可解释性强。
缺点
  • 需要预先指定 KK 值。
  • 初始中心点选择不同,可能导致不同的聚类结果。
  • 对异常值和噪声敏感,容易受异常数据影响。
  • 聚类簇形状为"球形"的数据效果较好,对于非线性分布效果较差。

八、K-Means 改进方法

  1. K-Means++

    通过优化初始聚类中心的选择,减少随机初始化带来的不稳定问题。

  2. MiniBatch K-Means

    适用于大规模数据集,每次仅使用小批量数据进行聚类,提高计算效率。

  3. 其他算法(如 DBSCAN、GMM)

    当数据簇形状不规则时,可考虑使用密度聚类算法(如 DBSCAN)或概率模型聚类(如 GMM)。


九、K-Means 实际应用场景

1. 图像分割

K-Means 算法可将图像的像素点聚类成不同颜色簇,实现图像简化或压缩。

复制代码
from sklearn.cluster import KMeans
from skimage import io

image = io.imread('image.jpg')
image_2d = image.reshape(-1, 3)

# 聚类为 5 个颜色簇
kmeans = KMeans(n_clusters=5).fit(image_2d)
segmented_img = kmeans.cluster_centers_[kmeans.labels_].reshape(image.shape).astype('uint8')

io.imshow(segmented_img)
io.show()

|-----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |

2. 顾客消费分群

根据顾客的消费金额和频次,将顾客分为"高消费高频次"、"中消费中频次"和"低消费低频次"三类,有助于个性化营销。

顾客消费分群示例:Python 代码实现

以下是一个基于 KMeans 聚类算法对顾客消费行为进行分群的完整代码示例。假设数据集中包含"年消费金额"和"月平均购物次数"两个特征:

数据集示例:
顾客ID 年消费金额(元) 月平均购物次数
1 5000 5
2 20000 10
3 15000 8
4 8000 6
5 30000 12

完整 Python 代码示例
复制代码
# 导入必要库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 创建模拟数据集
data = {
    '顾客ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '年消费金额': [5000, 20000, 15000, 8000, 30000, 12000, 10000, 25000, 35000, 18000],
    '月平均购物次数': [5, 10, 8, 6, 12, 7, 5, 10, 15, 9]
}

# 转换为 DataFrame
df = pd.DataFrame(data)

# 提取聚类所需的特征
X = df[['年消费金额', '月平均购物次数']].values

# 创建并拟合 KMeans 模型
kmeans = KMeans(n_clusters=3, random_state=0)
df['聚类标签'] = kmeans.fit_predict(X)

# 输出聚类后的数据
print("聚类结果:")
print(df)

# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=df['聚类标签'], cmap='viridis', marker='o')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='x', label='聚类中心')
plt.title("顾客消费行为聚类")
plt.xlabel("年消费金额(元)")
plt.ylabel("月平均购物次数")
plt.legend()
plt.show()

代码说明
  1. 模拟数据集:
    • 年消费金额:顾客一年内的总消费金额。
    • 月平均购物次数:顾客每月的平均购物次数。
  2. KMeans 聚类模型:
    • n_clusters=3:将顾客分成 3 个群体,比如"高消费高频次"、"中消费中频次"和"低消费低频次"。
  3. 聚类标签:
    • fit_predict(X) 方法将数据聚类,并返回每个样本的聚类标签。

运行结果示例

打印的 df 聚类结果示例如下:

复制代码
顾客ID  年消费金额  月平均购物次数  聚类标签
0     1   5000        5     1
1     2  20000       10     2
2     3  15000        8     2
3     4   8000        6     1
4     5  30000       12     0
5     6  12000        7     1
6     7  10000        5     1
7     8  25000       10     2
8     9  35000       15     0
9    10  18000        9     2
  • 标签 0:中等消费中等频次用户
  • 标签 1:高消费高频次用户
  • 标签 2:低消费低频次用户

可视化聚类图示
  • 每个点代表一个顾客,颜色不同表示不同的聚类标签。
  • 红色的 x 表示聚类中心。
3. 推荐系统优化

通过用户行为数据将用户分群,识别出相似兴趣爱好的用户群体,提升推荐的精准度。

用户行为数据聚类示例:Python 代码实现

以下是一个基于 KMeans 聚类算法对用户行为数据进行分群的完整代码示例。假设我们有一个数据集,包含以下用户行为特征:

用户ID 浏览时长(分钟) 购买次数 评论次数 收藏次数
1 60 2 5 3
2 120 4 10 6
3 30 1 1 0
4 180 8 12 10
5 45 0 0 1

完整 Python 代码示例
复制代码
# 导入必要库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 模拟用户行为数据
data = {
    '用户ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '浏览时长(分钟)': [60, 120, 30, 180, 45, 150, 300, 240, 100, 20],
    '购买次数': [2, 4, 1, 8, 0, 5, 10, 7, 3, 1],
    '评论次数': [5, 10, 1, 12, 0, 8, 15, 9, 5, 2],
    '收藏次数': [3, 6, 0, 10, 1, 4, 8, 7, 5, 1]
}

# 创建 DataFrame
df = pd.DataFrame(data)

# 提取特征列
X = df[['浏览时长(分钟)', '购买次数', '评论次数', '收藏次数']]

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 创建并拟合 KMeans 模型
kmeans = KMeans(n_clusters=3, random_state=42)
df['聚类标签'] = kmeans.fit_predict(X_scaled)

# 输出聚类后的数据
print("聚类结果:")
print(df)

# 可视化:用第一个和第二个特征进行二维聚类展示
plt.figure(figsize=(8, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=df['聚类标签'], cmap='viridis', marker='o')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='x', label='聚类中心')
plt.title("用户行为数据聚类结果")
plt.xlabel("标准化浏览时长")
plt.ylabel("标准化购买次数")
plt.legend()
plt.show()

代码说明
  1. 数据标准化

    • StandardScaler 对不同量纲的数据进行标准化,确保浏览时长和购买次数等特征具有相同的尺度。
    • 标准化公式: Z=X−mean(X)std(X)Z = \frac{X - \text{mean}(X)}{\text{std}(X)}
  2. 聚类模型创建

    • n_clusters=3:将用户分为 3 类,比如"高活跃高购买用户"、"中等活跃用户"和"低活跃用户"。
    • fit_predict(X_scaled) 方法将数据聚类,并返回每个样本的聚类标签。
  3. 可视化

    • 使用二维图展示用户行为的聚类情况,用浏览时长和购买次数作为坐标轴。

聚类标签示例输出
复制代码
用户ID  浏览时长(分钟)  购买次数  评论次数  收藏次数  聚类标签
0     1        60     2     5     3     1
1     2       120     4    10     6     0
2     3        30     1     1     0     1
3     4       180     8    12    10     2
4     5        45     0     0     1     1
5     6       150     5     8     4     0
6     7       300    10    15     8     2
7     8       240     7     9     7     2
8     9       100     3     5     5     0
9    10        20     1     2     1     1

分析聚类结果
  • 标签 0:中等活跃用户,有较高的购买和评论次数。
  • 标签 1:高活跃用户,浏览时间长,频繁购买和评论。
  • 标签 2:低活跃用户,浏览时长短,购买和评论较少。

应用场景
  • 推荐系统优化:针对高活跃用户推荐更多折扣和促销活动,提高忠诚度。
  • 用户唤醒策略:针对低活跃用户提供限时优惠和个性化推送,提高回访率。
  • 行为分析:对不同群体进行行为分析,制定更精准的内容和产品推荐策略。

可选改进
  • 增加更多行为特征,如"停留页面数"、"访问频率"等,提高聚类的细粒度。
  • 尝试其他聚类方法,如 DBSCANGMM,对非球形聚类效果更好。

十、总结

K-Means 算法模拟了"根据相似特征进行归类分组"的过程,非常适用于场景化分析和分群任务。在实践中,选择合适的 KK 值和初始中心点至关重要。对大规模数据集,可以使用 K-Means++ 和 MiniBatch K-Means 等优化算法,提高聚类的稳定性和计算效率。

相关推荐
NAGNIP9 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab10 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab10 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP14 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年14 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS14 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区15 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang16 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx