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 等优化算法,提高聚类的稳定性和计算效率。

相关推荐
新加坡内哥谈技术21 分钟前
Virgo:增强慢思考推理能力的多模态大语言模型
人工智能·语言模型·自然语言处理
martian66527 分钟前
深入详解人工智能计算机视觉之图像生成与增强:生成对抗网络(GAN)
人工智能·计算机视觉
qq_273900231 小时前
pytorch torch.isclose函数介绍
人工智能·pytorch·python
说私域1 小时前
阿里巴巴新零售模式下的创新实践:结合开源AI智能名片2+1链动模式S2B2C商城小程序的应用探索
人工智能·开源·零售
致Great1 小时前
《你的RAG出错了?快来Get这份改进秘籍》
人工智能·llm·nlp
这我可不懂1 小时前
2025低代码与人工智能AI新篇
人工智能·低代码
XianxinMao1 小时前
企业通过私有安全端点访问大型语言模型的益处
人工智能·安全·语言模型
itwangyang5201 小时前
AIDD-人工智能药物设计-可扩展!更快!更便宜!大规模基因组数据存储新结构
人工智能
生信与遗传解读1 小时前
XGBoost算法在自定义数据集中预测疾病风险
人工智能·python·算法·数据分析
背太阳的牧羊人2 小时前
用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(2) —— 从 PDF 文档生成矢量数据库 (VectorDB),然后存储文本的嵌入向量
数据库·人工智能·sql·langchain·pdf