【机器学习】朴素贝叶斯(多分类版本)—— python3 实现方案
根据《统计学习方法》第四章朴素贝叶斯算法流程写成,引入贝叶斯估计(平滑处理)。
本例旨在疏通算法流程,理解算法思想,故简化复杂度,只考虑离散型数据集。如果要处理连续型数据,可以考虑将利用“桶”把连续型数据转换成离散型,或者假设连续型数据服从某分布,计算其概率密度来代替贝叶斯估计。
《机器学习实战》的朴素贝叶斯算法,是针对文本处理(垃圾邮件过滤)的算法,是二元分类(y=0或y=1),且特征的取值也是二元(x=0或x=1)的特殊算法,因此用numpy数组相加的方法,可以快速算出各特征取值的概率。但是推广的一般情况,即不同特征的取值范围各不相同时,无法把所有情况整合到一个数组中,故在实现时,使用字典来存储各种情况的概率,代价是空间和时间复杂度更大了,而且看上去不是那么简洁。应该还有更好的办法。
使用鸢尾花数据测试,准确率达96%
import numpy as np
from collections import Counter
from sklearn import datasetsclass NaiveBayes:def __init__(self, lamb=1):self.lamb = lamb # 贝叶斯估计的参数self.prior = dict() # 存储先验概率self.conditional = dict() # 存储条件概率def training(self, features, target):"""根据朴素贝叶斯算法原理,使用 贝叶斯估计 计算先验概率和条件概率特征集集为离散型数据,预测类别为多元. 数据集格式为np.array:param features: 特征集m*n,m为样本数,n为特征数:param target: 标签集m*1:return: 不返回任何值,更新成员变量"""features = np.array(features)target = np.array(target).reshape(features.shape[0], 1)m, n = features.shapelabels = Counter(target.flatten().tolist()) # 计算各类别的样本个数k = len(labels.keys()) # 类别数for label, amount in labels.items():self.prior[label] = (amount + self.lamb) / (m + k * self.lamb) # 计算平滑处理后的先验概率for feature in range(n): # 遍历每个特征self.conditional[feature] = {}values = np.unique(features[:, feature])for value in values: # 遍历每个特征值self.conditional[feature][value] = {}for label, amount in labels.items(): # 遍历每种类别feature_label = features[target[:, 0] == label, :] # 截取该类别的数据集c_label = Counter(feature_label[:, feature].flatten().tolist()) # 计算该类别下各特征值出现的次数self.conditional[feature][value][label] = (c_label.get(value, 0) + self.lamb) / \(amount + len(values) * self.lamb) # 计算平滑处理后的条件概率returndef predict(self, features):"""预测单个样本"""best_poster, best_label = -np.inf, -1for label in self.prior:poster = np.log(self.prior[label]) # 初始化后验概率为先验概率,同时把连乘换成取对数相加,防止下溢(即太多小于1的数相乘,结果会变成0)for feature in range(features.shape[0]):poster += np.log(self.conditional[feature][features[feature]][label])if poster > best_poster: # 获取后验概率最大的类别best_poster = posterbest_label = labelreturn best_labeldef test():dataset = datasets.load_iris() # 鸢尾花数据集dataset = np.concatenate((dataset['data'], dataset['target'].reshape(-1, 1)), axis=1) # 组合数据np.random.shuffle(dataset) # 打乱数据features = dataset[:, :-1]target = dataset[:, -1:]nb = NaiveBayes()nb.training(features, target)prediction = []for features in features:prediction.append(nb.predict(features))correct = [1 if a == b else 0 for a, b in zip(prediction, target)]print(correct.count(1) / len(correct)) # 计算准确率test()
【机器学习】朴素贝叶斯(多分类版本)—— python3 实现方案相关推荐
- 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类
机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类 一.界面实现 from tkinter import * from tkinter import ttk import NBdef ma ...
- 秒懂机器学习---朴素贝叶斯
秒懂机器学习---朴素贝叶斯 一.总结 一句话总结: 尽管朴素贝叶斯的条件独立性假设存在一定的问题,但是朴素贝叶斯算法仍然能取得比较理想的分类预测结果. 1.朴素贝叶斯分类算法 和 KNN分类算法和决 ...
- 朴素贝叶斯实现分类_关于朴素贝叶斯分类及其实现的简短教程
朴素贝叶斯实现分类 Naive Bayes classification is one of the most simple and popular algorithms in data mining ...
- 机器学习-朴素贝叶斯(基础讲解+代码实现+图像展示)
朴素贝叶斯 定理: 某晚,C准备收拾东西接女朋友,那么小C要不要带伞呢. 已知:天气预报说今日降水概率为50%–P(A) 晚高峰堵车的概率为80%–P(B) 如果下雨,晚高峰堵车的概率是95%–P(B ...
- python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估(完整代码+实现效果)
实现功能: python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估. 实现代码: # 导入需要的库 from warnings import simplefilter simplef ...
- 机器学习 | 朴素贝叶斯法知识总结
机器学习 | 朴素贝叶斯法理论知识 贝叶斯决策论是概率框架下实施决策的基本方法.对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记.朴素贝 ...
- 机器学习朴素贝叶斯_机器学习基础朴素贝叶斯分类
机器学习朴素贝叶斯 In the previous stories, I had given an explanation of the program for implementation of v ...
- 机器学习-朴素贝叶斯分类器
机器学习-朴素贝叶斯分类器 概述 定义 贝叶斯方法 朴素贝叶斯算法 算法原理 优缺点 优点 缺点 应用 文本分类 其他 概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯分类 ...
- 机器学习---朴素贝叶斯模型
机器学习-朴素贝叶斯模型 1.通俗解释: 朴素贝叶斯模型的基本思路就是利用贝叶斯的后验概率公式来推算当前属性下的数据样本属于哪一个类别.直白一点说,就是在特征属性为当前取值的条件下,该样本归属于那个类 ...
- 八、朴素贝叶斯中文分类实战
1.朴素贝叶斯中文分类实战 文本分类的流程如下图所示: 朴素贝叶斯中文分类的目录结构 中文分类的目录机构包括停用词文件.训练集文件和和测试集文件,具体内容如下图所示: 2 数据准备与处理 2.1 数据 ...
最新文章
- 【多重数组降维的简单方法】
- GNN论文笔记: Graph Neural Networks with convolutional ARMA filters
- kafka学习笔记:知识点整理
- Canny边缘检测算法
- Java 虚拟机内存分配与回收策略
- PHP扩展高性能日志系统SeasLog简单上手
- Qt调用dll中的功能函数
- 学用状态机模式,写的报销流程,请指教
- python桌面快捷图标_Python创建、删除桌面、启动组快捷方式的例子分享
- 日语学习-多邻国-饮食
- 小程序直播 OBS 画质_微信小程序怎么直播卖货?
- Leetcode每日一题:23.merge-k-sorted-lists(合并K个排序链表)
- linux高级知识,LAMP架构(一),MYSQL安装
- 2021-1-29Linux学习纪要
- CSDN上传的资源为何不能自定义下载积分?
- Java经典算法题(一,kafka权威指南百度网盘
- Java汉字转拼音实现方式
- 解决安装vc2005运行库时提示Command line option syntax error.Type Command/?for Help
- 网络编程-UDP编程
- 低频电子线路学习笔记
热门文章
- 贪吃的大嘴java_[蓝桥杯][算法提高VIP]贪吃的大嘴-题解(Java代码)
- 传统业务上云:跨AZ容灾架构解析
- Matlab多张二维图堆叠成一张三维图
- 美团2016招聘笔试:奇数位丢弃
- 推荐一个单干网赚好站!BUXJOB - 健康程序员,至尚生活!
- php竞赛,PHP实现炸金花游戏比赛
- 如何构建业务数据分析体系
- 苹果iOS 10的备份加密减弱:破解速度提升2500倍
- 【Node.js-6】consolidate模板引擎集成、router路由介绍
- 计算机专业英语自学国外教材,计算机专业英语课程 自学辅导方案精选.pdf