生成模型(generative model)和判别模型(discriminative model)

本文详细介绍了生成模型和判别模型的概念,以分类问题为例进行说明。生成模型通过学习每个类别的条件概率和先验概率,再利用贝叶斯定理进行决策。而判别模型直接学习后验概率,简化了推理过程。判别函数则不涉及概率,直接学习输入到类别的映射。生成模型能反映数据特性,但计算复杂;判别模型计算简单,仅关注分类边界。

在看论文和机器学习教材的时候,经常会看到生成模型和判别模型,一致对着两个模型概念很模糊,在这里自己做一个小结。

 

在后面介绍这个两个模型时,我们以分类问题为例,以加深理解。我们都知道,分类问题可以分为两个阶段:推理阶段(inference stage)和决策阶段(decision stage)。

推理阶段:利用训练数据学习得到一个可以计算 的模型。

决策阶段:利用在推理阶段得到的后验概率预测数据的类别。

 

当然不是所有的分类模型都分为这两个阶段,比如判别函数(discriminative function),它会把两个阶段何在一起,直接学习从输入数据x到类别的映射。

1.  例子

我们先来看一个例子,从宏观上了解生成模型和判别模型的区别。

我们的任务是判断一个动物是大象(y=1)还是小狗(y=0)。判别模型是先从训练数据中学习得到判别大象和小狗的决策面(decision boundary),有了这个决策面之后,如果需要分类一个新动物是大象还是小狗,只需要判断它在决策面的哪一边。

另一种方法是生成模型,我们首先观察大象,根据其特征学习一个大象的模型,同样的我们学习得到一个小狗的模型。当我们判别一个新动物时,分别和大象模型和小狗模型比较,哪个动物更像就认为新动物为那个类。

2.   生成模型 

生成模型中,我们首先需要得到每一个类的条件概率(class-conditional density) ,以及先验概率(prior class probability) ,然后通过贝叶斯定理得到

我们都知道,贝叶斯定理中的分母可以表示成 ,这在每个类别的后验概率中都是一样的,所以我们可以之间计算联合分布,在通过normalize得到后验概率。到目前为止,我们已经得到了后验概率,有了它我们就可是决策理论来决定输入的x属于那个类。比如,输入x,我们计算x关于每一类的后验概率,哪个后验概率最大,就把x归为那个类。


3.  判别模型

判别模型直接学习后验概率 ,然后利用决策理论判断输入数据属于哪个类,逻辑回归(logistic regression)和感知机(perceptron algorithm)就是典型的判别模型。


4.  判别函数

判别函数和判别模型在名字上非常的像,但存在一定的区别,生成模型和判别模型都是从概率的角度进行预测,而判别函数不涉及概率,而是从训练数据中直接学习得到输入数据x到类别的映射,而且把推理阶段和决策阶段合在一起进行。

现在举一个二分类问题的例子,f(.)是一个二值函数,当f=0时表示类别1,f=1时表示类别2,这个函数f就是判别函数,它可以把输入数据映射到0和1两个类。

5.   总结 

生成模型的要求比较高,需要学习得到输入数据x和类别的联合分布。在实际的应用中,x的维度往往非常的高,只有在非常大的训练数据下我们才能得到比较合理的类条件分布(class-conditional distribution)。庆幸地是,先验概率 比较容易计算,只需计算训练样本中每一类数据占整个训练数据的百分比。虽然生成模型的计算比较复杂,需要学习每一个类的分布,但就可以反映同一类数据本身的一些特点。

如果仅仅是处理分类问题,已知 ,就可以很好的解决这个问题,生成模型需要计算类条件概率和先验概率,这就增加的计算量。相反,判别模型就是直接去求解 ,学习不同类别之间的最优分类面,反映不同类数据之间的差异。但这类模型不能反映数据本身的特点,只能告诉你该数据属于哪个类,而不能反映整个场景的情况。

最简单的判别函数只是学到从输入空间到类别空间的一个映射,不涉及任何的概率,因此该方法不能量化该数据属于某个类的可能性。此外,该方法把推理阶段和决策阶段的任务合在一起进行,但在实际过程中我们需要更加不同的应用选择不同的决策方法。


6. 参考

Bishop《PRML》

Andrew Ng,  handout of《machine learning》


### 使用 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、付费专栏及课程。

余额充值