文章目录

  • 1.朴素贝叶斯模型
  • 2.朴素贝叶斯代码实现
  • 4.拉普拉斯修正及其代码实现
  • 5.朴素贝叶斯如何处理连续数据
  • 6.sklearn实现朴素贝叶斯
  • 7.垃圾邮件识别

1.朴素贝叶斯模型


2.朴素贝叶斯代码实现

import numpy as np# 定义加载数据的函数
def loaddata():X = np.array([[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],[1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'],[2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'],[3, 'M'], [3, 'L'], [3, 'L']])y = np.array([-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1])return X, y# 训练、计算各个概率值
def Train(trainset, train_labels):# 数据量m = trainset.shape[0]# 特征数n = trainset.shape[1]# 先验概率,key是类别值,value是类别的概率值prior_probability = {}# 条件概率,key的构造:类别,特征,特征值conditional_probability = {}# 类别的可能取值labels = set(train_labels)# 计算先验概率,此时没有计算总数据量mfor label in labels:prior_probability[label] = len(train_labels[train_labels == label])print('prior_probabilit =', prior_probability)# 计算条件概率for i in range(m):for j in range(n):# key的构造:类别,特征,特征值key = str(y[i]) + ',' + str(j) + ',' + str(trainset[i][j])if key in conditional_probability:conditional_probability[key] += 1else:conditional_probability[key] = 1print('conditional_probability = ', conditional_probability)# 因字典在循环时不能改变,故定义新字典来保存值conditional_probability_final = {}for key in conditional_probability:# 取出当前的类别label = key.split(',')[0]conditional_probability_final[key] = conditional_probability[key] / prior_probability[int(label)]# 最终先验概率(除以总数据量m)for label in labels:prior_probability[label] = prior_probability[label] / mreturn prior_probability, conditional_probability_final, labels# 定义预测函数
def predict(data):result = {}# 循环标签for label in train_labels_set:temp = 1.0for j in range(len(data)):key = str(label) + ',' + str(j) + ',' + str(data[j])# 条件概率连乘temp = temp * conditional_probability[key]# 在乘上先验概率result[label] = temp * prior_probability[label]print('result =', result)# 排序返回标签值return sorted(result.items(), key=lambda x: x[1], reverse=True)[0][0]if __name__ == '__main__':X, y = loaddata()prior_probability, conditional_probability, train_labels_set = Train(X, y)print('conditional_probability = ', conditional_probability)# 预测y_hat = predict([2, 'S'])print('y_hat =', y_hat)
prior_probabilit = {1: 9, -1: 6}
conditional_probability =  {'-1,0,1': 3, '-1,1,S': 3, '-1,1,M': 2, '1,0,1': 2, '1,1,M': 4, '1,1,S': 1, '-1,0,2': 2, '1,0,2': 3, '1,1,L': 4, '1,0,3': 4, '-1,0,3': 1, '-1,1,L': 1}
conditional_probability =  {'-1,0,1': 0.5, '-1,1,S': 0.5, '-1,1,M': 0.3333333333333333, '1,0,1': 0.2222222222222222, '1,1,M': 0.4444444444444444, '1,1,S': 0.1111111111111111, '-1,0,2': 0.3333333333333333, '1,0,2': 0.3333333333333333, '1,1,L': 0.4444444444444444, '1,0,3': 0.4444444444444444, '-1,0,3': 0.16666666666666666, '-1,1,L': 0.16666666666666666}
result = {1: 0.02222222222222222, -1: 0.06666666666666667}
y_hat = -1

4.拉普拉斯修正及其代码实现

