【Python】python实现决策树算法和贝叶斯算法(附源代码)

使用一种你熟悉的程序设计语言,实现(1)贝叶斯算法和(2)决策树算法

目录

  • 1、贝叶斯算法
  • 2、决策树算法
  • 3、两种算法比较

1、贝叶斯算法

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from collections import defaultdict
import collections
import math
import pickle
import operatoroutlook = ["晴朗", "多云","雨天"]
Temperature = ["高温", "中温","低温"]
Humidity = ["高湿","一般"]
Wind = ["大", "小"]
PlayTennis=["是","否"]
Play = []
Play.append(outlook)
Play.append(Temperature)
Play.append(Humidity)
Play.append(Wind)
Play.append(PlayTennis)#数据集
data = [  ["晴朗","高温","高湿","小","否"],["晴朗","高温","高湿","大","否"],["多云","高温","高湿","小","是"],["雨天","中温","高湿","小","是"],["雨天","低温","一般","小","是"],["雨天","低温","一般","大","否"],["多云","低温","一般","大","是"],["晴朗","中温","高湿","小","否"],["晴朗","低温","一般","小","是"],["雨天","中温","一般","小","是"],["晴朗","中温","一般","大","是"],["多云","中温","高湿","大","是"],["晴朗","高温","一般","小","是"],["多云", "高温", "一般", "小", "是"],["雨天","中温","高湿","大","否"],["晴朗","中温","高湿","大","否"]]length = len(data)
#划分数据集,将1-12条作为训练数据集,13-16作为测试数据集
train = data[:12]
train_length = len(train)
print("训练数据集")
for i in range(train_length):print(train[i])
test= data[12:]
test_length = len(test)
print("测试数据集")
for i in range(test_length):print(test[i])
def count_PlayTennis_total(data):count = defaultdict(int)for i in range(train_length):count[data[i][4]]+=1return count#先验概率
def cal_base_rates(data):y = count_PlayTennis_total(data)cal_base_rates = {}for label in y.keys():priori_prob = (y[label]+1) / (len(train)+2)cal_base_rates[label] = priori_probreturn cal_base_ratesprint(cal_base_rates(train))def count_sj(attr, Play):for i in range(len(Play)):if attr in Play[i]:return len(Play[i])#似然概率p(x|y) 也叫条件概率
def likelihold_prob(data):#计算各个特征值在已知结果下的概率(likelihood probabilities)y = count_PlayTennis_total(data)likelihold = {}for i,c in y.items():#创建一个临时的字典,临时存储各个特征值的概率attr_prob = defaultdict(int)for j in range(train_length):if data[j][4]==i:for attr in range(4):attr_prob[data[j][attr]]+=1for keys,values in attr_prob.items():sj =  count_sj(keys, Play)attr_prob[keys]=(values+1)/(c+sj)likelihold[i] = attr_probreturn likeliholdLikeHold = likelihold_prob(train)def Test(data,test):y = count_PlayTennis_total(data)likehold = likelihold_prob(data)playtennis = cal_base_rates(data)RATE = defaultdict(int)print(test)for i, _ in y.items():rates=1for j in range(4):attr = test[j]rates *= likehold[i][attr]rates=rates * playtennis[i]RATE[i] = ratesprint("预测结果: " )print(RATE)return sorted(RATE,key=lambda x:RATE[x])[-1]#先验概率
cal_base_rates(train)
# 条件概率
likelihold_prob(train)
Test(train,test[0][:4])
Test(train,test[1][:4])
Test(train,test[2][:4])
Test(train,test[3][:4])

在这里插入图片描述

