判别模型(Discriminative model)和生成模型(Generative model)

本文探讨了判别模型(如SVM、逻辑回归)与生成模型(如高斯生成模型、朴素贝叶斯)的区别。判别模型直接学习决策边界,而生成模型则学习数据的生成过程。通过高斯生成模型与逻辑回归的关系以及朴素贝叶斯的案例,阐述了两种模型的工作原理和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面的章节中,我们介绍过SVM、逻辑回归,这两者都属于监督学习中的一种,即训练数据的标签是给定的,我们希望通过对训练数据进行学习,这样对于给定的新样本数据,我们可以对它的类别标签进行预测。实际上,监督学习又可以分为两类,判别模型(Discriminative model)和生成模型(generative model),前面提到的SVM和逻辑回归都属于判别模型的一种。那么判别模型和生成模型有何区别?

1.1 判别模型和生成模型的区别
我们先来看以前讲过的SVM和逻辑回归(LR)有什么特点。这两者都是对分布概率 p(y|x;θ) 进行进行学习的,这个概率表示给定一个新样本数据特征 x ,模型参数 θ 可以通过训练数据学习而来,我们期望对数据 x 的类别标签的概率分布 p(y|x;θ) 进行预测。比如,在逻辑回归中,我们对数据类别的概率分布的预测是通过模型 p(y|x;θ)=g(θTx) 进行判定的,其中 g 表示sigmod函数。这种类型的预测模型称为判别模型,它是在有限训练样本已知的条件下学习判别函数,并不会考虑样本数据产生的模型是什么样,而直接预测模型的输出。典型的判别模型包括k近邻,感知机,决策树,SVM,逻辑回归等。

考虑这样一个例子,假设给定动物的若干个特征属性,我们希望通过这些特征学习给定的一个“个体”到底是属于“大象”(y=1)还是“狗”(y=0)。如果采用判别模型的思路,如逻辑回归,我们会根据训练样本数据学习类别分界面,然后对于给定的新样本数据,我们会判断数据落在分界面的哪一侧从而来判断数据究竟是属于“大象”还是属于“狗”。在这个过程中,我们并不会关心,究竟“大象”这个群体有什么特征,“狗”这个群体究竟有什么特征。
现在我们来换一种思路,我们首先观察“大象”群体,我们可以根据“大象”群体特征建立模型,然后再观察“狗”群体特征,然后再建立“狗”的模型。当给定新的未知个体时,我们将该个体分别于“大象”群体和“狗”群体模型进行比较,看这个个体更符合哪个群体模型的特征。

所以分析上面可知,判别模型是直接学习 p(y|x) ,或者直接从特征空间学习类别标签;生成模型是对类别模型进行学习,即学习 p(x|y) (每一类别数据的特征模型)和 p(y) (别类概率)。如在上面的例子中,对于“大象”群体,特征分布可以表示为 p(x|y=1) ,对“狗”群体建立特征模型 p(x|y=0) 。假设类别概率分布 p(y) 是已知的,那么我们可以通过贝叶斯公式,对给定数据特征 x 的类别后验概率推导为,

p(y|x)=p(x|y)p(y)p(x)

其中, p(x)=p(x|y=1)p(y=1)+p(x|y=0)p(y=0) (每一类的类别概率乘以该类别内的特征分布概率就是总的特征分布概率),所以 p(x) 也可以表达为模型 p(x|y) 和类别概率 p(y) 了。在进行类别判定时,我们会分别计算数据 x 属于各个别类的概率大小,并将 x 的标签赋予为概率更大的类别,也就是,

argmaxyp(y|x)=argmaxyp(x|y)p(y)p(x)=argmaxyp(x|y)p(y)

最后一个式子是因为对于所有类别的特征概率分布都是一样的,所以可以不考虑 p(x) 所以,实际上,生成模型是对联合概率分布 p(x,y)=p(x|y)p(y) 进行学习的。常用的生成模型有朴素贝叶斯,隐马尔可夫等,HMM等。

1.2 高斯生成模型
1.2.1高斯生成模型概念
这里首先列举一个简单的例子,高斯生成模型,也就是说每个类别的数据分布可以由高斯模型进行建模,也就是说有,

yBernoulli(ϕ)

x|y=0N(μ0,Σ)

x
### 使用 Python 绘制判别模型生成模型的图表 为了可视化判别模型生成模型的工作原理及其结果,可以通过 `matplotlib` 或 `seaborn` 库实现绘图。以下分别介绍如何针对这两种模型绘制相应的图表。 --- #### 1. 判别模型的图像绘制 对于判别模型,可以绘制决策边界的图形来直观显示模型是如何划分不同类别的数据点。假设我们有一个二分类问题,使用逻辑回归作为判别模型,则可以用如下代码绘制: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_classification # 创建虚拟数据集 X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1) # 训练逻辑回归模型 clf = LogisticRegression() clf.fit(X, y) # 获取网格范围 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) # 预测网格上的值 Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制决策边界 plt.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.Paired) plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired) plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Discriminative Model Decision Boundary') plt.show() ``` 此代码展示了如何利用二维平面中的数据点对应的类别标签拟合一个逻辑回归模型,并绘制其决策边界[^4]。 --- #### 2. 生成模型的图像绘制 对于生成模型,可以展示生成样本的过程或者生成样本与真实样本之间的对比。这里以 GAN(生成对抗网络)为例,假设有预训练好的生成器模型,我们可以生成一些新样本并与原始数据进行比较。 ```python import numpy as np import matplotlib.pyplot as plt from keras.models import load_model # 加载生成器模型 (假设已保存为 H5 文件) generator = load_model('wgan_generator.h5') # 定义噪声向量 noise_dim = 100 num_examples_to_generate = 16 seed = np.random.normal(0, 1, (num_examples_to_generate, noise_dim)) # 生成样本 generated_images = generator.predict(seed) # 展示生成的图片 fig, axes = plt.subplots(4, 4, figsize=(6, 6)) axes = axes.flatten() for i, ax in enumerate(axes): img = generated_images[i].reshape((28, 28)) # 假设是 MNIST 数据集 ax.imshow(img, cmap='gray') ax.axis('off') plt.tight_layout() plt.suptitle('Generated Samples from Generative Model', fontsize=16) plt.show() ``` 这段代码演示了如何加载预先训练好的 WGAN 生成器模型,并通过随机噪声输入生成一批新的图像样本[^1]。 --- #### 3. 对比真实数据与生成数据 如果希望进一步分析生成模型的效果,可以将生成的数据与真实的训练数据放在一起作对比。例如,在 MNIST 手写数字数据集中,可以这样操作: ```python from keras.datasets import mnist # 加载真实数据 (train_images, _), (_, _) = mnist.load_data() # 显示部分真实数据 real_images = train_images[:16] fig, axes = plt.subplots(2, 8, figsize=(16, 4)) axes = axes.flatten() for i, ax in enumerate(axes[:len(real_images)]): ax.imshow(real_images[i], cmap='gray') ax.set_title('Real', fontsize=10) ax.axis('off') for i, ax in enumerate(axes[len(real_images):]): ax.imshow(generated_images[i].reshape((28, 28)), cmap='gray') ax.set_title('Generated', fontsize=10) ax.axis('off') plt.tight_layout() plt.suptitle('Comparison of Real and Generated Data', fontsize=16) plt.show() ``` 该脚本会同时呈现真实数据生成数据,便于观察两者的相似程度。 --- ### 总结 以上介绍了如何用 Python 中的 `matplotlib` `seaborn` 库绘制判别模型的决策边界以及生成模型的生成样本。这些可视化的工具可以帮助更好地理解解释模型的行为。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值