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

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

 

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

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

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

 

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

1.  例子

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

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

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

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
生成实现generative model的代码用于二分类有很多种方法,以下是其中一种基于朴素贝叶斯的实现方式: 1. 数据预处理:将原始数据集分成训练集和测试集,对训练集的特征进行标准化处理,使其均值为0,方差为1。 2. 训练模型:基于朴素贝叶斯的方法,需要计算出两个类别P(c=0)和P(c=1)的先验概率,以及每个特征在两个类别下的条件概率P(x|c),其中x表示某个特征的取值。具体计算方法如下: - P(c=0) = count(c=0) / count(all_data) - P(c=1) = count(c=1) / count(all_data) - 对于每个特征i,计算其条件概率P(xi|c),分别在类别c=0和c=1下计算: - 计算c=0情况下的条件概率:P(xi|c=0) = count(xi,c=0) / count(c=0) - 计算c=1情况下的条件概率:P(xi|c=1) = count(xi,c=1) / count(c=1) 3. 预测测试集:将测试集中的每个实例的特征值代入朴素贝叶斯公式计算,得到属于两个类别的概率值,比较两个概率值,将实例分到概率值较大的那个类别中。 4. 计算准确率:将预测结果与测试集中的真实类别进行比较,计算分类准确率。 以下是Python代码实现: ```python import numpy as np class NaiveBayes: def __init__(self): self.prior = None self.cond_prob = None def fit(self, X, y): n_samples, n_features = X.shape self.classes = np.unique(y) n_classes = len(self.classes) # 计算先验概率 P(c) self.prior = np.zeros(n_classes) for i, c in enumerate(self.classes): self.prior[i] = np.sum(y == c) / n_samples # 计算条件概率 P(x|c) self.cond_prob = np.zeros((n_features, n_classes)) for i in range(n_features): for j, c in enumerate(self.classes): # 对于每个特征 i,计算其条件概率 P(xi|c) Xi = X[y == c, i] self.cond_prob[i, j] = (np.mean(Xi), np.std(Xi)) def predict(self, X): n_samples, n_features = X.shape y_pred = np.zeros(n_samples) # 预测每个实例的类别 for i in range(n_samples): posteriors = [] for j, c in enumerate(self.classes): prior = np.log(self.prior[j]) cond_prob = np.sum(np.log(self.gaussian_prob(X[i], self.cond_prob[:, j]))) posterior = prior + cond_prob posteriors.append(posterior) y_pred[i] = self.classes[np.argmax(posteriors)] return y_pred def gaussian_prob(self, x, params): mean, std = params exponent = np.exp(-((x - mean) ** 2) / (2 * std ** 2)) return (1 / (np.sqrt(2 * np.pi) * std)) * exponent ``` 其中,fit方法用于训练模型,predict方法用于预测测试集,gaussian_prob方法用于计算高斯分布的概率密度函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值