2、决策树算法

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from collections import defaultdict
import collections
import math
import pickle
import operator# 定义属性值
outlook = ["晴朗", "多云", "雨天"]
Temperature = ["高温", "中温", "低温"]
Humidity = ["高湿", "一般"]
Wind = ["大", "小"]
PlayTennis = ["是", "否"]
Play = []
Play.append(outlook)
Play.append(Temperature)
Play.append(Humidity)
Play.append(Wind)
Play.append(PlayTennis)# 数据集
data = [["晴朗", "高温", "高湿", "小", "否"],["晴朗", "高温", "高湿", "大", "否"],["多云", "高温", "高湿", "小", "是"],["雨天", "中温", "高湿", "小", "是"],["雨天", "低温", "一般", "小", "是"],["雨天", "低温", "一般", "大", "否"],["多云", "低温", "一般", "大", "是"],["晴朗", "中温", "高湿", "小", "否"],["晴朗", "低温", "一般", "小", "是"],["雨天", "中温", "一般", "小", "是"],["晴朗", "中温", "一般", "大", "是"],["多云", "中温", "高湿", "大", "是"],["晴朗", "高温", "一般", "小", "是"],["多云", "高温", "一般", "小", "是"],["雨天", "中温", "高湿", "大", "否"],["晴朗", "中温", "高湿", "大", "否"]]length = len(data)
# 划分数据集,将1-12条作为训练数据集,13-16作为测试数据集
train = data[:12]
train_length = len(train)
print("训练数据集")
for i in range(train_length):print(train[i])
test = data[12:]
test_length = len(test)
print("测试数据集")
for i in range(test_length):print(test[i])# 计算信息熵
def cal_entropy(dataset):length = len(dataset)entropy = 0count = {}for i in dataset:label = i[-1]count[label] = count.get(label, 0) + 1for key in count:p = count[key] / lengthentropy = entropy - p * math.log(p, 2)return entropy# 划分数据集
def splitDataSet(dataSet, axis, value):childDataSet = []for i in dataSet:if i[axis] == value:childList = i[:axis]childList.extend(i[axis + 1:])childDataSet.append(childList)# print(childDataSet)return childDataSet# 选择最好的特征
def chooseFeature(dataset):old_entropy = cal_entropy(dataset)character = -1for i in range(len(dataset[0]) - 1):newEntropy = 0featureList = [word[i] for word in dataset]value = set(featureList)for j in value:childDataSet = splitDataSet(dataset, i, j)newEntropy += len(childDataSet) / len(dataset) * cal_entropy(childDataSet)if (newEntropy < old_entropy):character = iold_entropy = newEntropyreturn character# 当遍历完所有特征时,用于选取当前数据集中最多的一个类别代表该类别
def most(classList):classCount = {}for i in range(len(classList)):classCount[i] = classCount.get(i, 0) + 1sortCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)# print(sortCount)return sortCount[0][0]# 构造决策树
def createDT(dataSet, labels):# print(dataSet)tempLabels = labels[:]classList = [word[-1] for word in dataSet]if classList.count(classList[0]) == len(classList):return classList[0]if len(dataSet[0]) == 1:return most(dataSet)character = chooseFeature(dataSet)node = tempLabels[character]myTree = {node: {}}del (tempLabels[character])featureList = [word[character] for word in dataSet]value = set(featureList)for i in value:newLabels = tempLabelsmyTree[node][i] = createDT(splitDataSet(dataSet, character, i), newLabels)return myTree# 分类
def classify(dTree, labels, testData):node = list(dTree.keys())[0]condition = dTree[node]labelIndex = labels.index(node)classLabel = Noneprint(testData)for key in condition:if testData[labelIndex] == key:if type(condition[key]).__name__ == 'dict':# print("预测结果: " )classLabel = classify(condition[key], labels, testData)else:print("预测结果: ")classLabel = condition[key]return classLabel# 用于将构建好的决策树保存,方便下次使用
def stroeTree(myTree, filename):f = open(filename, 'wb')pickle.dump(myTree, f)f.close()# 载入保存的决策树
def loadTree(filename):f = open(filename, 'rb')return pickle.load(f)labels = ['天气状况', '温度', '湿度', '风力', '是否适合游玩(预测变量)']
myTree = createDT(train, labels)
stroeTree(myTree, '1')
myTree = loadTree('1')
print(myTree)

在这里插入图片描述

3、两种算法比较

决策树算法和贝叶斯算法都是常见的机器学习算法,用于分类和预测任务,但它们的工作原理和应用场景有所不同。以下是它们之间的比较:

