无监督学习

没有"标签 y",只看 "特征 X"——目标是发现数据的结构

两大场景:

  • 聚类:把数据分成若干"簇"
  • 降维:把高维数据压到低维(可视化或预处理)

KMeans 聚类

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

model = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = model.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=labels, s=10)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
            marker="x", s=200, c="red")
plt.show()

KMeans 要预先告诉它分几类n_clusters)。

怎么选 K:肘部法

import matplotlib.pyplot as plt

inertias = []
for k in range(1, 10):
    m = KMeans(n_clusters=k, n_init=10, random_state=42).fit(X)
    inertias.append(m.inertia_)

plt.plot(range(1, 10), inertias, "o-")
plt.xlabel("k")
plt.ylabel("inertia")
plt.show()

折线"拐弯"那个 k 通常是好选择。

DBSCAN:自动决定簇数

from sklearn.cluster import DBSCAN

model = DBSCAN(eps=0.5, min_samples=5)
labels = model.fit_predict(X)
# 标签 -1 表示"噪声点"

适合簇形状不规则、数量未知的数据。

PCA:降维 + 可视化

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data            # (150, 4) 四维

pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)    # 压到 2 维

plt.scatter(X_2d[:, 0], X_2d[:, 1], c=iris.target)
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%})")
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%})")
plt.show()

PCA 找出"信息量最大"的方向。两个主成分能解释多少方差,看 explained_variance_ratio_

t-SNE:更适合可视化

非线性降维,比 PCA 更能保留局部结构

from sklearn.manifold import TSNE

tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_2d = tsne.fit_transform(X)

慢一点,但视觉效果更好。只用于可视化,不用于做特征——它不是真正的"特征压缩"。

UMAP:t-SNE 的现代继任者

pip install umap-learn
import umap
X_2d = umap.UMAP(n_components=2).fit_transform(X)

比 t-SNE 快很多,AI 项目可视化高维 embedding 的标配。

异常检测:Isolation Forest

from sklearn.ensemble import IsolationForest

model = IsolationForest(contamination=0.1, random_state=42)
labels = model.fit_predict(X)
# 1 = 正常,-1 = 异常

评估聚类质量

无监督没有"答案",但有间接指标:

from sklearn.metrics import silhouette_score

score = silhouette_score(X, labels)
# 范围 [-1, 1],越接近 1 越好

何时降维

  • 数据可视化:高维数据画出来看
  • 特征压缩:降低后续模型计算量
  • 去噪:保留主要信号,忽略次要

注意:降维有信息损失——不一定提升模型效果。先有 baseline 再尝试降维

下一篇正式进入深度学习——PyTorch 入门。