【机器学习】8 ——朴素贝叶斯

news2024/11/27 16:45:05

机器学习 8 ——朴素贝叶斯

特征条件独立假设
朴素是指每个特征独立地影响结果,整个假设在实际应用中不成立,主要是思想

输入输出的来拟合概率分布,贝叶斯定理,后验概率最大


文章目录

  • 机器学习 8 ——朴素贝叶斯
  • 前言
    • 贝叶斯定理
    • 先验概率和后验概率
      • 一、先验概率
      • 二、后验概率
      • 例子
    • 算法思想
  • 一、算法
  • 二、参数估计(先验概率、条件概率)
    • 先验概率(类参数)
    • 条件概率
      • 离散
      • 连续——高斯分布估计
  • 代码
    • 模拟
    • 直接调用_准确率非常不准确


前言

贝叶斯定理

该定理描述了在已知条件概率的情况下,如何计算两个事件联合发生的概率。

对于分类问题,我们假设每个数据点X属于类别Ck的概率,可以通过下面的贝叶斯公式来计算:
在这里插入图片描述

先验概率和后验概率

一、先验概率

先验概率是指在考虑任何观测数据之前,对某个事件发生的概率的主观估计或基于以往 经验和知识——历史数据 的概率。

  • 通常是在事件发生之前,对事件可能性的预测或估计。在贝叶斯统计推断中,先验概率分布是在考虑任何相关证据之前,对某一数量或命题的置信程度的概率分布。
  • 主要基于历史数据、专家经验或主观判断
  • 计算后验概率的起点和基础。

例如,在抛硬币的实验中,如果我们在没有进行任何抛硬币的操作之前,根据以往对硬币的认知,认为正面朝上和反面朝上的概率各为 50%,这个 50% 就是先验概率。

二、后验概率

后验概率是得到“结果”的信息后,对原先概率的重新修正。它是基于先验概率和观测数据通过贝叶斯定理计算得到的。

  • 在贝叶斯公式中,后验概率是似然函数与先验概率的乘积,再除以一个标准化常量(即全概率)。
  • 基于先验概率和新观察数据的结合

例如,假设我们进行了一系列抛硬币的实验,观察到在多次抛硬币中正面朝上的次数较多,那么根据这些观测数据,我们可以重新计算正面朝上的概率,这个经过观测数据修正后的概率就是后验概率。

在这里插入图片描述

例子

任务:将电子邮件分为“垃圾邮件”和“非垃圾邮件”两类。

计算先验概率:
在没有考虑邮件内容之前,我们需要知道邮件是垃圾邮件或非垃圾邮件的先验概率。这通常基于训练数据集中各类别的样本比例。
假设训练数据集中有1000封邮件,其中500封是垃圾邮件,500封是非垃圾邮件。那么,一封邮件是垃圾邮件的先验概率 P(y=垃圾邮件) 就是0.5,非垃圾邮件的先验概率 P(y=非垃圾邮件) 也是0.5。

计算条件概率(似然概率):
对于每个特征(在这里是邮件中的每个单词),我们需要计算在给定类别下该特征出现的条件概率。
例如,假设单词“促销”在垃圾邮件中出现的频率很高,在非垃圾邮件中很少出现。我们可以计算 P(x=促销∣y=垃圾邮件) 和 P(x=促销∣y=非垃圾邮件)。
应用贝叶斯定理:
对于新的邮件,我们需要计算它属于每个类别的后验概率。
使用贝叶斯公式:P(y∣x)=P(x∣y)×P(y)/ P(x)

在这里,P(y∣x) 是后验概率(邮件在给定特征下的类别概率),P(x∣y) 是条件概率(在给定类别下特征出现的概率),P(y) 是先验概率,P(x) 是观测到的特征的边缘概率(通常作为常数,因为对所有类别都相同)。

实际上,只需要比较不同类别的后验概率,所以常常可以省略 P(x) 的计算,因为它对所有类别都是一样的。

分类:
选择具有最高后验概率的类别作为邮件的分类结果。

算法思想

通过给定训练集,学习输入输出的联合概率分布P(x,y)