决策树算法贝叶斯算法
工作原理基于对输入数据集进行递归分割,每次分割都基于某个特征的某个阈值,以最小化节点的不纯度(如基尼系数、信息增益等)。这种递归分割形成了一个树形结构,每个叶子节点代表一个类别或一个预测结果。基于贝叶斯定理,利用已知的数据集和特征之间的关系来计算给定一个新样本属于每个类别的概率。它假设特征之间相互独立,然后利用贝叶斯公式计算后验概率,从而进行分类。
应用场景适用于具有离散和连续特征的分类问题,特别是当特征之间存在复杂关系时。它易于理解和解释,并且对异常值和缺失值有较好的鲁棒性。适用于处理高维数据和文本分类等问题。它在样本量较少时表现良好,并且对噪声数据有一定的鲁棒性
优点易于理解、处理离散和连续数据、对异常值和缺失值具有鲁棒性容易过拟合、对数据分布敏感以及不稳定性
缺点对小样本数据有效、对噪声数据有一定的鲁棒性、能够处理高维数据对特征之间相互独立的假设较强、在特征相关性较高时表现不佳
模型解释易于解释和可视化,可以通过树结构直观地理解每个决策的依据通常较为复杂,不太容易直接解释,因为它涉及到对多个特征之间的概率关系进行建模

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法-DFS/BFS-XMUOJ提瓦特细胞探秘

题目 思路 这道题目描述了一个矩阵中由数字1至9组成的细胞&#xff0c;这些细胞按照特定规则相互连接。具体规则是&#xff0c;只有当细胞上下左右紧邻的数字同样属于1至9时&#xff0c;它们才会被视为同一细胞的一部分。 解决这个问题的关键在于如何遍历整个矩阵&#xff0c…

灵雀云开源ALB ,为云原生 Kubernetes 网关领域再添新星

ALB (Another Load Balancer)是一款由灵雀云倾力打造的云原生 Kubernetes 网关&#xff0c;近日&#xff0c;正式宣布将其在Github上开源。ALB 的诞生&#xff0c;旨在满足日益增长的云原生应用需求&#xff0c;为开发者提供更为强大和灵活的网关解决方案。 ALB 支持在一个集群…

Oracle PL/SQL Programming 第9章:Numbers 读书笔记

总的目录和进度&#xff0c;请参见开始读 Oracle PL/SQL Programming 第6版 本章谈3点&#xff1a; 可使用的数字数据类型如何在数字和文本间转换PL/SQL 内置数值函数 Numeric Datatypes NUMBER&#xff1a;平台无关的实现&#xff0c;适合处理货币金额PLS_INTEGER 和 BINA…

前端面试题汇总

