机器学习-朴素贝叶斯

前言
  • 朴素贝叶斯是一种基于贝叶斯定理的分类算法,属于生成式模型的范畴。它的基本思想是基于贝叶斯定理和特征独立性假设。它假设每个特征之间相互独立,因此名称为“朴素”。

  • 在朴素贝叶斯分类中,我们假设给定数据点属于某个类别,可以通过对该类别中各个特征的条件概率进行乘积计算,以计算该数据点属于该类别的概率。最终,选择概率最大的类别作为该数据点的预测类别。

公式
  1. 贝叶斯定理:贝叶斯定理告诉我们如何计算某个事件发生的概率,即:

P ( A ∣ B ) = P ( B ∣ A ) ∗ P ( A ) / P ( B ) P(A|B) = P(B|A) * P(A) / P(B) P(AB)=P(BA)P(A)/P(B)

​ 其中,P(A|B) 表示事件 A 在事件 B 发生的情况下发生的概率;P(B|A) 表示事件 B 在事件 A 发生的情况下发 生的概率;P(A) 表示事件 A 发生的概率;P(B) 表示事件 B 发生的概率

2.特征独立性假设:朴素贝叶斯假设特征之间是独立的,即:

P ( x 1 , x 2 , . . . , x n ∣ y ) = P ( x 1 ∣ y ) ∗ P ( x 2 ∣ y ) ∗ . . . ∗ P ( x n ∣ y ) P(x1, x2, ..., xn | y) = P(x1 | y) * P(x2 | y) * ... * P(xn | y) P(x1,x2,...,xny)=P(x1∣y)P(x2∣y)...P(xny)

​ 其中,xi 表示第 i 个特征,y 表示分类结果。

  1. 极大似然估计:朴素贝叶斯使用极大似然估计来确定特征与分类结果之间的关系,即:

P ( y ∣ x 1 , x 2 , . . . , x n ) = P ( x 1 , x 2 , . . . , x n ∣ y ) ∗ P ( y ) / P ( x 1 , x 2 , . . . , x n ) P(y | x1, x2, ..., xn) = P(x1, x2, ..., xn | y) * P(y) / P(x1, x2, ..., xn) P(yx1,x2,...,xn)=P(x1,x2,...,xny)P(y)/P(x1,x2,...,xn)

​ 其中,P(y | x1, x2, …, xn) 表示给定特征 x1, x2, …, xn 时分类结果 y 的概率;P(y) 表示分类结果 y 的先验概 率;P(x1, x2, …, xn) 表示特征 x1, x2, …, xn 的先验概率。

实现流程
  1. 数据预处理:对数据进行清洗、格式化等处理,确保数据的可用性和有效性。
  2. 特征抽取:从原始数据中抽取出有效的特征,用于后续的模型训练。
  3. 计算先验概率:计算出每一个分类结果的先验概率,即该分类结果在样本中出现的频率。
  4. 计算条件概率:对于每一个特征,计算出该特征在各个分类结果中出现的条件概率。
  5. 计算后验概率:使用贝叶斯定理计算出后验概率,即在已知特征的情况下,每一个分类结果的概率。
  6. 预测分类结果:选取后验概率最大的分类结果作为最终的预测结果。
代码
import numpy as np
from collections import Counter

class NaiveBayes:
    def __init__(self):
        # 定义类的属性,初始化为None
        self.X = None
        self.y = None
        self.classes = None
        self.priors = None
        self.cond_probs = None

    def fit(self, X, y):
        # 存储训练数据
        self.X = X
        self.y = y
        # 获取分类类别
        self.classes = np.unique(y)
        # 计算先验概率
        self.priors = self._compute_priors()
        # 计算条件概率
        self.cond_probs = self._compute_cond_probs()

    def _compute_priors(self):
        # 统计每个类别的样本数量
        classes_counts = Counter(self.y)
        # 计算总样本数量
        total_count = len(self.y)
        # 计算每个类别的先验概率
        priors = {c: count / total_count for c, count in classes_counts.items()}
        return priors

    def _compute_cond_probs(self):
        # 计算特征数量
        n_features = self.X.shape[1]
        cond_probs = {}
        # 计算每个类别的条件概率
        for c in self.classes:
            # 获取每个类别的样本
            X_c = self.X[self.y == c]
            # 计算每个特征的均值和标准差
            means = np.mean(X_c, axis=0)
            stds = np.std(X_c, axis=0)
            # 将均值和标准差存储在字典中
            cond_probs[c] = (means, stds)
        return cond_probs

    def predict(self, X):
        y_pred = []
        # 遍历所有的预测样本
        for x in X:
            scores = []
            # 遍历所有的类别
            for c, (mean, std) in self.cond_probs.items():
				# 计算每个特征在该类别下的概率密度值
				prob = np.exp(-0.5 * ((x - mean) / std) ** 2) / (np.sqrt(2 * np.pi) * std)
				# 计算概率密度值的乘积
				prob = np.prod(prob)
				# 乘上该类别的先验概率
				prob *= self.priors[c]
				scores.append(prob)
			# 预测该样本的类别
			y_pred.append(self.classes[np.argmax(scores)])
		return np.array(y_pred)

  • fit函数:用于训练模型,接收训练数据X和目标值y,存储数据到对应属性中,计算先验概率和条件概率并存储到对应属性中。
  • _compute_priors函数:用于计算先验概率。
  • _compute_cond_probs函数:用于计算条件概率。
  • predict函数:用于预测目标值,接收预测数据X,计算每个样本在每个类别下的概率,预测该样本的类别并返回预测结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值