简介
朴素贝叶斯分类算法是基于贝叶斯理论和特征条件独立假设的分类算法。对于给定的训练集,首先基于特征条件独立假设学习数据的概率分布。然后基于此模型,对于给定的特征数据x,利用贝叶斯定理计算出标签y。朴素贝叶斯分类算法实现简单,预测效率很高,是一种常用的分类算法。
本实训项目的主要内容是基于 Python 语言搭建朴素贝叶斯分类器,并使用sklearn 实现新闻文本进行主题分类的功能。

朴素贝叶斯分类算法流程

import numpy as npclass NaiveBayesClassifier(object):def __init__(self):'''self.label_prob表示每种类别在数据中出现的概率例如,{0:0.333, 1:0.667}表示数据中类别0出现的概率为0.333,类别1的概率为0.667'''self.label_prob = {}'''self.condition_prob表示每种类别确定的条件下各个特征出现的概率例如训练数据集中的特征为 [[2, 1, 1],[1, 2, 2],[2, 2, 2],[2, 1, 2],[1, 2, 3]]标签为[1, 0, 1, 0, 1]那么当标签为0时第0列的值为1的概率为0.5,值为2的概率为0.5;当标签为0时第1列的值为1的概率为0.5,值为2的概率为0.5;当标签为0时第2列的值为1的概率为0,值为2的概率为1,值为3的概率为0;当标签为1时第0列的值为1的概率为0.333,值为2的概率为0.666;当标签为1时第1列的值为1的概率为0.333,值为2的概率为0.666;当标签为1时第2列的值为1的概率为0.333,值为2的概率为0.333,值为3的概率为0.333;因此self.label_prob的值如下:     {0:{0:{1:0.52:0.5}1:{1:0.52:0.5}2:{1:02:13:0}}1:{0:{1:0.3332:0.666}1:{1:0.3332:0.666}2:{1:0.3332:0.3333:0.333}}}'''self.condition_prob = {}def fit(self, feature, label):'''对模型进行训练,需要将各种概率分别保存在self.label_prob和self.condition_prob中:param feature: 训练数据集所有特征组成的ndarray:param label:训练数据集中所有标签组成的ndarray:return: 无返回'''#********* Begin *********#row_num = len(feature)col_num = len(feature[0])for c in label:if c in self.label_prob:self.label_prob[c] += 1else:self.label_prob[c] = 1for key in self.label_prob.keys():# 计算每种类别在数据集中出现的概率self.label_prob[key] /= row_num# 构建self.condition_prob中的keyself.condition_prob[key] = {}for i in range(col_num):self.condition_prob[key][i] = {}for k in np.unique(feature[:, i], axis=0):self.condition_prob[key][i][k] = 0for i in range(len(feature)):for j in range(len(feature[i])):if feature[i][j] in self.condition_prob[label[i]]:self.condition_prob[label[i]][j][feature[i][j]] += 1else:self.condition_prob[label[i]][j][feature[i][j]] = 1for label_key in self.condition_prob.keys():for k in self.condition_prob[label_key].keys():total = 0for v in self.condition_prob[label_key][k].values():total += vfor kk in self.condition_prob[label_key][k].keys():#计算每种类别确定的条件下各个特征出现的概率self.condition_prob[label_key][k][kk] /= total#********* End *********#def predict(self, feature):'''对数据进行预测,返回预测结果:param feature:测试数据集所有特征组成的ndarray:return:'''# ********* Begin *********#result = []#对每条测试数据都进行预测for i, f in enumerate(feature):#可能的类别的概率prob = np.zeros(len(self.label_prob.keys()))ii = 0for label, label_prob in self.label_prob.items():#计算概率prob[ii] = label_probfor j in range(len(feature[0])):prob[ii] *= self.condition_prob[label][j][f[j]]ii += 1#取概率最大的类别作为结果result.append(list(self.label_prob.keys())[np.argmax(prob)])return np.array(result)#********* End *********#

拉普拉斯平滑

