机器学习计算题——朴素贝叶斯

博客主要展示了机器学习相关的例题,包含例题1、例题2和例题3,体现了人工智能领域中机器学习的实际应用示例。
该文章已生成可运行项目,

例题1

例题2

例题3

本文章已经生成可运行项目
### 朴素贝叶斯算法计算题示例及解答 #### 示例问题 假设有一个数据集,用于判断一封邮件是否为垃圾邮件。数据集中有两个特征:邮件中是否包含“免费”(`X1`)和是否包含“优惠”(`X2`)。目标是预测邮件是否为垃圾邮件(`Y`)。已知以下条件概率: - P(`Y`=垃圾) = 0.7 - P(`Y`=非垃圾) = 0.3 - P(`X1`=是 | `Y`=垃圾) = 0.8 - P(`X1`=否 | `Y`=垃圾) = 0.2 - P(`X1`=是 | `Y`=非垃圾) = 0.1 - P(`X1`=否 | `Y`=非垃圾) = 0.9 - P(`X2`=是 | `Y`=垃圾) = 0.6 - P(`X2`=否 | `Y`=垃圾) = 0.4 - P(`X2`=是 | `Y`=非垃圾) = 0.2 - P(`X2`=否 | `Y`=非垃圾) = 0.8 现在有一封邮件,其中包含“免费”但不包含“优惠”,即 `X1`=是,`X2`=否。请使用朴素贝叶斯算法计算这封邮件是垃圾邮件的概率。 --- #### 解答过程 根据朴素贝叶斯公式[^1]: \[ P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)} \] 其中,`P(X)`可以忽略,因为它是归一化常数。我们只需比较不同类别下的未归一化后验概率即可。 对于 `Y=垃圾`: \[ P(X|Y=\text{垃圾}) = P(X_1=\text{是}|\text{垃圾}) \cdot P(X_2=\text{否}|\text{垃圾}) \] \[ P(X|Y=\text{垃圾}) = 0.8 \cdot 0.4 = 0.32 \] \[ P(Y=\text{垃圾}|X) \propto P(X|Y=\text{垃圾}) \cdot P(Y=\text{垃圾}) \] \[ P(Y=\text{垃圾}|X) \propto 0.32 \cdot 0.7 = 0.224 \] 对于 `Y=非垃圾`: \[ P(X|Y=\text{非垃圾}) = P(X_1=\text{是}|\text{非垃圾}) \cdot P(X_2=\text{否}|\text{非垃圾}) \] \[ P(X|Y=\text{非垃圾}) = 0.1 \cdot 0.8 = 0.08 \] \[ P(Y=\text{非垃圾}|X) \propto P(X|Y=\text{非垃圾}) \cdot P(Y=\text{非垃圾}) \] \[ P(Y=\text{非垃圾}|X) \propto 0.08 \cdot 0.3 = 0.024 \] 计算归一化因子: \[ Z = P(Y=\text{垃圾}|X) + P(Y=\text{非垃圾}|X) = 0.224 + 0.024 = 0.248 \] 最终结果: \[ P(Y=\text{垃圾}|X) = \frac{0.224}{0.248} \approx 0.903 \] \[ P(Y=\text{非垃圾}|X) = \frac{0.024}{0.248} \approx 0.097 \] 因此,这封邮件是垃圾邮件的概率约为 90.3%。 --- #### 注意事项 在实际应用中,如果某些特征值在训练集中从未出现过,则会导致对应的条件概率为 0,从而使得整个后验概率为 0。为了解决这一问题,通常会引入平滑技术,例如拉普拉斯平滑[^3]。 ```python # Python 实现朴素贝叶斯分类器 from collections import defaultdict class NaiveBayes: def __init__(self): self.class_prob = {} self.cond_prob = defaultdict(lambda: defaultdict(float)) def fit(self, X, y): # 计算先验概率 total = len(y) for label in set(y): self.class_prob[label] = sum(1 for yi in y if yi == label) / total # 计算条件概率 for i, xi in enumerate(X): for feature, value in xi.items(): self.cond_prob[feature][(value, y[i])] += 1 # 归一化条件概率 for feature, values in self.cond_prob.items(): for (value, label), count in values.items(): self.cond_prob[feature][(value, label)] /= sum(1 for yi in y if yi == label) def predict(self, X_test): results = [] for xi in X_test: max_prob = -1 best_label = None for label, prior in self.class_prob.items(): prob = prior for feature, value in xi.items(): prob *= self.cond_prob.get(feature, {}).get((value, label), 1e-10) if prob > max_prob: max_prob = prob best_label = label results.append(best_label) return results ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值