高斯朴素贝叶斯分类器是针对特征值连续的情况下给出的一种分类方法。

贝叶斯公式
所有的贝叶斯分类器的基石都是概率论中的贝叶斯公式,给定训练数据集 D = { x i , C i } , i = 1 , . . . , N , x i ∈ R D , C i ∈ 1 , . . . , K D=\{x_i,C_i\},i=1,...,N,x_i\in R^D,C_i\in {1,...,K} D={xi​,Ci​},i=1,...,N,xi​∈RD,Ci​∈1,...,K有贝叶斯公式如下: p ( C ∣ x ) = p ( C ) p ( x ∣ C ) p ( x ) , C ∈ { C 1 , C 2 , . . . , C k } p(C|x)=\frac {p(C)p(x|C)}{p(x)},C\in \{C_1,C_2,...,C_k\} p(C∣x)=p(x)p(C)p(x∣C)​,C∈{C1​,C2​,...,Ck​}
其中 p ( C ) p(C) p(C)为分类先验概率, p ( x ∣ C ) p(x|C) p(x∣C)为分类条件分布概率。我们的主要任务就是求得 p ( x ∣ C ) 和 p ( C ) p(x|C)和p(C) p(x∣C)和p(C)。

高斯分布式
在此时我们假设 p ( x ∣ C ) p(x|C) p(x∣C)是服从高斯分布的,对任意 x i ∈ ( x 1 , x 2 , . . . , x D ) T x_i\in(x_1,x_2,...,x_D)^T xi​∈(x1​,x2​,...,xD​)T是相互独立的并且均服从高斯分布:
p ( x ∣ C ) = 1 2 π σ c e x p [ − ( x − μ c ) 2 2 σ c 2 ] p(x|C)=\frac {1}{\sqrt {2\pi}\sigma_c}exp[- \frac{(x-\mu_c)^2}{2\sigma_c^2} ] p(x∣C)=2π ​σc​1​exp[−2σc2​(x−μc​)2​]
其中 μ c 和 σ c \mu_c和\sigma_c μc​和σc​分别为各特征的平均值和标准差。

最终分类条件概率可写成:
p ( x ∣ C ) = ∏ d = 1 D p ( x i ∣ C ) = ∏ d = 1 D 1 2 π σ c d e x p [ − ( x − μ c d ) 2 2 ( σ c d ) 2 ] p(x|C)=\prod_{d=1}^Dp(x_i|C)=\prod_{d=1}^D\frac {1}{\sqrt{2\pi}\sigma_c^d}exp[- \frac{(x-\mu_c^d)^2}{2(\sigma_c^{d})^2}] p(x∣C)=d=1∏D​p(xi​∣C)=d=1∏D​2π ​σcd​1​exp[−2(σcd​)2(x−μcd​)2​]

那么最终得到的预测分类结果就是:
C = arg max ⁡ c p ( C ∣ x ) C=\argmax_c{p(C|x)} C=cargmax​p(C∣x)

算法流程
明确了高斯朴素贝叶斯分类器的原理以及计算过程,那么我们很容易得到其算法流程如下:

  1. 准备数据集,分离出feature集以及label集,并根据label集计算先验概率p(C)
  2. 训练模型,根据training dataset计算各特征向量的平均值及标准差
  3. 预测分类,根据输入特征向量计算出所有特征对应的p(x|C)p(C)即k*p(x|C),这里由于分母均相同,所以直接忽略计算分母
  4. 求argmax(k*p(x|C))=argmax(p(x|C))

python实现
花的分类问题:
数据集:数据集链接

import numpy as np
import collections#高斯朴素贝叶斯类
class GuassianNB:def __init__(self):self.prior = None #先验概率self.avgs = None #均值self.vars = None #方差值self.nums = None # 特征值数量#计算先验概率def _get_prior(self, label: np.array)->dict:cnt = collections.Counter(label)a = {}for k,v in cnt.items():a[k]=v/len(label)return a#计算均值def _get_avgs(self,data:np.array,label:np.array)->np.array:return np.array([data[label == i].mean(axis=0) for i in self.nums])#计算方差def _get_vars(self,data:np.array,label:np.array)->np.array:return np.array([data[label == i].var(axis=0) for i in self.nums])#计算似然度def _get_likelihood(self,row:np.array)->np.array:return (1 / np.sqrt(2 * np.pi * self.vars) * np.exp(-(row - self.avgs) ** 2 / (2 * self.vars))).prod(axis=1)#训练数据集def fit(self, data: np.array, label: np.array):self.prior = self._get_prior(label)print(self.prior)a=[]for key in self.prior.keys():a.append(key)self.nums = aself.avgs = self._get_avgs(data, label)self.vars = self._get_vars(data, label)#预测labeldef predict_prob(self, data: np.array) -> np.array:likelihood = np.apply_along_axis(self._get_likelihood, axis=1, arr=data)print(likelihood)a = []for key in self.prior.keys():a.append(self.prior[key])probs = np.array(a) * likelihoodprint(probs)probs_sum = probs.sum(axis=1)return probs / probs_sum[:, None]#预测结果def predict(self, data: np.array) -> np.array:return self.predict_prob(data).argmax(axis=1)def main():origin_dataset = np.loadtxt('iris.txt',dtype=str,delimiter=',')np.random.shuffle(origin_dataset)feature_dataset = [] #特征集label_dataset = [] #标签集feature_dataset_test = [] #测试集label_dataset_test = [] #测试结果集for i in range(int(len(origin_dataset)*0.8)):feature_dataset.append(origin_dataset[i][0:4])label_dataset.append(origin_dataset[i][4])for i in range(int(len(origin_dataset)*0.8),len(origin_dataset)):feature_dataset_test.append(origin_dataset[i][0:4])label_dataset_test.append(origin_dataset[i][4])# print(feature_dataset)# print("--------------------------")# print(label_dataset)feature_dataset = np.array(feature_dataset,dtype=float)label_dataset = np.array(label_dataset,dtype=str)feature_dataset_test = np.array(feature_dataset_test,dtype=float)label_dataset_test = np.array(label_dataset_test,dtype=str)# print(feature_dataset)# print(label_dataset)nb = GuassianNB()nb.fit(feature_dataset,label_dataset) #训练模型# print(nb.avgs)# print(nb.nums)# print(nb.prior)# print(nb.vars)test_result = nb.predict(feature_dataset_test)print(test_result)acc = 0for i in range(len(test_result)):if nb.nums[test_result[i]] == label_dataset_test[i]:acc+=1print("精确度:"+str(acc/len(test_result)))
if __name__ == '__main__':main()

