朴素贝叶斯分类器Numpy实现【原创代码】

朴素贝叶斯理论推导与三种常见模型 朴素贝叶斯(Naive Bayes)是一种简单的分类算法,它的经典应用案例为人所熟知:文本分类(如垃圾邮件过滤)。很多教材都从这些案例出发,本文就不重复这些内容了,而把重点放在理论推导(其实很浅显,别被“理论”吓到),三种常用模型及其编码实现(Python)。如果你对理论推导过程不感兴趣,可以直接逃到三种常用模型及编码实现部分,但我建议你还是看看理论基础部分。另外,本文的所有代码都可以从我的gith 阅读详情

问题:已知

dayoutlooktemperaturehumiditywindPlaytennis
1sunnyhothighweakno
2sunnyhothighstrongno
3overcasthothighweakyes
4rainmildhighweakyes
5raincoolnormalweakyes
6raincoolnormalstrongno
7overcastcoolnormalstrongyes
8sunnymildhighweakno
9sunnycoolnormalweakyes
10rainmildnormalweakyes
11sunnymildnormalstrongyes
12overcastmildhighstrongyes
13overcasthotnormalweakyes
14rainmildhighstrongno

问当出现:<Outlook=sunny, Temperature=cool, Humidity=high, Wind=strong>

问这一天是否适合于打网球?

数据集:

sunny,hot,high,weak,no
sunny,hot,high,strong,no
overcast,hot,high,weak,yes
rain,mild,high,weak,yes
rain,cool,normal,weak,yes
rain,cool,normal,strong,no
overcast,cool,normal,strong,yes
sunny,mild,high,weak,no
sunny,cool,normal,weak,yes
rain,mild,normal,weak,yes
sunny,mild,normal,strong,yes
overcast,mild,high,strong,yes
overcast,hot,normal,weak,yes
rain,mild,high,strong,no

上面数据保存为 input.txt

代码:

import numpy as np
""" This is JintuZheng's Bayesion Classifier homework.
"""

class Bayesion_Classifier_Builder(object):
    def __init__(self,fields_dict):
        self.fields_dict = fields_dict
        self.class_field_mapping = self.fields_dict[-1]
        self.dataRaw = [] # Raw table
        self.data_np_table = None# = np.array(dataRaw) # change data to numpy table
        self.data_wash_correct_dict = {} # data wash
        self.rows = 0
    
    def class_analysis(self): # Category distribution analysis
        class_set = self.data_np_table[:,-1]
        class_set = set(class_set.tolist())
        class_data = self.data_np_table[:,-1] #class data
        class_rate =[len(np.where(class_data == class_number)[0])/self.rows for class_number in class_set]
        print(class_rate)

    def data_correct(self,know_error:str) -> str:
        return self.data_wash_correct_dict[know_error]

    def load_dataset(self, path:str):
        self.dataRaw.clear() #clear all data Raw
        with open(path,'r',encoding='utf8') as f:
            lines = f.readlines()
            for l in lines:
                if l !='\n':
                    _words = l.replace('\n','').split(',')     
                    try: # Data format's change
                        map_encode_list = [ self.line_encoder(c_idx,wi) for c_idx,wi in enumerate(_words)]
                        self.dataRaw.append(map_encode_list)
                    except Exception as _e: 
                        print(_e)
                        print('--> line data load failed --> {} '.format(_words))
                        pass
        
        self.data_np_table = np.array(self.dataRaw) # change data to numpy table
        self.rows = self.data_np_table.shape[0]

    def line_encoder(self, c_idx: int, wi: str) -> int:
        return self.fields_dict[c_idx][wi]

    def _probability_base(self,class_number:int, index_np_array:np.array) -> float:
        p_denominator = 1 # Denominator
        p_numerator = 1 # Numerator
        fields_sum = index_np_array.shape[0] #Tables' cols -1
        
 
        for index_col in range(fields_sum): # Get the each field single P
            col_data = self.data_np_table[:,index_col]
            p_denominator*=(len(np.where(col_data == index_np_array[index_col])[0])/self.rows)
        
        #print(p_denominator)

        class_data = self.data_np_table[:,fields_sum] #class data
        class_p_denomerator = len(np.where(class_data == class_number)[0])
        p_numerator*=(class_p_denomerator/self.rows) # Get class's P(Class)
        p_class = p_numerator

        for index_col in range(fields_sum):
            col_data = self.data_np_table[:,index_col]   
            sum_both_satisfied = len(np.where(class_data[np.where(col_data == index_np_array[index_col])]==class_number)[0])
            #print('{}/{}'.format(sum_both_satisfied,class_p_denomerator))
            p_numerator*=(sum_both_satisfied/class_p_denomerator)
        class_P = p_numerator/p_denominator

        return class_P
            
    def classifier(self, index_np_array:np.array) -> list:
        if index_np_array.shape[0] != (self.data_np_table.shape[1]-1):
            print('NP Array.Size Error~ size for: {}!={}'.format(index_np_array.shape[0],data_np_table.shape[1]))
            return None  

        fields_sum = index_np_array.shape[0] #Tables' cols -1
        class_set = self.data_np_table[:,fields_sum]
        class_set = set(class_set.tolist())
        return [self._probability_base(class_number,index_np_array) for class_number in class_set]


    def Predict(self, data_describe:str) -> str :
        #print(data_describe)
        try: # Data format's change
            _words = data_describe.replace('\n','').split(',')
            map_encode_list = [ self.line_encoder(c_idx,wi) for c_idx,wi in enumerate(_words)]
        except Exception as _e: 
            print(_e)
            print('Data format wrong --> {}'.format(_words))
            return None
        map_encode_array = np.array(map_encode_list)
        #print(map_encode_list)
        # @ Func Above: Data encode --> str map in class
        class_probabilities = self.classifier(map_encode_array) # calculate all probabilities for all classes
        print(class_probabilities)
        return list(self.class_field_mapping)[class_probabilities.index(max(class_probabilities))]

    def batchPredict(self,path:str) ->list:
        results = []
        with open(path,'r',encoding='utf8') as f:
            lines = f.readlines()
            for l in lines:
                if l !='\n':
                    try:
                        for key,cl in self.class_field_mapping.items():
                            pw = ','+key
                            #print(pw)
                            l = l.replace(pw,'')
                        results.append(self.Predict(l))
                    except Exception as _e: 
                        print(_e)
                        print('--> line data load failed --> {} '.format(l))
                        pass
        return results