import numpy as np# 定义加载数据的函数
def loaddata():X = np.array([[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],[1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'],[2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'],[3, 'M'], [3, 'L'], [3, 'L']])y = np.array([-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1])return X, y# 训练、计算各个概率值
def Train(trainset, train_labels):# 数据量m = trainset.shape[0]# 特征数n = trainset.shape[1]# 先验概率,key是类别值,value是类别的概率值prior_probability = {}# 条件概率,key的构造:类别,特征,特征值conditional_probability = {}# 类别的可能取值labels = set(train_labels)# 计算先验概率,此时没有计算总数据量mfor label in labels:prior_probability[label] = len(train_labels[train_labels == label]) + 1print('prior_probabilit =', prior_probability)# 计算条件概率for i in range(m):for j in range(n):# key的构造:类别,特征,特征值key = str(y[i]) + ',' + str(j) + ',' + str(trainset[i][j])if key in conditional_probability:conditional_probability[key] += 1else:conditional_probability[key] = 1print('conditional_probability = ', conditional_probability)# 因字典在循环时不能改变,故定义新字典来保存值conditional_probability_final = {}for key in conditional_probability:# 取出当前的类别label = key.split(',')[0]key1 = key.split(',')[1]Ni = len(set(trainset[:, int(key1)]))conditional_probability_final[key] = (conditional_probability[key]+1) / (prior_probability[int(label)] + Ni)# 最终先验概率(除以总数据量m)for label in labels:prior_probability[label] = prior_probability[label] / (m+len(labels))return prior_probability, conditional_probability_final, labels# 定义预测函数
def predict(data):result = {}# 循环标签for label in train_labels_set:temp = 1.0for j in range(len(data)):key = str(label) + ',' + str(j) + ',' + str(data[j])# 条件概率连乘temp = temp * conditional_probability[key]# 在乘上先验概率result[label] = temp * prior_probability[label]print('result =', result)# 排序返回标签值return sorted(result.items(), key=lambda x: x[1], reverse=True)[0][0]if __name__ == '__main__':X, y = loaddata()prior_probability, conditional_probability, train_labels_set = Train(X, y)print('conditional_probability = ', conditional_probability)# 预测y_hat = predict([2, 'S'])print('y_hat =', y_hat)
prior_probabilit = {1: 10, -1: 7}
conditional_probability =  {'-1,0,1': 3, '-1,1,S': 3, '-1,1,M': 2, '1,0,1': 2, '1,1,M': 4, '1,1,S': 1, '-1,0,2': 2, '1,0,2': 3, '1,1,L': 4, '1,0,3': 4, '-1,0,3': 1, '-1,1,L': 1}
conditional_probability =  {'-1,0,1': 0.4, '-1,1,S': 0.4, '-1,1,M': 0.3, '1,0,1': 0.23076923076923078, '1,1,M': 0.38461538461538464, '1,1,S': 0.15384615384615385, '-1,0,2': 0.3, '1,0,2': 0.3076923076923077, '1,1,L': 0.38461538461538464, '1,0,3': 0.38461538461538464, '-1,0,3': 0.2, '-1,1,L': 0.2}
result = {1: 0.027845457709711106, -1: 0.04941176470588235}
y_hat = -1

5.朴素贝叶斯如何处理连续数据

比较p(x|y=1)与p(x|y=-1)的大小,哪个大就取哪个类别

6.sklearn实现朴素贝叶斯

import numpy as np
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import LabelEncoder# 加载数据
def loaddata():X = np.array([[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],[1, 'S'], [2, 'S'], [2, 'M'], [2, 'M'],[2, 'L'], [2, 'L'], [3, 'L'], [3, 'M'],[3, 'M'], [3, 'L'], [3, 'L']])y = np.array([-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1])return X, yif __name__ == '__main__':X, y = loaddata()# 需把字符类型的转换为数字类型,即对字符类型进行编码X[:, 1] = LabelEncoder().fit_transform(X[:, 1])# 强制转化成整型X = X.astype(int)print(X)# 调用朴素贝叶斯模型并fit数据model = MultinomialNB()model.fit(X, y)# 预测# 对[2,'S']进行预测,将S转换成2y_hat = model.predict([[2, 2]])print('预测类别是', y_hat)
[[1 2][1 1][1 1][1 2][1 2][2 2][2 1][2 1][2 0][2 0][3 0][3 1][3 1][3 0][3 0]]
预测类别是 [-1]

7.垃圾邮件识别

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split# 获得词汇列表
def createVocabList(dataSet):# 创建空的词汇表vocabSet = set([])for document in dataSet:# 词汇表和set(document)取并集vocabSet = vocabSet | set(document)# 返回一个经过自然排序的词汇表return sorted(list(vocabSet))# 把训练数据转换为向量
# 词集模型0与1
def setOfWords2Vec(vocabList, inputSet):# 初始化向量,其长度与词汇表长度一致returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:# 把词汇表对应位置设为1returnVec[vocabList.index(word)] = 1else:print("词: %s 不在词汇表中!" % word)return returnVec# 词袋模型
def bagOfWords2Vec(vocabList, inputSet):# 初始化向量,其长度与词汇表长度一致returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:# 把词汇表对应位置加1returnVec[vocabList.index(word)] += 1return returnVec# 对邮件内容进行预处理
def textParse(bigString):import relistOfTokens = re.split(r'\W*', bigString)# 返回长度大于2的且转换为小写return [tok.lower() for tok in listOfTokens if len(tok) > 2]# 读取邮件
def loaddata():docList = []classList = []num = 26for i in range(1, num):# 读取垃圾邮件wordList = textParse(open('E:\email\spam\%d.txt' % i).read())docList.append(wordList)classList.append(1)# 读取非垃圾邮件wordList = textParse(open('E:/email/ham/%d.txt' % i).read())docList.append(wordList)classList.append(0)vocabList = createVocabList(docList)X = []for docIndex in range(len(docList)):X.append(bagOfWords2Vec(vocabList, docList[docIndex]))# X.append(setOfWords2Vec(vocabList, docList[docIndex]))return X, classList, vocabListif __name__ == '__main__':X, y, vocaList = loaddata()X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.20)model = MultinomialNB()model.fit(X_train, y_train)y_hat = model.predict(X_test)print("accuracy=", accuracy_score(y_test, y_hat))

