1. 朴素贝叶斯算法总结

1.1 模型

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y

设输入空间 XRnn 维向量的集合,输出空间为类标记集合 Y={c1,c2,,cK}X 是定义在输入空间 X 上的随机向量,Y 是定义在输出空间 Y 上的随机变量。P(X,Y)XY 的联合概率分布。训练数据集

T={(x1,y1),(x2,y2),,(xN,yN)}

P(X,Y) 独立同分布产生。

朴素贝叶斯法通过训练数据集学习联合概率分布 P(X,Y)。具体地,学习以下先验概率分布及条件概率分布。

  • 先验概率分布

P(Y=ck),k=1,2,,K

  • 条件概率分布

P(X=x|Y=ck)=P(X(1)=x(1),,X(n)=x(n)|Y=ck),k=1,2,,K

于是学习到联合概率分布 P(X,Y)

条件独立性假设是

P(X=x|Y=ck)=j=1nP(X(j)=x(j)|Y=ck)

这意味着在分类的类别确定的条件下,用于分类的特征之间是条件独立的。

对于给定的输入 x,通过学习到的模型计算后验概率分布 P(Y=ck|X=x),将后验概率最大的类作为 x 的类输出。后验概率计算根据贝叶斯定理进行:

P(Y=ck|X=x)=P(X=x|Y=ck)P(Y=ck)k=1KP(X=x|Y=ck)P(Y=ck)

将条件独立性假设代入上式有

P(Y=ck|X=x)=P(Y=ck)j=1nP(X(j)=x(j)|Y=ck)k=1KP(Y=ck)j=1nP(X(j)=x(j)|Y=ck),k=1,2,,K

于是,朴素贝叶斯分类器可表示为

y=f(x)=argmaxckP(Y=ck)j=1nP(X(j)=x(j)|Y=ck)k=1KP(Y=ck)j=1nP(X(j)=x(j)|Y=ck)

由于上式分母对所有 ck 都是相同的,所以

y=argmaxckP(Y=ck)j=1nP(X(j)=x(j)|Y=ck)

1.2 策略

朴素贝叶斯法将实例分到后验概率最大的类中,这等价于期望风险最小化。假设选择 0 - 1 损失函数:

L(Y,f(X))={1,Yf(X)0,Y=f(X)

式中 f(X) 是分类决策函数。这时,期望风险函数为

Rexp(f)=E[L(Y,f(X))]

期望是对联合分布 P(X,Y) 取的。由此取条件期望

Rexp(f)=EXk=1K[L(ck,f(X))]P(ck|X)

为了使期望风险最小化,只需对 X=x 逐个极小化,由此得到:

f(x)=argminyYk=1KL(ck,y)P(ck|X=x)=argmaxckP(ck|X=x)

这样一来,根据期望风险最小化准则就得到了后验概率最大化准则:

f(x)=argmaxckP(Y=ck|X=x)

即朴素贝叶斯法所采用的策略。

1.3 方法

  • 极大似然估计
    • 先验概率 P(Y=ck) 的极大似然估计是

P(Y=ck)=i=1NI(yi=ck)N,k=1,2,,K

其中 I 是指示函数,N 是样本容量。
- 设第 j 个特征 x(j) 可能取值的集合为 {aj1,aj2,,ajSj},条件概率 P(X(j)=ajl|Y=ck) 的极大似然估计是

P(X(j)=ajl|Y=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)

其中 j=1,2,,nl=1,2,,Sjk=1,2,,K

  • 贝叶斯估计
    用极大似然估计可能会出现所要估计的概率值为 0 的情况。这时会影响到后验概率的计算结果,使分类产生偏差。解决这一问题的方法是采用贝叶斯估计。具体地,条件概率的贝叶斯估计是

Pλ(X(j)=ajl|Y=ck)=i=1NI(xi(j)=ajl,yi=ck)+λi=1NI(yi=ck)+Sjλ

式中 λ0。当 λ=0 时就是极大似然估计。常取 λ=1,这时称为拉普拉斯平滑(Laplace smoothing)。同样,先验概率的贝叶斯估计是

Pλ(Y=ck)=i=1NI(yi=ck)+λN+Kλ

2. Python代码实现

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

class NaiveBayes:
    def __init__(self, lambda_=1):
        self.lambda_ = lambda_  # 贝叶斯估计的平滑参数
        self.prior_probs = {}
        self.cond_probs = {}

    def fit(self, X, y):
        n_samples, n_features = X.shape
        self.classes = np.unique(y)
        num_classes = len(self.classes)

        # 计算先验概率
        # \[P(Y = c_k) = \frac{\sum_{i = 1}^{N} I(y_i = c_k)}{N}, \quad k = 1, 2, \cdots, K\]
        for c in self.classes:
            self.prior_probs[c] = (np.sum(y == c) + self.lambda_) / (n_samples + num_classes * self.lambda_)

        # 计算条件概率
        # \[P(X^{(j)} = a_{jl}|Y = c_k) 
        #     = \frac{\sum_{i = 1}^{N} I(x_i^{(j)} = a_{jl}, y_i = c_k)}{\sum_{i = 1}^{N} I(y_i = c_k)}\]

        for c in self.classes: # 对c类别
            X_c = X[y == c] 
            self.cond_probs[c] = {}
            for j in range(n_features):
                feature_values = np.unique(X[:, j]) # 第j位置取值集合
                num_feature_values = len(feature_values)
                for value in feature_values:
                    # p(j位置取值value | c类别) ~ j位置取值是value的样本数 ➗ c类别的样本数
                    self.cond_probs[c][(j, value)] = (np.sum(X_c[:, j] == value) + self.lambda_) / (
                            len(X_c) + num_feature_values * self.lambda_)

    def predict(self, X):
        # \[y = \arg \max_{c_k} P(Y = c_k)\prod_{j = 1}^{n} P(X^{(j)} = x^{(j)}|Y = c_k)\]
        y_pred = []
        for x in X:
            posteriors = []
            for c in self.classes:
                prior = self.prior_probs[c]
                conditional = 1
                for j, value in enumerate(x):
                    if (j, value) in self.cond_probs[c]:
                        conditional *= self.cond_probs[c][(j, value)]
                    else:
                        # 如果特征值在训练集中未出现过,可根据贝叶斯估计处理
                        feature_values = np.unique(X[:, j])
                        num_feature_values = len(feature_values)
                        # 获取训练集中对应类别的样本数量
                        X_c = self.X_train[self.y_train == c]
                        conditional *= self.lambda_ / (len(X_c) + num_feature_values * self.lambda_)
                posterior = prior * conditional
                posteriors.append(posterior)
            y_pred.append(self.classes[np.argmax(posteriors)])
        return np.array(y_pred)

    def fit_and_store_train(self, X, y):
        self.X_train = X
        self.y_train = y
        self.fit(X, y)


# 生成随机数据
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, random_state=42)