import numpy as npclass NaiveBayesClassifier(object):def __init__(self):'''self.label_prob表示每种类别在数据中出现的概率例如,{0:0.333, 1:0.667}表示数据中类别0出现的概率为0.333,类别1的概率为0.667'''self.label_prob = {}'''self.condition_prob表示每种类别确定的条件下各个特征出现的概率例如训练数据集中的特征为 [[2, 1, 1],[1, 2, 2],[2, 2, 2],[2, 1, 2],[1, 2, 3]]标签为[1, 0, 1, 0, 1]那么当标签为0时第0列的值为1的概率为0.5,值为2的概率为0.5;当标签为0时第1列的值为1的概率为0.5,值为2的概率为0.5;当标签为0时第2列的值为1的概率为0,值为2的概率为1,值为3的概率为0;当标签为1时第0列的值为1的概率为0.333,值为2的概率为0.666;当标签为1时第1列的值为1的概率为0.333,值为2的概率为0.666;当标签为1时第2列的值为1的概率为0.333,值为2的概率为0.333,值为3的概率为0.333;因此self.label_prob的值如下:     {0:{0:{1:0.52:0.5}1:{1:0.52:0.5}2:{1:02:13:0}}1:{0:{1:0.3332:0.666}1:{1:0.3332:0.666}2:{1:0.3332:0.3333:0.333}}}'''self.condition_prob = {}def fit(self, feature, label):'''对模型进行训练,需要将各种概率分别保存在self.label_prob和self.condition_prob中:param feature: 训练数据集所有特征组成的ndarray:param label:训练数据集中所有标签组成的ndarray:return: 无返回'''#********* Begin *********#row_num = len(feature)col_num = len(feature[0])unique_label_count = len(set(label))for c in label:if c in self.label_prob:self.label_prob[c] += 1else:self.label_prob[c] = 1for key in self.label_prob.keys():# 计算每种类别在数据集中出现的概率,拉普拉斯平滑self.label_prob[key] += 1self.label_prob[key] /= (unique_label_count+row_num)# 构建self.condition_prob中的keyself.condition_prob[key] = {}for i in range(col_num):self.condition_prob[key][i] = {}for k in np.unique(feature[:, i], axis=0):self.condition_prob[key][i][k] = 1for i in range(len(feature)):for j in range(len(feature[i])):if feature[i][j] in self.condition_prob[label[i]]:self.condition_prob[label[i]][j][feature[i][j]] += 1for label_key in self.condition_prob.keys():for k in self.condition_prob[label_key].keys():#拉普拉斯平滑total = len(self.condition_prob[label_key].keys())for v in self.condition_prob[label_key][k].values():total += vfor kk in self.condition_prob[label_key][k].keys():# 计算每种类别确定的条件下各个特征出现的概率self.condition_prob[label_key][k][kk] /= total#********* End *********#def predict(self, feature):'''对数据进行预测,返回预测结果:param feature:测试数据集所有特征组成的ndarray:return:'''result = []# 对每条测试数据都进行预测for i, f in enumerate(feature):# 可能的类别的概率prob = np.zeros(len(self.label_prob.keys()))ii = 0for label, label_prob in self.label_prob.items():# 计算概率prob[ii] = label_probfor j in range(len(feature[0])):prob[ii] *= self.condition_prob[label][j][f[j]]ii += 1# 取概率最大的类别作为结果result.append(list(self.label_prob.keys())[np.argmax(prob)])return np.array(result)

新闻文本主题分类

from sklearn.feature_extraction.text import CountVectorizer  # 从sklearn.feature_extraction.text里导入文本特征向量化模块
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformerdef news_predict(train_sample, train_label, test_sample):'''训练模型并进行预测,返回预测结果:param train_sample:原始训练集中的新闻文本,类型为ndarray:param train_label:训练集中新闻文本对应的主题标签,类型为ndarray:test_sample:原始测试集中的新闻文本,类型为ndarray'''# ********* Begin *********#vec = CountVectorizer()train_sample = vec.fit_transform(train_sample)test_sample = vec.transform(test_sample)tfidf = TfidfTransformer()train_sample = tfidf.fit_transform(train_sample)test_sample = tfidf.transform(test_sample)mnb = MultinomialNB(alpha=0.01)  # 使用默认配置初始化朴素贝叶斯mnb.fit(train_sample, train_label)  # 利用训练数据对模型参数进行估计predict = mnb.predict(test_sample)  # 对参数进行预测return predict# ********* End *********#

感谢大家的支持!!!!!记得点赞!!!

