哈喽,大家好~
这个对于刚刚接触机器学习的同学来说,非常的重要。
今天咱们从原理到案例,从各个方面深入理解~
监督学习:已知输入-输出样本对 ,目标是学习一个映射 ,使得预测值 对真实 的误差最小。典型任务:分类、回归。
无监督学习:仅有输入样本 ,没有标签 ,目标是挖掘数据的内在结构,如聚类、密度估计、降维、异常检测等。
直观理解的话:监督学习强调预测,依赖外部标签提供目标信号。
无监督学习强调发现结构/表征,依赖内部一致性标准(如重构误差、似然、聚类紧致度等)。
监督学习:风险最小化与判别建模
目标与风险最小化
给定分布 上的样本 ,监督学习的理想目标是最小化期望风险:
其中 为损失函数(如分类交叉熵、回归均方误差)。由于 未知,采用经验风险最小化(ERM):
为控制模型复杂度避免过拟合,引入正则化项 :
常见损失与对应最优解的统计含义:
回归中的平方损失 ,对应的贝叶斯最优解为条件期望 。
分类中的 0-1 损失的贝叶斯最优分类器为:
判别式概率模型与对数似然
以逻辑回归(多类 softmax)为例,建模 :
最大化对数似然(等价最小化交叉熵):
其梯度为(以二分类 sigmoid 为例):
其中 ,并加入 正则化 。
间隔最大化:支持向量机(SVM)
SVM 强调几何间隔,软间隔 SVM 的二分类原始问题为:
等价的经验目标函数(合页损失):
通过核技巧可处理非线性边界:用核函数 隐式映射到高维特征空间,常用 RBF 核 。
泛化、偏差–方差与容量控制
泛化误差分解为偏差–方差–噪声:
容量控制方法:正则化、早停、数据增广、交叉验证、结构风险最小化等。
监督学习的侧重点:
预测准确与可泛化性(对未知测试分布表现) 带标签数据的高效利用(半监督、主动学习等为延伸) 可解释性与校准(概率输出的可靠性)
无监督学习:结构发现与生成/表征建模
目标函数与典型范式
无监督学习因为没有标签 ,常见目标包括:
聚类:最小化类内紧致度、最大化类间分离度(如 KMeans) 密度估计:最大化似然或近似似然(如高斯混合、核密度估计、流模型) 降维/表征学习:最大化重构质量或保持局部/全局结构(如 PCA、AE、t-SNE、UMAP)
本质差异在于优化目标与评估指标均来自数据内在结构,而非外部标签监督信号。
聚类:K-Means 的目标与推导
K-Means 的目标函数是类内平方误差(within-cluster sum of squares, WCSS)最小化:
Lloyd 迭代(坐标下降):
赋值步: 更新步:
该算法收敛到局部最优,KMeans++ 初始化可显著改善结果。
评价(无监督内部指标):
silhouette 系数(轮廓系数),样本 的 silhouette:
为样本到所属簇内样本的平均距离, 为样本到最近其他簇样本的平均距离。整体 silhouette 越大越好。
降维:主成分分析(PCA)与特征方向
PCA 目标是寻找正交方向,使得投影方差最大或重构误差最小。
设 零均值, 列正交(),优化:
等价于选取协方差矩阵 的最大 个特征向量。最小重构误差形式:
其最优解 即为 的主特征向量,。PCA 同时兼具可解释性(方差解释率)和可逆近似(通过 重构)。
生成式混合模型:高斯混合与 EM
高斯混合模型(GMM)假设
最大化对数似然:
用 EM 算法求解:
E 步(责任度):
M 步(参数更新):
模型选择可用 BIC/AIC 等信息准则(越小越好):
其中 是自由参数个数。
无监督学习的侧重点:
结构发现(聚类、流形) 表征学习与可视化(PCA/t-SNE/UMAP) 密度估计与生成能力(GMM、Flow、VAE) 模型选择依赖内部指标或先验知识(而非标签)
两类方法的本质区别与联系
目标函数来源不同:监督依赖标签定义的外在损失 ;无监督依赖数据内在结构(重构、似然、距离/图结构)。
可评估性不同:监督可直接用外部指标(准确率/ROC);无监督常用内部指标(silhouette、BIC)或外部真实标签对齐指标(ARI、NMI),但后者在真实场景往往不可得。
假设差异:监督学习隐含“预测关系”假设(如 可学习);无监督学习隐含“结构假设”(如簇球形/可分、多峰密度、低维流形)。
数据需求:监督成本在于标注,无监督成本在于模型选择与解释。
联系:半监督/自监督在两者之间架桥,使用无监督目标(对比学习、重构)获得表征,再用少量标签微调;生成式模型亦可作为监督任务的先验。
一个完整案例
为了说明问题,我们构造一个 5 维、3 类的虚拟高斯混合数据。
用 PCA 投到 2 维平面可视化。
监督学习:使用 RBF 核 SVM 学习分类边界,并在 PCA-2D 平面上展示决策区域与测试点。 无监督学习:使用 KMeans 聚类对比真实标签(外部对齐指标 ARI),并展示聚类效果;进一步用 K 的模型选择曲线(KMeans 的 silhouette 与 GMM 的 BIC)展示无监督模型选择的复杂性。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.metrics import accuracy_score, confusion_matrix, silhouette_score, adjusted_rand_score
# 1) 数据(5D,3类高斯分布)
rng = np.random.default_rng(42)
n_per_class = 2000
d = 5
K_true = 3
means = np.array([
[0.0, 0.0, 0.0, 0.0, 0.0],
[3.0, 3.0, -2.0, 0.5, 1.0],
[-3.0, 2.0, 3.0, 1.0, -2.0]
])
covs = []
for k in range(K_true):
A = rng.normal(size=(d, d))
Sigma = A @ A.T + np.diag(rng.uniform(0.2, 1.5, size=d)) # 保证正定且各向异性
covs.append(Sigma)
Xs = []
ys = []
for k in range(K_true):
Xk = rng.multivariate_normal(mean=means[k], cov=covs[k], size=n_per_class)
Xs.append(Xk)
ys.append(np.full(n_per_class, k))
X = np.vstack(Xs)
y = np.concatenate(ys)
# 2) 可视化用 PCA 降到2维
pca = PCA(n_components=2, random_state=42)
X2 = pca.fit_transform(X)
# 3) 监督学习:切分训练/测试并训练 RBF-SVM
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, stratify=y, random_state=42)
clf = SVC(C=5.0, kernel='rbf', gamma='scale', decision_function_shape='ovr', random_state=42)
clf.fit(X_train, y_train)
y_pred_test = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred_test)
cm = confusion_matrix(y_test, y_pred_test)
# 4) 构造 PCA-2D 网格并映射回5D,绘制监督决策区域
x_min, x_max = X2[:,0].min() - 1.0, X2[:,0].max() + 1.0
y_min, y_max = X2[:,1].min() - 1.0, X2[:,1].max() + 1.0
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 220), np.linspace(y_min, y_max, 220))
grid_2d = np.c_[xx.ravel(), yy.ravel()]
# 通过 PCA 的逆变换回到5D空间的同一仿射子空间近似
grid_5d = pca.inverse_transform(grid_2d)
Z = clf.predict(grid_5d).reshape(xx.shape)
# 5) 无监督学习:KMeans 聚类与评价
kmeans = KMeans(n_clusters=3, n_init=20, random_state=42)
labels_km = kmeans.fit_predict(X)
ari_km = adjusted_rand_score(y, labels_km) # 与真值对齐的外部指标,仅为示范
sil_km = silhouette_score(X, labels_km, metric='euclidean')
# 6) 无监督模型选择曲线:K=2..6 的 silhouette 与 GMM 的 BIC
Ks = list(range(2, 7))
sil_scores = []
bics = []
for k in Ks:
km = KMeans(n_clusters=k, n_init=20, random_state=42)
lbl = km.fit_predict(X)
sil_scores.append(silhouette_score(X, lbl))
gmm = GaussianMixture(n_components=k, covariance_type='full', n_init=5, random_state=42)
gmm.fit(X)
bics.append(gmm.bic(X))
# 7) 可视化分析
fig, axs = plt.subplots(2, 2, figsize=(14, 10), constrained_layout=True, dpi=140)
# ColorBrewer
colors = ['', '', '']
light_colors = ['', '', '']
cm_bg = ListedColormap(light_colors)
cm_pts = ListedColormap(colors)
# 子图1:真值分布(PCA-2D)
ax = axs[0, 0]
for k, c in enumerate(colors):
pts = X2[y == k]
ax.scatter(pts[:,0], pts[:,1], s=20, color=c, alpha=0.85, edgecolor='k', linewidths=0.3, label=f'类 {k}')
# 真值簇心(PCA-2D 的均值)
for k, c in enumerate(colors):
mu2 = X2[y == k].mean(axis=0)
ax.scatter(mu2[0], mu2[1], marker='*', s=180, color='gold', edgecolor='k', linewidths=0.8, zorder=5)
ax.set_title('子图1|真值标签的PCA-2D分布', fontsize=12)
ax.set_xlabel('PC1'); ax.set_ylabel('PC2')
ax.legend(loc='best', fontsize=9)
ax.grid(alpha=0.25)
# 子图2:监督 SVM 决策区域(在PCA切片上)+ 测试集点
ax = axs[0, 1]
ax.contourf(xx, yy, Z, levels=[-0.5,0.5,1.5,2.5], cmap=cm_bg, alpha=0.7)
# 测试集点映到2D
X_test_2d = pca.transform(X_test)
correct = (y_pred_test == y_test)
ax.scatter(X_test_2d[correct,0], X_test_2d[correct,1], s=35, c=cm_pts(y_test[correct]), edgecolor='k', linewidths=0.4, label='测试-正确')
ax.scatter(X_test_2d[~correct,0], X_test_2d[~correct,1], s=65, facecolors='none', edgecolors='', linewidths=1.2, label='测试-误分类')
ax.set_title(f'子图2|监督SVM决策区域(Acc={acc:.3f})', fontsize=12)
ax.set_xlabel('PC1'); ax.set_ylabel('PC2')
ax.legend(loc='best', fontsize=9)
ax.grid(alpha=0.25)
# 子图3:无监督KMeans聚类(PCA-2D)+ 簇中心
ax = axs[1, 0]
lbl = labels_km
for k in range(kmeans.n_clusters):
pts = X2[lbl == k]
ax.scatter(pts[:,0], pts[:,1], s=18, color=colors[k % len(colors)], alpha=0.85, edgecolor='k', linewidths=0.3, label=f'簇 {k}')
# 簇中心(投到2D)
centers_2d = pca.transform(kmeans.cluster_centers_)
ax.scatter(centers_2d[:,0], centers_2d[:,1], marker='X', s=200, color='', edgecolor='k', linewidths=0.8, label='簇中心')
ax.set_title(f'子图3|KMeans聚类(ARI={ari_km:.3f}, Sil={sil_km:.3f})', fontsize=12)
ax.set_xlabel('PC1'); ax.set_ylabel('PC2')
ax.legend(loc='best', fontsize=9)
ax.grid(alpha=0.25)
# 子图4:无监督模型选择曲线(KMeans Silhouette vs GMM BIC)
ax = axs[1, 1]
ax.plot(Ks, sil_scores, color='', marker='o', linewidth=2.0, label='KMeans Silhouette(越大越好)')
best_k_sil = Ks[int(np.argmax(sil_scores))]
ax.axvline(best_k_sil, color='', linestyle='--', alpha=0.6)
ax.set_xlabel('聚类簇数 K')
ax.set_ylabel('Silhouette', color='')
ax.tick_params(axis='y', labelcolor='')
ax.grid(alpha=0.25)
ax2 = ax.twinx()
ax2.plot(Ks, bics, color='', marker='s', linewidth=2.0, label='GMM BIC(越小越好)')
best_k_bic = Ks[int(np.argmin(bics))]
ax2.axvline(best_k_bic, color='', linestyle='--', alpha=0.6)
ax2.set_ylabel('BIC', color='')
ax2.tick_params(axis='y', labelcolor='')
lines1, labels1 = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax2.legend(lines1 + lines2, labels1 + labels2, loc='best', fontsize=9)
ax.set_title(f'子图4|无监督模型选择:Sil最佳K={best_k_sil},BIC最佳K={best_k_bic}', fontsize=12)
plt.show()
# 打印关键数值指标
print("=== 监督学习(SVM) ===")
print(f"Test Accuracy: {acc:.4f}")
print("Confusion Matrix:")
print(cm)
print("\n=== 无监督学习(KMeans) ===")
print(f"Adjusted Rand Index (w.r.t. true labels): {ari_km:.4f}")
print(f"Silhouette Score: {sil_km:.4f}")
print("\n=== 无监督模型选择 ===")
for k, s, b in zip(Ks, sil_scores, bics):
print(f"K={k}: Silhouette={s:.4f}, BIC={b:.2f}")
print(f"Best K by Silhouette: {best_k_sil}, Best K by BIC: {best_k_bic}")