机器学习4-朴素贝叶斯相关推荐

  1. 【机器学习】朴素贝叶斯、SVM和数据分布检验分析

    [机器学习]朴素贝叶斯.SVM和数据分布检验分析 文章目录 1 朴素贝叶斯 2 SVM2.1 线性可分2.2 最大间隔超平面2.3 SVM 最优化问题 3 数据分布检验方法3.1 数据分布检验3.2 ...

  2. 机器学习:朴素贝叶斯

    机器学习:朴素贝叶斯 1 朴素贝叶斯应用场景 2 朴素贝叶斯相关公式 3 sklearn库中朴素贝叶斯运用 3.1 伯努利朴素贝叶斯 3.2 多项式朴素贝叶斯 3.3 高斯朴素贝叶斯 4 代码 4.1 ...

  3. 机器学习:朴素贝叶斯模型算法原理(含实战案例)

    机器学习:朴素贝叶斯模型算法原理 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页

  4. 机器学习之朴素贝叶斯 1

    机器学习之朴素贝叶斯 1 朴素贝叶斯 2 朴素贝叶斯应用 3 代码实现贝努力朴素贝叶斯 4 代码实现高斯朴素贝叶斯 5 代码实现多项式朴素贝叶斯 6 总结 前言:主要介绍朴素贝叶斯的概念.公式,以及代 ...

  5. 【机器学习算法-朴素贝叶斯、支持向量机】

    机器学习算法-朴素贝叶斯算法 1.朴素贝叶斯算法 2.支持向量机 2.1SVM基本综述 1.朴素贝叶斯算法 朴素贝叶斯是生成模型,需要根据已有的数据求出先验概率. 1.联合概率 2.条件概率 3.相互 ...

  6. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)

    <机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...

  7. 机器学习实战 朴素贝叶斯分类器

    基于概率论的分类方法: 朴素贝叶斯 我的微信公众号: s406205391; 欢迎大家一起学习,一起进步!!! k-近邻算法和决策树会给出"该数据属于哪一类"的明确回答.不过,分类 ...

  8. 朴素贝叶斯 php,PHP实现机器学习之朴素贝叶斯算法详解.pdf

    PHP实实现现机机器器学学习习之之朴朴素素贝贝叶叶斯斯算算法法详详解解 本文实例讲述了PHP实现机器学习之朴素贝叶斯算法.分享给大家供大家参考 具体如下: 机器学习已经在我们的生活中变得随处可见了.比 ...

  9. 基于朴素贝叶斯分类器的西瓜数据集 2.0 预测分类_机器学习之朴素贝叶斯

    1.贝叶斯原理 朴素贝叶斯分类(Naive Bayesian,NB)源于贝叶斯理论,是一类基于概率的分类器,其基本思想:假设样本属性之间相互独立,对于给定的待分类项,求解在此项出现的情况下其他各个类别 ...

  10. 【机器学习】朴素贝叶斯代码练习

    本课程是中国大学慕课<机器学习>的"朴素贝叶斯"章节的课后代码. 课程地址: https://www.icourse163.org/course/WZU-1464096 ...

最新文章

  1. 好几天没戴工牌坐地铁了,受不了!
  2. mysql行级安全_MySQL学习笔记(五):MySQL表级锁和行级锁
  3. [LeetCode] Permutations 解题报告
  4. style对象的cssText方法
  5. 【UVA - 11729】Commando War (贪心,时间调度问题)
  6. 强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测
  7. php数组去交集,PHP获得数组交集与差集的方法
  8. (44)VHDL实现多路复用器(if-else)
  9. [Asp.Net Core]Session的使用
  10. Arcmap做地形地貌图流程
  11. Bootstrap3【上手教程】
  12. 二十五岁零基础转行做软件测试怎么样?
  13. 让你提前认识软件开发(8):memset()与memcpy()函数
  14. 一个技术总监的个人综合评估,希望对大家能有所帮助(转)
  15. Qt 实现 HMAC_SHA1 哈希算法
  16. 神马笔记 版本2.0.0——新的旅程
  17. 判断一个整数为奇数还是偶数
  18. 【学习笔记】目标检测中,为什么要对anchor候选框进行坐标/尺寸归一化处理?
  19. 检测到弱密码套件:不支持完全前向保密
  20. 优酷、YouTube、Twitter及JustinTV几个视频网站的架构

热门文章

  1. 【react】 react---项目的-----------简单路由配置
  2. 用户登陆进去后,没有权限操作
  3. java day33【JavaScript基础】
  4. 【java】doc转pdf
  5. mysql 数据库中根据当前系统时间,取前后几秒、几分钟、几小时、几天
  6. 2-PowerShell 对象,查询操作和格式化
  7. php文件之间传值的三种主流并且常用的方式
  8. ASP.NET MVC3中的路由系统 Routes
  9. YT工作日志-0911
  10. menuconfig 菜单配置