无监督学习入门
无监督学习入门
什么是无监督学习
无监督学习(Unsupervised Learning)是一种没有标签指导的学习方式。模型需要从未标记的数据中自动发现隐藏的模式、结构或规律。就像让一个孩子在没有大人指导下,自己把玩具按颜色或形状分类一样。
无监督学习的核心任务
1. 聚类(Clustering)
将相似的数据点自动分组到同一类别中。常见应用:
- 客户细分
- 新闻文章分组
- 基因表达分析
- 异常检测
2. 降维(Dimensionality Reduction)
在保留重要信息的前提下,减少数据的特征维度。常见应用:
- 数据可视化
- 特征提取
- 数据压缩
- 去噪处理
常用无监督学习算法
| 算法 | 类型 | 特点 |
|---|---|---|
| K-Means | 聚类 | 简单高效,需要预设K值 |
| DBSCAN | 聚类 | 基于密度,可发现任意形状 |
| 层次聚类 | 聚类 | 生成树状结构 |
| PCA | 降维 | 线性降维,最大化方差 |
| t-SNE | 降维 | 非线性降维,适合可视化 |
| UMAP | 降维 | 快速,保留局部和全局结构 |
聚类算法对比
K-Means
- 优点:实现简单、计算效率高
- 缺点:需要预设K值、对噪声敏感、只能发现球形簇
DBSCAN
- 优点:无需预设K值、可发现任意形状、能识别噪声点
- 缺点:对参数敏感、高维数据效果差
代码示例:聚类与降维实战
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score
# 生成模拟数据
X, y_true = make_blobs(
n_samples=300, centers=4, cluster_std=0.60, random_state=42
)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# --- K-Means聚类 ---
# 使用肘部法则确定最佳K值
inertias = []
K_range = range(2, 10)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans.fit(X_scaled)
inertias.append(kmeans.inertia_)
# 使用轮廓系数评估
print("不同K值的轮廓系数:")
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X_scaled)
score = silhouette_score(X_scaled, labels)
print(f" K={k}: {score:.4f}")
# 使用最佳K值进行聚类
best_k = 4
kmeans = KMeans(n_clusters=best_k, random_state=42, n_init=10)
labels_kmeans = kmeans.fit_predict(X_scaled)
# --- DBSCAN聚类 ---
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels_dbscan = dbscan.fit_predict(X_scaled)
n_clusters_dbscan = len(set(labels_dbscan)) - (1 if -1 in labels_dbscan else 0)
print(f"\nDBSCAN发现的簇数: {n_clusters_dbscan}")
# --- PCA降维 ---
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"\nPCA解释方差比: {pca.explained_variance_ratio_}")
print(f"累计解释方差: {sum(pca.explained_variance_ratio_):.4f}")
# 输出聚类结果统计
print(f"\nK-Means各簇样本数:")
for i in range(best_k):
print(f" 簇{i}: {sum(labels_kmeans == i)}个样本")
如何选择算法
选择无监督学习算法时需要考虑:
- 数据规模:大规模数据优先考虑K-Means
- 簇形状:任意形状选择DBSCAN
- 噪声比例:噪声多选择DBSCAN
- 维度高低:高维数据先降维再聚类
无监督学习的挑战
- 评估困难:没有标签作为参考,评估指标有局限性
- 结果解释:聚类结果可能需要领域知识来解释
- 参数敏感:算法性能高度依赖参数设置
总结
无监督学习在数据探索和模式发现中具有重要价值。虽然评估和解释比监督学习更困难,但在实际应用中(如客户细分、异常检测)发挥着不可替代的作用。建议结合可视化技术来更好地理解无监督学习的结果。