【机器学习入门】第11讲:K均值聚类与无监督学习——从数据分群到模式发现
HitPaw Watermark Remover 链接:https://pan.quark.cn/s/4598337f6b3e。「微信被删好友检测工具」筷莱坌教狴犴狾夺郝链接:https://pan.quark.cn/s/fe4976448ca1。【资源软件】复制整段内容,打开最新版「夸克APP」即可获取。伏脂撺掇蒌葶苘洞座 /链接:https://pan.quark.cn/s/5180c62aa
·
【资源软件】 动作暨昝绳鹤锁多好 /494b36Tkwj😕
链接:https://pan.quark.cn/s/43159509c536
「微信被删好友检测工具」筷莱坌教狴犴狾夺郝 链接:https://pan.quark.cn/s/43159509c536
链接:https://pan.quark.cn/s/4598337f6b3e
「【美剧系列】」链接:https://pan.quark.cn/s/663e3ca79519
复制群口令 !0b7236TlXn!😕
将加入群聊免费医院分享
引言:当数据没有“标签”时,我们能做什么?
假设你是一家电商公司的数据分析师,面对海量用户行为数据却无明确分类标签:
- 任务:将用户划分为不同群体,实现精准营销
- 挑战:
- 用户特征复杂(浏览时长、购买频率、品类偏好等)
- 需自动发现隐藏模式,而非依赖人工定义规则
- 需求:算法需高效处理百万级数据,且结果可解释
这正是无监督学习的核心价值! 本文将深入解析K均值聚类算法,教你从无标签数据中挖掘潜在规律。
一、无监督学习与聚类基础
1.1 无监督学习 vs 监督学习
| 维度 | 监督学习 | 无监督学习 |
|---|---|---|
| 数据要求 | 需要带标签数据 | 仅需特征数据 |
| 目标 | 预测已知标签 | 发现数据内在结构 |
| 典型任务 | 分类、回归 | 聚类、降维 |
1.2 聚类的核心目标
- 将数据划分为同质子集,满足:
- 簇内相似性高(同一簇样本彼此接近)
- 簇间差异性大(不同簇样本明显分离)
二、K均值算法原理与数学推导
2.1 算法步骤图解
- 初始化质心:随机选择K个点作为初始簇中心
- 分配样本:将每个点分配到最近的质心所属簇
- 更新质心:重新计算每个簇的均值作为新质心
- 迭代优化:重复2-3步直至质心稳定或达到最大迭代次数
可视化过程:
[初始随机质心] → [样本分配] → [质心更新] → [重新分配] → ... → [收敛]
2.2 数学形式化
- 目标函数(畸变函数,SSE):
SSE = Σ_{i=1}^K Σ_{x∈C_i} ||x - μ_i||²- μ_i:第i个簇的质心
- C_i:第i个簇的样本集合
- 优化目标:最小化SSE
三、代码实战:从二维数据到图像压缩
3.1 基础聚类实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成合成数据
X, y_true = make_blobs(n_samples=500, centers=3, random_state=42)
# 训练K均值模型
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
# 可视化结果
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis', s=20)
plt.scatter(centers[:,0], centers[:,1], c='red', s=200, alpha=0.8, marker='X')
plt.title("K均值聚类结果")
plt.show()
3.2 图像颜色压缩应用
from sklearn.datasets import load_sample_image
china = load_sample_image("china.jpg")
# 预处理:将图像转换为二维数组
X = china.reshape(-1, 3) / 255.0
# 使用K均值压缩颜色
kmeans = KMeans(n_clusters=16)
kmeans.fit(X)
X_compressed = kmeans.cluster_centers_[kmeans.labels_]
X_compressed = X_compressed.reshape(china.shape)
# 对比原图与压缩图
plt.figure(figsize=(12,6))
plt.subplot(121).imshow(china).set_title("原图(16万色)")
plt.subplot(122).imshow(X_compressed).set_title("压缩图(16色)")
plt.show()
四、聚类质量评估:科学衡量“好坏”
4.1 肘部法则(Elbow Method)
- 原理:SSE随K增大而下降,选择拐点对应的K值
- 代码实现:
sse = []
K_range = range(1, 10)
for k in K_range:
kmeans = KMeans(n_clusters=k).fit(X)
sse.append(kmeans.inertia_)
plt.plot(K_range, sse, 'bo-')
plt.xlabel("K值")
plt.ylabel("SSE")
plt.title("肘部法则选择最佳K值")
plt.show()
4.2 轮廓系数(Silhouette Score)
- 定义:衡量样本与同簇/异簇的相似度,范围[-1,1]
- 公式:
s(i) = (b(i) - a(i)) / max(a(i), b(i))- a(i):样本i到同簇其他点的平均距离
- b(i):样本i到最近异簇的平均距离
代码计算:
from sklearn.metrics import silhouette_score
scores = []
for k in range(2, 10):
labels = KMeans(n_clusters=k).fit_predict(X)
scores.append(silhouette_score(X, labels))
plt.plot(range(2,10), scores, 'ro-')
plt.xlabel("K值")
plt.ylabel("轮廓系数")
plt.title("轮廓系数评估聚类质量")
plt.show()
五、K均值的优化策略与局限
5.1 常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 初始质心敏感 | 使用k-means++初始化 |
| 局部最优解 | 多次随机初始化取最优结果 |
| 高维数据效果差 | 先降维(如PCA)再聚类 |
| 非球形簇失效 | 改用DBSCAN或谱聚类 |
5.2 算法优缺点总结
| 优势 | 局限 |
|---|---|
| 简单高效,适合大规模数据 | 需预先指定K值 |
| 结果可解释性强 | 对异常值敏感 |
| 易于扩展到分布式计算 | 只能发现球形簇 |
六、实战案例:客户价值分群
6.1 数据预处理
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 加载零售数据(用户ID、消费频率、客单价、最近购买间隔)
data = pd.read_csv("customer_data.csv")
X = data[['frequency', 'amount', 'recency']]
# 标准化与异常值处理
X = StandardScaler().fit_transform(X)
X = X[(np.abs(X) < 3).all(axis=1)] # 剔除3σ外的异常值
6.2 聚类分析与业务解读
kmeans = KMeans(n_clusters=4)
labels = kmeans.fit_predict(X)
# 分析簇特征
cluster_profile = pd.DataFrame(X, columns=['frequency', 'amount', 'recency'])
cluster_profile['cluster'] = labels
print(cluster_profile.groupby('cluster').mean())
"""
frequency amount recency
cluster
0 1.22 0.95 -1.32 → 高价值活跃用户
1 -0.83 -0.72 0.21 → 低频低价值用户
2 0.31 -0.11 -0.98 → 中频唤醒用户
3 -1.02 1.85 1.09 → 高客单价沉睡用户
"""
七、总结与进阶方向
7.1 核心要点回顾
- K均值通过迭代优化质心实现数据划分,适合处理球形簇
- 肘部法则与轮廓系数是评估聚类效果的关键工具
- 业务场景中需结合领域知识解读簇含义
7.2 延伸学习建议
- 层次聚类:探索数据分层结构(AGNES算法)
- 密度聚类:DBSCAN处理任意形状簇
- 深度聚类:结合自编码器与K均值
更多推荐

所有评论(0)