# 属性名声明:

outlook_filed = {'sunny':0, 'rain':1, 'overcast':2}
temperature_filed = {'hot':0, 'mild':1, 'cool':2}
humidity_filed = {'high':0,'normal':1}
wind_filed = {'weak':0, 'strong':1 }
Playtennis_filed={'yes':0, 'no':1 }

fileds = [outlook_filed, temperature_filed, humidity_filed, wind_filed, Playtennis_filed]
BS = Bayesion_Classifier_Builder(fileds)
BS.load_dataset('input3.txt')
BS.class_analysis()
print(BS.Predict('sunny,cool,high,strong'))

输出:

在这里插入图片描述

3. 朴素贝叶斯原理以及代码实现 本篇博客主要介绍了朴素贝叶斯算法的原理及实现。朴素贝叶斯是一种常用的分类算法,它的原理是基于贝叶斯定理和条件独立假设。通过学习样本数据中的特征和对应的类别信息,建立概率模型,然后利用贝叶斯定理计算出给定特征的情况下,每个类别的概率,并选择概率最大的类别作为分类结果。在代码实现中,定义了一个Bayes类,包括了均值、方差、高斯概率密度函数、拟合、预测和评估等方法。其中,拟合方法用于训练模型,预测方法用于根据输入的特征预测类别,评估方法用于评估模型的性能。 阅读详情

相关推荐

Naive Bayes(朴素贝叶斯)

朴素贝叶斯的概念介绍以及参数估计

假装有标题 2万+

决策树原理及代码实现

决策树(Decision Tree,又称为判定树)算法是机器学习中常见的一类算法,是一种以树结构(包括二叉树和多叉树)形式表达的预测分析模型。每个决策点实现一个具有离散输出的测试函数,记为分支。决策树由结点和有向边组成。结点有两种类型: 内部结点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。 一、决策树的结构 决策树通常有三个步骤:特征选择、决策树生成、决策树的修建。 特征选择是建立决策树之前十分重要的一步。如果是随机地选择特征,那么所建立决策树的学习效率将会大打折扣。通常我们在选择特

dfly_zx的博客 5413

Python 机器学习:NumPy 实现朴素贝叶斯分类器

本文旨在通过NumPy从头实现朴素贝叶斯分类器,深入解析算法的概率模型、条件独立性假设和参数估计方法。贝叶斯定理与朴素贝叶斯核心假设离散特征与连续特征的概率估计策略拉普拉斯平滑处理零概率问题向量化计算优化算法效率完整的机器学习项目实战流程目标是让读者掌握朴素贝叶斯的本质原理,并具备基于基础库实现高效分类器的能力。核心概念:解析贝叶斯定理、条件独立性假设与分类决策规则算法实现:基于NumPy的向量化代码实现,涵盖离散/连续特征处理数学推导:详细推导先验概率、似然度、后验概率的计算公式。