机器学习 --- 朴素贝叶斯分类器 python相关推荐

  1. 朴素贝叶斯分类器原理介绍及python代码实现

    目录 频率学派和贝叶斯学派 朴素贝叶斯分类器 python实现朴素贝叶斯分类器 频率学派和贝叶斯学派 说起概率统计,不得不提到频率学派和贝叶斯学派,通过对概率的不同理解而演变的两个不同的概率学派. 频 ...

  2. 多项式朴素贝叶斯分类器_多项式朴素贝叶斯分类器的主题预测

    多项式朴素贝叶斯分类器 In Analytics Vidhya, Hackathon, there was a problem statement for text prediction of top ...

  3. 机器学习:基于概率的朴素贝叶斯分类器详解--Python实现以及项目实战

    前言 前篇基础理论知识:机器学习:贝叶斯分类器详解(一)-贝叶斯决策理论与朴素贝叶斯 这篇主要使用代码实现贝叶斯分类. 一.准备数据 创建一个bayes.py程序,从文本中构建词向量,实现词表向向量转 ...

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

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

  5. 用Python开始机器学习(6:朴素贝叶斯分类器)

    朴素贝叶斯分类器是一个以贝叶斯定理为基础,广泛应用于情感分类领域的优美分类器.本文我们尝试使用该分类器来解决上一篇文章中影评态度分类. 1.贝叶斯定理 假设对于某个数据集,随机变量C表示样本为C类的概 ...

  6. 【机器学习算法-python实现】扫黄神器-朴素贝叶斯分类器的实现

    1.背景      以前我在外面公司实习的时候,一个大神跟我说过,学计算机就是要一个一个贝叶斯公式的套用来套用去.嗯,现在终于用到了.朴素贝叶斯分类器据说是好多扫黄软件使用的算法,贝叶斯公式也比较简单 ...

  7. 机器学习:伯努利朴素贝叶斯分类器(原理+python实现)

    伯努利朴素贝叶斯分类器主要用于文本分类,下面我们以一个具体的例子,来讲述下伯努利朴素贝叶斯的原理和实现逻辑. 具体例子: 已知我们有八个句子以及每个句子对应的类别,即中性或侮辱性.那么再给出一个句子, ...

  8. 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层

    [火炉炼AI]机器学习013-用朴素贝叶斯分类器估算个人收入阶层 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matp ...

  9. (数据科学学习手札30)朴素贝叶斯分类器的原理详解Python与R实现

    一.简介 要介绍朴素贝叶斯(naive bayes)分类器,就不得不先介绍贝叶斯决策论的相关理论: 贝叶斯决策论(bayesian decision theory)是概率框架下实施决策的基本方法.对分 ...

最新文章

  1. cocos2d-x 音效中断问题
  2. 108.将有序数组转换为二叉搜索树
  3. 浏览器事件监听的方法
  4. mysql grant %_MySQL的Grant命令详解
  5. boost asio 异步实现tcp通讯
  6. abap--关于异常的处理
  7. python 图表_新手向——制作web图表(基于Python和GooPyCharts)
  8. MongoDB 聚合
  9. 计算机基础及ms应用在线,全国一级计算机基础及MS Office应用课件 (2).pdf
  10. 零基础入门stm32需要学这些东西
  11. 2015年2月12日——不懂点
  12. Algs4-2.3.8Quick.sort()在处理N个全部重复的元素时比较次数
  13. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
  14. linux中查看某个进程打开的文件数
  15. win10磁盘100官方解释_win10磁盘分区管理工具大变脸,现代磁盘管理工具喷薄而出...
  16. [导入]vs2005视频教程 之 编译程序集和发布网站 [视频]
  17. js for ubuntu
  18. 苹果电脑如何正确断网?macOS操作系统断网方法
  19. 190503每日一句
  20. PHP依赖注入(DI)和控制反转(IOC)

热门文章

  1. 常用CMOS模拟开关功能和原理(4066,4051-53)
  2. kali 虚拟机下 mana-toolkit 的安装
  3. 《给业余投资者的10条军规 (雪球「岛」系列) (闲来一坐s话投资》读书笔记
  4. Stduino学习(一)3色LED模块
  5. 如何在opencv 和 vs 2019 调整运行窗口的大小
  6. 开启dubbo之旅——Dubbo Admin(新版)
  7. linux能用airport吗_如何设置AppleAirPort无线路由器
  8. FaceLandmark dataset Augment
  9. Web前端html5+css3前端开发入门学习笔记
  10. 推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上