具体学习方法:

  1. 学习先验概率分布: P ( Y = c k ) , c k P(Y=c_{k} ),c_{k} P(Y=ck),ck是实例类别
  2. 学习条件概率分布:
    P ( X = x ∣ Y = c k ) = P ( X 1 = x 1 , X 2 = x 2 , . . . , X n = x n ∣ Y = c k ) P(X=x|Y=c_{k} )=P(X^{1}=x^{1} ,X^{2}=x^{2},...,X^{n}=x^{n}|Y=c_{k}) P(X=xY=ck)=P(X1=x1,X2=x2,...,Xn=xnY=ck)
    n是实例的维数
  3. P ( X , Y ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) P(X,Y)=P(X=x|Y=c_{k} )P(Y=c_{k}) P(X,Y)=P(X=xY=ck)P(Y=ck)

但条件概率的估计很难,特别是当x有多个特征,所以有了独立性假设
P ( X = x ∣ Y = c k ) = P ( X 1 = x 1 ∣ Y = c k ) P ( X 2 = x 2 ∣ Y = c k ) ⋅ ⋅ ⋅ P ( X n = x n ∣ Y = c k ) P(X=x|Y=c_{k} )=P(X^{1}=x^{1}|Y=c_{k}) P(X^{2}=x^{2}|Y=c_{k})\cdot \cdot \cdot P(X^{n}=x^{n}|Y=c_{k}) P(X=xY=ck)=P(X1=x1Y=ck)P(X2=x2Y=ck)P(Xn=xnY=ck)


一、算法

实例的类别是:后验概率最大的类

给定输入x
在这里插入图片描述

二、参数估计(先验概率、条件概率)

先验概率(类参数)

就是频率近似概率
在这里插入图片描述
例如,有 100 个样本,其中属于类别 c 的有 30 个,那么类别c的先验概率就是 30/100 = 0.3。

条件概率

在已知某个特征的情况下,属于某个类别的概率。概率分布估计其实很多算法都要用到,有很多方法,在之后的算法里慢慢学

离散

在这里插入图片描述

例如

对于一个二分类问题,类别为 C1 和 C2,特征x有两个取值 a1 和 a2。
在类别 C1 中,特征 A 取值为 a1 的样本有 20 个,类别 C1 的总样本数量为 50。
那么在类别 C1 下,特征 A 取值为 a1 的条件概率就是 20/50 = 0.4。

连续——高斯分布估计

在这里插入图片描述

在这里插入图片描述


代码

模拟

import numpy as np

# 定义朴素贝叶斯分类器类
class NaiveBayes:
    def __init__(self):
        # 初始化先验概率为 None
        self.priors = None
        # 初始化似然概率为 None
        self.likelihoods = 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)
        for c in self.classes:
            # 计算属于每个类别的样本数量占总样本数量的比例,作为先验概率
            self.priors[c] = np.sum(y == c) / n_samples

        # 计算似然概率
        self.likelihoods = np.zeros((n_classes, n_features))
        for c in self.classes:
            X_c = X[y == c]
            for feature_idx in range(n_features):
                # 计算每个特征在每个类别下的均值,作为似然概率
                self.likelihoods[c, feature_idx] = np.mean(X_c[:, feature_idx])

    def predict(self, X):
        n_samples = X.shape[0]
        # 存储每个样本在不同类别下的后验概率
        posteriors = np.zeros((n_samples, len(self.classes)))

        for i, sample in enumerate(X):
            for c in self.classes:
                prior = self.priors[c]
                likelihood = np.prod(self.likelihoods[c]**sample * (1 - self.likelihoods[c])**(1 - sample))
                # 计算后验概率,即先验概率乘以似然概率
                posteriors[i, c] = prior * likelihood

        # 返回后验概率最大的类别作为预测结果
        return np.argmax(posteriors, axis=1)

    def accuracy(self, X, y):
        y_pred = self.predict(X)
        # 计算预测正确的样本数量占总样本数量的比例,作为准确率
        return np.sum(y_pred == y) / len(y)

# 示例数据集
X = np.array([[1, 0], [0, 1], [1, 1], [0, 0]])
y = np.array([0, 1, 0, 1])