基础面试题 1.new 操作符做了那些事 function Fun(name){this.name name } Fun.prototype.sayHi funtion(){console.log(this.name) }function mockCreate(fn, ...args){let obj Object.create({}) // 创建一个空对象Object.setPrototypeOf(obj, fn.prototype) // 空对象…

day02vue学习

day02 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修…

速卖通批量注册买家号安全吗?怎么弄?

在速卖通等跨境电商平台上&#xff0c;买家号的注册与养号过程繁琐而复杂。传统的手动注册方式效率低下&#xff0c;难以满足大规模的需求。而跨境智星系统凭借其全自动化的功能&#xff0c;能够轻松实现买家号的批量注册与养号&#xff0c;大大提高了效率。 使用跨境智星系统进…

200W年薪的大佬 随手丢给我“Spring速成宝典”看完这些知识点直接定级P7

面试官&#xff1a;答的很好&#xff0c;最后一个问题&#xff1a;如果没有Spring&#xff0c;你打算怎么开展工作&#xff1f; 这个思考了几分钟后&#xff0c;程序员小建是这么回答的&#xff1a;Spring的核心源码&#xff0c;比如&#xff1a;IOC、AOP、Spring事务、MVC原理…

Explain详解与索引优化最佳实践

Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在select语句之前增加explain关键字,MySQL会在查询前设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 注意: 如果from中包含子查询,仍会执行该子查询,将结果…

DAY by DAY 史上最全的Linux常用命令汇总----man

man是按照手册的章节号的顺序进行搜索的。 man设置了如下的功能键&#xff1a; 功能键 功能 空格键 显示手册页的下一屏 Enter键 一次滚动手册页的一行 b 回滚一屏 f 前滚一屏 q 退出man命令 h 列出所有功能键 /word 搜索word字符串 注意&#xff1a…

【文献阅读】A Fourier-based Framework for Domain Generalization(基于傅立叶的领域泛化框架)

原文地址&#xff1a;https://arxiv.org/abs/2105.11120 摘要 现代深度神经网络在测试数据和训练数据的不同分布下进行评估时&#xff0c;存在性能下降的问题。领域泛化旨在通过从多个源领域学习可转移的知识&#xff0c;从而泛化到未知的目标领域&#xff0c;从而解决这一问…

03-自媒体文章发布-黑马头条

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

图解Diffusion扩散模型+代码

0、项目视频详解 视频教程见B站https://www.bilibili.com/video/BV1e8411a7mz 1、diffusion模型理论&#xff08;推导出损失函数&#xff09; 1.1、背景 随着人工智能在图像生成&#xff0c;文本生成以及多模态生成等领域的技术不断累积&#xff0c;如&#xff1a;生成对抗网…

SD-WAN技术如何保障网络的持续连接和稳定性

在当今数字化时代&#xff0c;企业对于网络的稳定性和持续连接性需求日益增加。SD-WAN作为一种新兴的网络解决方案&#xff0c;为企业提供了有效的方式来实现网络的持续连接和稳定性。本文将探讨SD-WAN技术如何保障网络的持续连接和稳定性。 1、多路径冗余技术 SD-WAN采用了多…

初识Python语言-课堂练习【pyhton123题库】

初识Python语言-课堂练习【pyhton123题库】 一、单项选择题 1、Guido van Rossum正式对外发布Python版本的年份是&#xff1a; A 2008B 1998C 1991D 2002 【答案】C 【解析】暂无解析2、下面不是Python语言特点的是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪…

移动端App、小程序、公众号该怎么选择,你真得知道吗?

当下移动App,小程序泛滥&#xff0c;如何选择&#xff0c;你真的知道吗&#xff1f; 今天我们就聊聊App、小程序、公众号、微应用具体是什么&#xff1f;怎么样开发&#xff1f;适合在什么情况下使用&#xff1f; 1.App、小程序、公众号、微应用之初识 App App本质来说就是手…

机试:蛇形矩阵

问题描述: 代码示例: //蛇形矩阵 #include <bits/stdc.h> using namespace std;int main(){int n;cout << "输入样例" << endl; cin >> n;int k 1; for(int i 0; i < n; i){if( i %2 0){//单数行for(int j 0; j < n; j){ cout &…

安装包逆向1

1.找到程序的入口点 在IDA中我们看到函数非常多&#xff0c;但是一般都是有主要的入口的&#xff0c;所以找一下有没有主函数 可以直接 CtrF直接查找 CNsInstaller::CNsInstaller 这里搞半天在获取文件路径 CNsInstaller::StartInstall CNsInstaller::InstallFunc char…

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范&#xff0c;容错率低&#xff0c;管理人员处理数据费工费时&#xff0c;采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

Spring 面试题及答案整理,最新面试题

Spring框架中的Bean生命周期是什么&#xff1f; Spring框架中的Bean生命周期包含以下关键步骤&#xff1a; 1、实例化Bean&#xff1a; 首先创建Bean的实例。 2、设置属性值&#xff1a; Spring框架通过反射机制注入属性。 3、调用BeanNameAware的setBeanName()&#xff1a…

某电信公司组织结构优化咨询项目成功案例纪实

——构建前后端组织结构&#xff0c;提升组织运营效率 随着企业的不断发展&#xff0c;行业的竞争也越来越激烈&#xff0c;企业只能不断调整自身的战略才能更好的适应这样的大环境。在战略调整的过程中&#xff0c;企业往往会面临这样的问题&#xff1a;管理层的经营理念各不…