预测结果:
精确度基本可达90%以上。

简洁高斯朴素贝叶斯分类原理及python实现相关推荐

  1. spark的朴素贝叶斯分类原理

    1.要理解朴素贝叶斯分类原理就要先了解下什么是贝叶斯公式: P(A|B) = P(B|A)*P(A)/P(B),这个公式就是朴素贝叶斯分类的数学依据 2.spark的朴素贝叶斯分类适用于特征独立性和特 ...

  2. 高斯朴素贝叶斯分类的原理解释和手写代码实现

    来源:DeepHub IMBA 本文约3500字,建议阅读10+分钟 本文与你介绍高斯分布的基本概念及代码实现. Gaussian Naive Bayes (GNB) 是一种基于概率方法和高斯分布的机 ...

  3. 朴素贝叶斯分类器的python实现

    徒手实现一个贝叶斯分类器 引子 代码 小结 引子 朴素贝叶斯分类器顾名思义是以贝叶斯公式为基础的分类器,其将后验概率转换为先验概率和不同类的条件概率的乘积,再通过比较不同的类别下该乘积的大小实现分类. ...

  4. 机器学习(十一)-Naïve Bayes Classifier朴素贝叶斯分类器及Python实现

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 本次代码的环境: 运行平台: Windows Python版本: ...

  5. 朴素贝叶斯分类器python_朴素贝叶斯分类器及Python实现

    贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据 ...

  6. 贝叶斯公式/朴素贝叶斯分类器及python自实现

    本文从贝叶斯与频率概率的对比入手理解贝叶斯决策的思维方式.通过两个实例理解贝叶斯的思想与流程,然后梳理了朴素贝叶斯分类器的算法流程,最后从零开始实现了朴素分类器的算法. 文章目录 1.起源.提出与贝叶 ...

  7. 朴素贝叶斯分类:原理

    贝叶斯原理是英国数学家托马斯·贝叶斯提出的.贝叶斯是个很神奇的人,他的经历类似梵高.生前没有得到重视,死后,他写的一篇关于归纳推理的论文被朋友翻了出来,并发表了.这一发表不要紧,结果这篇论文的思想直接 ...

  8. 朴素贝叶斯分类-西瓜分类python

    1.算法思想--基于概率的预测 贝叶斯决策论是概率框架下实施决策的基本方法.对分类任务来说,在所有相关概率都已知的情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的标记类别. 2. 理论基 ...

  9. 贝叶斯篇:贝叶斯的概率推到,朴素贝叶斯分类器及Python实现

    在了解贝叶算法前:要有一定的概率与数理统计基础以及注意事项 ####条件概率 首先,理解这两个公式的前提是理解条件概率,因此先复习条件概率. P(A∣B)=P(AB)P(B)P(A|B) ={ P(A ...

最新文章

  1. 中大李文均团队在氮循环功能基因的生物地理学分布格局研究中取得进展
  2. 报名 | 第二届“大数据在清华”高峰论坛
  3. Oracle高级查询之OVER (PARTITION BY ..)
  4. 机器人学习--电子指南针定位导航
  5. firefox扩展开发(四) : 更多的窗口控件
  6. 数据结构 - 多路搜索树(2-3树、b树、b+树、b*树)
  7. 宠物小精灵之收服(信息学奥赛一本通-T1292)
  8. 行为型设计模式(2)—— 模板方法模式(Template Method Pattern)
  9. 【集训DAY16】ALFA【凸壳】【计算几何】
  10. 苹果手机网页选择框 下拉框点击放大处理
  11. java实现pdf旋转_Java实现PDF文本旋转倾斜的方法
  12. 数据库异常用户sa登录失败_Sa登录失败
  13. GCD深入学习之GCD的初识
  14. 【2023年中国法定节假日的订阅链接】
  15. Redhat容器工具集之 - Podman
  16. eclipse导入spring源码二(丢失的spring-asm-repack和spring-cglib-repack)
  17. 从《我不是潘金莲》谈程序员的核心竞争力
  18. PDF文档转换为图片、图片转成PDF 及PDF合并
  19. 使用MIT JWI(Java WordNet Interface)查询WordNet反义词
  20. Unparseable date: “2000-01-01“ 异常

热门文章

  1. 微信html抽奖转盘代码,使用CSS3+jquery.js 实现微信抽奖转盘效果
  2. 单片机叮咚c语言,单片机试验19“叮咚”门铃
  3. 信安学习-day16
  4. Redis-AKF/CAP原则
  5. 国产无线充电宝哪个牌子好?国产无线充电宝品牌排行
  6. P1-2017级第一次算法上机 F SkyLee的艾露猫
  7. 电阻组合c语言程序,【C语言及程序设计】项目1-4-2-2:计算并联电阻
  8. 直流放大器2级电路设计
  9. 无传感器永磁同步电机电机自适应自抗扰ADRC控制策略
  10. Linux文件目录操作命令-more命令