AI Python 编程之道的博客 923

机器学习之决策树

鄙人对决策树一些浅薄的理解,如有差错还望指出。(含代码和数据集链接)

m0_60307882的博客 1864

一文速学数模-分类模型(四)基于概率的朴素贝叶斯分类器详解--Python实现以及项目实战

前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotl...

master_hunter的博客 2999

Python机器学习实战:朴素贝叶斯分类器的原理与实践

Python机器学习实战:朴素贝叶斯分类器的原理与实践 1. 背景介绍 1.1 问题的由来 在数据分析和机器学习领域,分类任务是常见的应用场景之一。例如,电子邮件过滤器需要识别垃圾邮件和正常邮件、客户反馈的情感分析、医疗诊

AI天才研究院 1047

数据挖掘 贝叶斯算法

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。

lindexi 2130

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1850

决策树算法(ID3)

Day Outlook Temperature Humidity Wind PlayTennis 1 Sunny Hot High Weak No 2 Sunny Hot High Strong N...

weixin_30826761的博客 767

Zipformer实战:5分钟快速搭建语音识别模型(附LibriSpeech测试结果)

本文提供了一份详细的Zipformer语音识别模型实战指南。通过清晰的步骤,指导读者在5分钟内完成从环境配置、LibriSpeech数据集准备到模型训练与测试的全过程。文章重点解析了关键配置参数,并分享了在LibriSpeech测试集上的性能结果,帮助开发者快速评估和应用这一高效的语音识别架构。

weixin_35578748的博客 159

论文阅读笔记---Deep HDR Video from Sequences with Alternating Exposures

Kalantari N K, Ramamoorthi R. Deep HDR Video from Sequences with Alternating Exposures[C]//Computer Graphics Forum. 2019, 38(2): 193-205. 摘要: 在本文中,提出了一种基于学习的方法来,我们使用两个顺序卷积神经网络(CNN)对整个HDR视频重建过程进...

qq_25283239的博客 1446

决策树学习

决策树 **决策树通常有三个步骤:**特征选择、决策树生成、决策树的修建。 https://www.jianshu.com/p/25c8bbd1bfa0 特征选择 我们在选择特征时,会考虑到两种不同的指标,分别为:信息增益和信息增益比。 有关定义: 1.熵(Entropy)是表示随机变量不确定性的度量。(熵越大,随机变量的不确定性就越大。) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存...

qq_35301188的博客 228

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5394

机器学习:贝叶斯分类器(二)——高斯朴素贝叶斯分类器代码实现

一 高斯朴素贝叶斯分类器代码实现 网上搜索不调用sklearn实现的朴素贝叶斯分类器基本很少,即使有也是结合文本分类的多项式或伯努利类型,因此自己写了一遍能直接封装的高斯类型NB分类器,当然与真正的源码相比少了很多属性和方法,有兴趣的可以自己添加。代码如下(有详细注释): class NaiveBayes(): '''高斯朴素贝叶斯分类器''' def __init...

a16111597162163的博客 3063

保姆级教程:在DolphinScheduler 3.x中配置Apache SeaTunnel任务(Flink/Spark双引擎)

本文提供了一份详细的教程,指导如何在DolphinScheduler 3.x中配置Apache SeaTunnel任务,支持Flink和Spark双引擎。从环境准备、脚本选择到配置文件编写和任务调度优化,涵盖了所有关键步骤和常见问题解决方案,帮助用户高效集成SeaTunnel到海豚调度系统中。

weixin_42524945的博客 194

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6592

python代码实现朴素贝叶斯分类器(离散变量)

import pandas as pd import numpy as np def fit(df,lambda_=0): class_name = df.columns.to_list()[-1] feature_names = df.columns.to_list()[:-1] # 类标记计数 N = df.shape[0] class_count...

lvhuike的博客 1042

嵌入式铁头山羊stm32:一文总结

本文是一篇STM32嵌入式开发的综合知识总结,涵盖了STM32基础概念、GPIO、通信协议、外设驱动等核心内容。文章首先介绍了STM32的基本概念和型号含义,然后详细讲解了GPIO的8种工作模式及实验案例。接着重点阐述了USART、I2C、SPI三种通信协议的原理和实现方法,包括硬件连接、编程接口和实验应用。此外还介绍了OLED显示原理、中断系统、定时器、ADC转换等关键技术,每个模块都配有对应的实验案例和代码实现参考。文章内容全面系统,既包含理论知识,又提供实践指导,适合作为STM32开发的快速参考手册。