# 创建朴素贝叶斯分类器对象并训练
nb = NaiveBayes()
nb.fit(X, y)

# 输入实例进行预测
instance = np.array([1, 1])
predicted_class = nb.predict(np.array([instance]))
print(f"输入实例 {instance} 被预测为类别 {predicted_class[0]}")

# 计算准确率
accuracy = nb.accuracy(X, y)
print(f"估计的准确率为 {accuracy}")

直接调用_准确率非常不准确

CountVectorizer:将文本数据转换为词频矩阵,生成模型可以学习的特征。
MultinomialNB:多项式朴素贝叶斯模型,适用于离散特征的分类任务,如文本分类。
train_test_split:将数据集分成训练集和测试集,70%的数据用于训练,30%的数据用于测试。

# 导入所需库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建朴素贝叶斯分类器
gnb = GaussianNB()

# 训练模型
gnb.fit(X_train, y_train)

# 预测测试集结果
y_pred = gnb.predict(X_test)

# 评估准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Estimated accuracy: {accuracy:.2f}')

# 预测新实例的类别
def predict_new_instance(instance):
    prediction = gnb.predict([instance])
    return prediction, iris.target_names[prediction[0]]

# 新实例
new_instance = [4.5, 3.0, 1.5, 0.3]

# 预测并输出类别
predicted_category, category_name = predict_new_instance(new_instance)
print(f'The predicted category of the new instance is: {category_name}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2使用ag-grid表格

ag-grid官网:Vue Grid: Custom Components | AG Grid 根据官方文档说的AG Grid no longer supports Vue 2. The last version to support Vue 2 is AG Grid v31.3.,目前只有v31.3.版本支持vue2。 以下是官方给的demo Vue Grid: Get Started with AG G…

C# WPF编程-串口通信

C# WPF编程-串口通信 串口通信1. NuGet安装System.IO.Ports2. 界面布局XAML3. C#代码4. 运行效果源码下载 串口通信 1. NuGet安装System.IO.Ports 2. 界面布局XAML <Window x:Class"BlocksTools.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006…

Python 从入门到实战15(字符串其它操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串一些操作说明。今天继续讨论字符…

Java数组08:ArrayList简介

本节内容视频链接&#xff1a; Java关于ArrayList的简单用法与介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1CC4y177CW/?spm_id_from333.337.search-card.all.click&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5Java的ArrayList简介_哔哩哔哩_bilibilihttps:…

Leetcode面试经典150题-27.移除元素

解法都在代码里&#xff0c;不懂就留言或者私信 超级简单的题&#xff0c;一般出现在笔试里&#xff0c;但是不知道为啥字节高频题里会排的那么靠前 class Solution {public int removeElement(int[] nums, int val) {/**如果数组为空&#xff0c;没什么可操作的&#xff0c;…

产业园服务体系建设,是否已全面覆盖企业成长的每一个阶段?

在当今竞争激烈的商业环境中&#xff0c;产业园作为企业发展的重要载体&#xff0c;其服务体系的完善程度至关重要。那么&#xff0c;产业园服务体系建设&#xff0c;是否已全面覆盖企业成长的每一个阶段呢&#xff1f; 从企业的初创期来看&#xff0c;产业园可以提供办公场地的…

【JUC】15-ThreadLocal线程局部变量

1. ThreadLocal ThreadLocal提供线程局部变量。每个线程在访问ThreadLocal实例的时候都有自己的、独立的变量副本。ThreadLocal实例通常是类中的私有静态字段&#xff0c;使用它的目的是希望将状态(用户ID或事务ID)与线程关联起来。 class Saler {ThreadLocal<Integer> …

基于Boost库的搜索引擎开发实践

目录 1.项目相关背景2.宏观原理3.相关技术栈和环境4.正排、倒排索引原理5.去标签和数据清洗模块parser5.1.认识标签5.2.准备数据源5.3.编写数据清洗代码parser5.3.1.编写读取文件Readfile5.3.2.编写分析文件Anafile5.3.2.编写保存清洗后数据SaveHtml5.3.2.测试parser 6.编写索引…

HPM6E00:PWM V2使用指南

先楫推出的HPM6E00系列芯片&#xff0c;PWM功能升级到了V2版本。和V1版本不同的是&#xff0c;V2版本的每组PWM模块包含4个独立的PWM生成模块&#xff0c;每个PWM生成模块包含一个counter和4个比较器&#xff0c;可以生成4组频率不同的PWM波。每个PWM生成模块&#xff0c;对应生…

​​​​通过给定一个全屏的位置得到该位置处是哪一个控件、 遍历窗口中的每一个元素

通过给定一个全屏的位置得到该位置处是哪一个控件&#xff08;以下方法&#xff09; [static] QWidget *QApplication::widgetAt(const QPoint &point) 场景&#xff1a;通过位置获取该位置处的widget后&#xff0c;然后进行判断&#xff0c;是不是某个或某些控件&#x…

韩语中的多义词 (치다)柯桥学韩语到蓝天广场附近

치다 1. 表示用毛笔、铅笔等点点、划线或者绘图。 예: 밑줄을 치다. 划底线 중요한 부분에 동그라미를 쳤다. 在重要的部分画上圆圈。 2. 表示倾倒少量液体或者粉末之类的东西。 예: 싱거우니 소금을 쳐야겠다. 味道淡&#xff0c;得再撒点盐。 기계에 기름을 치다. 给机…

小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)

小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab) 目录 小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现LightGBMBO-Transformer-L…

