朴素贝叶斯改进方案简述

目前朴素贝叶斯的改进主要有以下四个方面:

一.结构扩展(主要方向为探索属性间的关联关系)

    朴素贝叶斯的星型结构:

    如图1.1所示,我们有类别C,有A,B,C三个属性能决定C的类别,并且ABC都互相独立:

    

                                                            图1.1 星型结构

    树型结构:

    Friedman在1997年提出的TAN算法,将原算法的星型结构演变成更高的树型依赖结构。目的是解决属性变量之间存在的依赖关系。2004年石洪波提出的利用条件互信息选择若干TAN进行组合,提高TAN算法。树形结构如下图1.2。

    

                            &nbs

朴素贝叶斯(Naive Bayes)是基于概率论的分类算法,属于生成式模型,经典应用案例包括文本分类、垃圾邮件过滤等[^2]。其计算过程主要依赖贝叶斯公式,以下简述: 1. **确定特征和类别**:明确数据集中的特征变量(如文本中的单词、西瓜的属性等)和要分类的类别。例如在文本分类中,特征是各个单词,类别可以是“正常邮件”和“垃圾邮件”。 2. **计算先验概率**:先验概率是指在没有考虑任何特征信息时,每个类别出现的概率。假设类别集合为 \(C = \{c_1, c_2, \cdots, c_m\}\),样本总数为 \(N\),类别 \(c_i\) 出现的样本数为 \(N_{c_i}\),则类别 \(c_i\) 的先验概率 \(P(c_i) = \frac{N_{c_i}}{N}\)。 3. **计算条件概率**:条件概率是指在给定某个类别 \(c_i\) 的条件下,每个特征出现的概率。假设特征集合为 \(X = \{x_1, x_2, \cdots, x_n\}\),在类别 \(c_i\) 中特征 \(x_j\) 出现的样本数为 \(N_{x_j|c_i}\),类别 \(c_i\) 的样本数为 \(N_{c_i}\),则在类别 \(c_i\) 下特征 \(x_j\) 的条件概率 \(P(x_j|c_i) = \frac{N_{x_j|c_i}}{N_{c_i}}\)。这里朴素贝叶斯算法有“特征条件独立假设”,即各个特征之间相互独立,所以在类别 \(c_i\) 下所有特征的联合条件概率 \(P(X|c_i) = P(x_1|c_i)P(x_2|c_i)\cdots P(x_n|c_i)\)。 4. **计算后验概率**:根据贝叶斯公式 \(P(c_i|X) = \frac{P(X|c_i)P(c_i)}{P(X)}\) 计算在给定特征 \(X\) 的条件下,每个类别 \(c_i\) 出现的后验概率。其中 \(P(X)\) 是特征 \(X\) 出现的概率,对于所有类别来说 \(P(X)\) 是相同的,在分类时可以不考虑其具体值,只比较 \(P(X|c_i)P(c_i)\) 的大小即可。 5. **进行分类决策**:选择后验概率最大的类别作为样本的分类结果,即 \( \hat{c} = \arg\max_{c_i} P(c_i|X) = \arg\max_{c_i} P(X|c_i)P(c_i) \)。 ### 代码示例 ```python import numpy as np class NaiveBayes: def __init__(self): self.classes = None self.priors = None self.conditional_probs = None def fit(self, X, y): n_samples, n_features = X.shape self.classes = np.unique(y) n_classes = len(self.classes) self.priors = np.zeros(n_classes) self.conditional_probs = [] for i, c in enumerate(self.classes): X_c = X[y == c] self.priors[i] = X_c.shape[0] / float(n_samples) conditional_prob = (np.sum(X_c, axis=0) + 1) / (X_c.shape[0] + n_features) self.conditional_probs.append(conditional_prob) def predict(self, X): posteriors = [] for x in X: posterior = [] for i, c in enumerate(self.classes): prior = np.log(self.priors[i]) conditional_prob = np.sum(np.log(self.conditional_probs[i]) * x) posterior.append(prior + conditional_prob) posteriors.append(self.classes[np.argmax(posterior)]) return np.array(posteriors) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值