古泽汉书的博客 2777

numpy 朴素贝叶斯

使用numpy实现最基本的朴素贝叶斯 不多废话,直接上代码 所用数据: X1,X2,Y 1,S,-1 1,M,-1 1,M,1 1,S,1 1,S,-1 2,S,-1 2,M,-1 2,M,1 2,L,1 2,L,1 3,L,1 3,M,1 3,M,1 3,L,1 3,L,-1 import pandas as pd import numpy as np #导入数据方式有很多,这里直接用pandas导入 #导入完成后,查看数据 data.head() X

qq_44525568的博客 522

硬核实战!Python爬虫从0到1完整版:爬取知乎热榜+回答内容(数据去重+Excel一键导出+避坑指南,零基础友好)

✔️ 适用人群:Python爬虫零基础、想练手实战爬虫、需要爬取知乎内容做数据分析、办公/学习素材整理的同学爬取知乎热榜全量数据(排名+标题+热榜链接+热度值) →自动跟进爬取每个热榜问题的回答内容(回答者昵称+赞同数+评论数+回答正文+发布时间) →数据清洗+智能去重→一键导出格式化Excel文件,所有功能一站式完成入门级难度,无复杂反爬破解、无分布式/代理池,纯requests请求+静态解析,新手能看懂、能运行、能修改;爬取速度快,热榜+回答全程仅需几十秒。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1460

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[西瓜书]朴素贝叶斯--numpy + python实现

回到分类的问题上,我们想要通过上面的公式解决具体的分类问题。首先,我们根据一般的分类问题将上面公式中提到的A和B具体化一下,我们指示A为样本,其包含样本所有的特征数据。B为分类的类别。为更好的对对应起来,我们用x代指一个样本数据,c代表一个分类类别。那么就有如下的贝叶斯公式: $$P(c | x) = \frac{P(c) * P(x | c)}{P(x)}$$ 这个公式的左边描述的是,在我们已知一个数据样本的情况下

PJZero 3464

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

朴素贝叶斯 Numpy实现高斯朴素贝叶斯

Numpy实现高斯朴素贝叶斯算法

2201_75381449的博客 328

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

贝叶斯网络分类器 c语言,机器学习:贝叶斯分类器(二)——高斯朴素贝叶斯分类器代码实现(示例代码)...

一 高斯朴素贝叶斯分类器代码实现网上搜索不调用sklearn实现的朴素贝叶斯分类器基本很少,即使有也是结合文本分类的多项式或伯努利类型,因此自己写了一遍能直接封装的高斯类型NB分类器,当然与真正的源码相比少了很多属性和方法,有兴趣的可以自己添加。代码如下(有详细注释):class NaiveBayes():‘‘‘高斯朴素贝叶斯分类器‘‘‘def __init__(self):self._X_tra...

weixin_29018419的博客 652

第九课.朴素贝叶斯分类器

目录朴素贝叶斯算法原理朴素贝叶斯参数估计极大似然估计贝叶斯估计朴素贝叶斯算法流程 朴素贝叶斯算法原理 若P(X)P(X)P(X)表示事件XXX发生的概率;P(Y∣X)P(Y|X)P(Y∣X)表示事件XXX发生的条件下,事件YYY发生的概率(简称条件概率);P(X,Y)P(X,Y)P(X,Y)表示事件XXX和事件YYY同时发生的概率(简称联合概率),则三者有如下的关系: P(X,Y)=P(X)P(Y∣X)=P(Y)P(X∣Y)P(X,Y)=P(X)P(Y|X)=P(Y)P(X|Y)P(X,Y)=P(X)P(Y

白景屹的博客 651

Python手写朴素贝叶斯分类器实现与优化

朴素贝叶斯分类器是机器学习中的经典算法,基于贝叶斯定理与特征条件独立假设,通过概率计算实现高效分类。其核心优势在于计算效率高、实现简单,特别适合文本分类、垃圾邮件过滤等场景。在工程实践中,拉普拉斯平滑解决了零概率问题,对数空间运算确保了数值稳定性。Python凭借NumPy等库成为实现首选,手写代码能深入理解条件概率计算、特征变体选择等关键技术细节。该算法在情感分析等任务中可达85%准确率,结合TF-IDF等特征工程后性能更佳,是快速验证业务假设的理想工具。

weixin_33738578的博客 730
上一篇: 并行与分布式计算复习大纲 华南农业大学
下一篇: 数据挖掘期末复习速成大法 华南农业大学
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值