# 离散化特征
num_bins = 15  # 分箱数量
X_discretized = np.zeros_like(X, dtype=int)
for j in range(X.shape[1]):
    bins = np.linspace(np.min(X[:, j]), np.max(X[:, j]), num_bins + 1)
    X_discretized[:, j] = np.digitize(X[:, j], bins)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_discretized, y, test_size=0.2, random_state=42)

#print first 10 X and y
print(X_train[:10], y_train[:10])
# 创建朴素贝叶斯分类器并训练
nb = NaiveBayes(lambda_=1)
nb.fit_and_store_train(X_train, y_train)

# print(nb.cond_probs, nb.prior_probs)
# 进行预测
y_pred = nb.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"朴素贝叶斯分类器的准确率: {accuracy}")

代码解释

  • __init__ 方法:初始化平滑参数 lambda_,以及存储先验概率和条件概率的字典。
  • fit 方法
    • 计算每个类别的先验概率,使用贝叶斯估计(拉普拉斯平滑)。
    • 计算每个特征在每个类别下取不同值的条件概率,同样使用贝叶斯估计。
  • predict 方法
    • 对于每个测试样本,计算它属于每个类别的后验概率。
    • 选择后验概率最大的类别作为预测结果。
  • 数据生成与评估:使用 make_classification 生成随机分类数据,划分训练集和测试集,训练朴素贝叶斯分类器并计算准确率。
posted @ 2025-03-14 21:12 wlu 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 1. KNN算法和KD - tree总结 1.1 KNN算法 模型 K近邻(K - Nearest Neighbors,KNN)算法是一种基本的分类与回归方法。它的模型实际上是对特征空间的划分,给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最邻近的 K 个实例,然后根据这 阅读全文
posted @ 2025-03-14 19:47 wlu 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 感知器模型数学理论 感知器(Perceptron)是一种二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别(取 +1 和 -1)。 模型定义 给定一个输入向量 x=(x1,x2,,xn)T,感知器模型的输出 y 由以下公式计 阅读全文
posted @ 2025-03-13 23:18 wlu 阅读(4) 评论(0) 推荐(0) 编辑
摘要: 这本书的第一部分塑造了你的思维。我们了解了 AI 是什么和不 是什么,帮助您设定期望。我们没有将 AI 视为取代您工作的机器人,而是 了解到 AI 可以成为一种实用的商业工具。您现在可以使用它来提高生产 力、减少人为错误,甚至增加收入。我们还了解到,AI 并不是解决所有问 题的灵丹妙药。它适用于具有 阅读全文
posted @ 2024-12-26 10:52 wlu 阅读(13) 评论(0) 推荐(0) 编辑
摘要: The success of AI is perceived differently by various groups within organizations. AI experts typically define success as the creation of sophisticate 阅读全文
posted @ 2024-12-26 10:41 wlu 阅读(14) 评论(0) 推荐(0) 编辑
摘要: Chapter 13 Build or Buy Many organizations today start by hiring a team of data scientists to implement AI. Yet, this is not the only way of bringing your AI vision to life, 阅读全文
posted @ 2024-12-26 09:23 wlu 阅读(9) 评论(0) 推荐(0) 编辑
摘要: AI can improve Business Process (customer service & HR) Customer Service Workload Reduction: Employee burnout is a significant issue in customer servi 阅读全文
posted @ 2024-12-25 21:55 wlu 阅读(7) 评论(0) 推荐(0) 编辑
摘要: 成功的5个技巧 对AI的5个误解 阅读全文
posted @ 2024-12-25 21:47 wlu 阅读(7) 评论(0) 推荐(0) 编辑
摘要: Whose Job is AI It’s common for management teams to assume that data scientists inherently know which problems to solve for the company. However, this 阅读全文
posted @ 2024-12-25 21:35 wlu 阅读(9) 评论(0) 推荐(0) 编辑
摘要: B-CIDS AI-Readiness: A company is AI-ready when it can smoothly progress from AI concept to implementation and benefit realization, and do so consiste 阅读全文
posted @ 2024-12-25 15:27 wlu 阅读(8) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示