陈坤2024行走的力量 走向山野感受距离自然更近的地方

近日&#xff0c;由陈坤发起的心灵建设类项目“行走的力量”在西藏林芝圆满完成&#xff0c;今年陈坤和行者们重返西藏&#xff0c;在海拔3500-4700的高原行走了6天5夜&#xff0c;从城市走向山间&#xff0c;感受自然里的生活&#xff0c;用行走的方式&#xff0c;让自己慢下来…

【C++ Primer Plus习题】15.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "sales.h"…

第二期: 第三节 裸机代码如何烧写

这个 过程其实 需要在 编写了 驱动之后&#xff0c; 再进行。 因为 要烧写 代码&#xff0c; 你必须 要有一份&#xff0c; 可以烧写的代码。 这里比较重要的是 secureCRT 的安装流程。 这里忘记怎么安装的了。 大致就是 &#xff0c; 先安装 secureCRT , 然后 在破解。不破…

博弈论专题一(NIM游戏)

Nim游戏 重点结论&#xff1a;对于一个Nim游戏的局面(a1,a2,...,an)&#xff0c;它是P-position当且仅当a1^a2^...^an0&#xff0c;其中^表示位异或(xor)运算。 (本篇只做简单的结论描述,详细证明过程请看这篇博客) Nim和 堆物品&#xff0c;每堆 ai 个&#xff0c;两个玩家…

Linux系统:chown命令

1、命令详解&#xff1a; chown命令用于设置文件所有者和文件关联组的命令&#xff0c;全称为change directory。在Linux当中默认文件均有拥有者&#xff0c;可以利用 chown 将指定文件的拥有者改为指定的用户或组&#xff0c;输入参数时用户可以是用户名或者用户 ID&#xff0…

零基础如何学会Appium自动化测试?

前言 appium是一款移动自动化测试工具&#xff0c;经常被用于实现UI自动化测试&#xff0c;其可支持安卓和IOS两大平台&#xff0c;还支持多种编程&#xff0c;因而得到了广泛的应用。此处便是立足于安卓平台&#xff0c;借助appium工具&#xff0c;使用python语言实现简单的自…

GUI编程09:鼠标监听事件、模拟画图工具

视频链接&#xff1a;11、鼠标监听事件、模拟画图工具_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p11&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 模拟画图工具的实现逻辑图&#xff1a; 实现代码&#xff1a; package com.yundait.lesson03;impo…

大模型分离架构学习记录

GPU Direct GPU 网络的情况已经发生了很大变化。每个 GPU 都有自己的内部互联&#xff0c;例如 NVIDIA 的 A100 或 H800&#xff0c;它们内部的 NVLink 互联可以达到 600GB 甚至 900GB。这种内部互联与外部以太网网络集群设计之间存在耦合关系。GPU 是单机多网卡的&#xff0c…