图1,真值标签的 PCA-2D 分布:将高维数据投影到二维直观呈现真实类别的空间分布形态。可以观察到类间分离程度、类内离散程度以及可能的重叠区域。
图2,监督 SVM 决策区域:展示监督方法在 PCA-2D 切片上的分类决策区域(通过 PCA 逆变换将网格映回 5D 后预测)。可视化测试集预测正确与错误点,直观看到分类边界与误差分布。
图3,无监督 KMeans 聚类:展示完全不使用标签的聚类结果及簇中心投影位置,评价采用内部指标 silhouette(类内紧致、类间分离)与外部对齐指标 ARI(和真值的匹配度)。
图4,无监督模型选择:KMeans Silhouette vs GMM BIC,针对簇数 K 做模型选择:KMeans 用 silhouette(越大越好)、GMM 用 BIC(越小越好),并可视化两条曲线与各自推荐的 K。
整体来看,监督 SVM 在测试集上的准确率(Acc)高,说明有标签监督的强大指导作用;误分类多集中在类间边界的混叠区域。
无监督 KMeans 的 silhouette 若较高,说明几何上形成了紧致分组;但 ARI 可能并非很高,意味着“几何上看似合理的簇”不一定与真实语义标签一致。
模型选择曲线显示 silhouette 和 BIC 对最佳 K 的判断可能不同:这体现了不同假设(球形簇 vs 椭球高斯)的偏好差异,也提醒我们无监督评价并非一锤定音,需结合领域目标。
总结
监督学习与无监督学习的核心区别在于目标函数与评估标准的来源:前者来自外部标签定义的明确任务损失,后者来自数据内部结构的隐式约束。
从理论上,监督学习通过 ERM 与正则化逼近贝叶斯最优;无监督学习通过几何或概率的结构假设逼近数据生成过程或内在表示。
从实践上,监督学习适合明确预测目标且标签可得的场景;无监督学习适合探索数据、发现结构、构建表示与先验。
两者并非割裂:自监督/半监督/迁移学习将无监督的表征学习与监督的任务学习结合,已成为工业与学术前沿。
在实际实验中,建议以“任务-指标-数据-假设”四元组驱动方法选择:如果任务评价是监督指标(如 AUC),尽量用监督/半监督;若任务是探索与压缩表示,优先无监督。模型选择需结合内部指标、稳定性、可解释性与下游任务表现综合评估。
最后

