Python实现分类算法

article/2025/8/25 14:58:52

前言:出自于学校课程数据挖掘与分析布置的实验小作业,案例经典,代码注释较全,供大家参考。

题目:

现有西瓜挑选数据文件:dataset.txt,编程实现朴素贝叶斯算法,并判断有如下特征的瓜是否好瓜:青绿,稍蜷,浊响,清晰,凹陷,硬滑。

实验数据如下:

在这里插入图片描述
要求:

1、自行采用一种语言编程实现算法(注意:计算条件概率、判别分类等核心算法需自己编程实现)2、用课堂例子进行正确性检验3、用户界面友好,要考虑到输入输出4、分析结果,说明理论分析到数值计算的注意问题

python实现

import sys# readfile, remove_place, get_conditions, NoneException都是自己封装的方法
from FirstExp.kam import readfile, remove_place, get_conditions, NoneException
import easygui as gui'''
这里捕获一下异常,文本中的数据如果有空格、空隙则需要处理文本信息
处理数据数据中的空格,导致的Bug是因为取值的方法不对,
parameters["好瓜"] => parameters[col[columns - 2]] 则不会引起这样的问题
'''
try:# 读取txt文件df = readfile()txt = df.data# 获取列数columns = txt.shape[1]# 算好瓜与坏瓜的概率col = txt.columns[1:columns]# 好瓜、不好的瓜分别是多少parameters = txt[col]# 总体为好瓜的个数good_num_y = parameters["好瓜"].value_counts()["是"]# 总体不是好瓜的个数good_num_n = parameters["好瓜"].value_counts()["否"]# 是好瓜的概率p_y = parameters["好瓜"].value_counts(normalize=True)["是"]# 不是好瓜的概率p_n = parameters["好瓜"].value_counts(normalize=True)["否"]# 获取用户输入条件,如果用户选进行条件选择时,点击了“cancel”,或直接关闭选择框# 则会引起异常,给出异常原因try:conditions = get_conditions(txt)except NoneException as e:print(e)sys.exit(0)# 判断条件是否符合要求j = 0# 临时变量yes = 1no = 1# 使用双层遍历获取各个属性下指定类别的概率for i in col[: columns - 2]:while j < len(conditions):# 满足各个条件为好瓜的数量condition_num_y = parameters[(parameters["好瓜"] == "是") & (parameters[i] == conditions[j])].shape[0]# 满足各个条件不是好瓜的数量condition_num_n = parameters[(parameters["好瓜"] == "否") & (parameters[i] == conditions[j])].shape[0]# 使用累乘获取是好瓜的概率yes = yes * (condition_num_y / good_num_y)# 使用累乘获取不是好瓜的概率no = no * (condition_num_n / good_num_n)j = j + 1# 这里必须添加break,内层循环只需要循环一次break# 结果是好瓜的概率yes = yes * p_y# 结果不是好瓜的概率no = no * p_nyes_msg = "此瓜是好瓜的概率为:" + str(yes) + "\n此瓜不是好瓜的概率为:" + str(no) + "\n所以条件为:" + ",".join(conditions) + "是好瓜"no_msg = "此瓜是好瓜的概率为:" + str(yes) + "\n此瓜不是好瓜的概率为:" + str(no) + "\n所以条件为:" + ",".join(conditions) + "不是好瓜"if yes > no:gui.msgbox(msg=yes_msg, title="结果", ok_button="确认")else:gui.msgbox(msg=no_msg, title="结果", ok_button="确认")
except KeyError:print(remove_place(df.path))

kam.py

"""
用户选择文件,并以矩阵的形式返回
主要思想还是使用pandas库下的read函数
"""
# Author: KamTang
# Date:   November  28, 2021import os
import timeimport pandas as pd
import numpy as np
import tkinter as tk
from tkinter import filedialog
import easygui as guiclass KamData(object):"""自定义返回类Parameters----------data : 数据部分path : 路径"""def __init__(self, data, path):self.data = dataself.path = pathdef readfile():"""读取文件param select_path:文件路径return: 根据文件类型,返回数据"""# 开启选择文件窗口root = tk.Tk()root.withdraw()# 获取选择好的文件select_path = filedialog.askopenfilename()# 获取文件类型(后缀)file_type = os.path.splitext(select_path)[1]if file_type == ".csv" or file_type == ".txt":data = pd.read_csv(select_path, encoding="utf-8")res = KamData(data, select_path)return reselif file_type == ".excel":return pd.read_excel(select_path)else:return "该文件类型暂时无法读取"def remove_place(path):"""去除文件中的空格Parameters----------path : 选择的文件路劲Returns-------new_path : 重新生成的文件路径,基于你所选择的文件位置"""# 获取文件路径out_path = path.rsplit("/", 1)[0]# 获取文件类型file_type = os.path.splitext(path)[1]f = open(path, 'r+', encoding='utf-8')new_f = open(out_path + "/" + time.strftime('%Y%m%d', time.localtime(time.time())) + file_type, 'w',encoding='utf8')for line in f.readlines():new_str = line.replace(" ", "")new_f.write(new_str)f.close()new_f.close()# 使用字符串拼接获取新文件路径new_path = out_path + "/" + time.strftime('%Y%m%d', time.localtime(time.time())) + file_typeprint("由于选择的文件数据存在脏数据,现已重新为您生成与您选择文件数据一致的文件,路径为:")return new_path# 自定义异常
class NoneException(Exception):passdef get_conditions(read_file):""":param read_file: 读取的文件:return: 用户选择的条件"""# 获取列数columns = read_file.shape[1]# 算好瓜与坏瓜的概率col = read_file.columns[1:columns]# 好瓜、不好的瓜分别是多少parameters = read_file[col]conditions = {}# 使用字典的形式存入各个类别for i in col[: columns - 2]:conditions[i] = np.unique(parameters[i].values)# 获取所有元素下标index = conditions.keys()# 存入用户选择的类别temp = []j = 0for i in index:while j < len(conditions[i]):temp.append(gui.choicebox(msg=i, choices=conditions[i], title="请选择特征"))breakfor t in range(len(temp)):if temp[t] is None:raise NoneException("条件存在漏选,无法分析结果。")else:return temp

执行流程

选取文件

在这里插入图片描述
由于文件的部分数据带有空格,重新为用户生成一份数据一致的临时文件,提示用户选择临时文件(后面已解决该问题,数据中的空格部分不会影响整体结果)

在这里插入图片描述

选择瓜的属性:

在这里插入图片描述

结果:

在这里插入图片描述
总结:

此实验就是自己实现朴素贝叶斯算法,那么就需要求出各个元素的个数,对应真假概率。我最开始是手动一个一个地将元素对应符合条件的个数取出,再求出概率。这样没有问题,但是在代码就会显得十分冗余,而且如果数据量十分大,需要取的元素也随之增大,当然这完全能应付这个实验的,但是自己有一点点的强迫症,所以后面使用了循环处理,这样不仅使得代码更加简洁,而且增加了其可读性,也不用再定义那么多参数。
后面又觉得在读取文件时每次需要手动输入文件路径,十分麻烦,索性自己又封装了读取文件的方法,与之前的不同的是,自己封装的是通过窗口选择文件,取代了手动输入路径形式,并且还封装了“清理数据”的方法。主要思想是如果出现KeyError异常,或者能肯定是读取的文件数据有问题,则重新生成一份文件读取。
在用第一行的标题获取文本最后一列数据时,执行的代码直接报KeyError错误,后来以矩阵的形式输出全部数据,发现个别的数据有空格,所以在读取时,会报错。那么怎么解决呢?我的想法是我们不能修改原文件,而是重新生成一个临时文件,内部数据完全一致,我们不动原文件,相当于只是一个复制粘贴过程,实质上就是进行了一次“数据清理”。

源码(DMA文件下)
在这里插入图片描述

文件获取,提取码:9vw6
界面随便弄的,不要太关注。


http://chatgpt.dhexx.cn/article/oGmNwCda.shtml

相关文章

贝叶斯分类算法

贝叶斯分类是一类分类算法的总称&#xff0c;这类算法均以贝叶斯定理为基础&#xff0c;故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单&#xff0c;也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到的朴素贝叶斯分类算法&#…

基于Python实现五大常用分类算法(原理+代码)

读&#xff1a; 在机器学习和统计中&#xff0c;分类算法通过对已知类别训练集的计算和分析&#xff0c;从中发现类别规则并预测新数据的类别。分类被认为是监督学习的一个实例&#xff0c;即学习可以获得正确识别的观察的训练集的情况。 实现分类的算法&#xff0c;特别是在具…

EIGRP综合实验解析

实验要求 1.R1为ISP,只能配置IP地址 2.R1与R2之间为PPP封装&#xff0c;使用CHAP认证&#xff0c;R1为主认证方 3.R2-R8地址为172.16.0.0/16 4.R4的S1/1口带宽为800K。R4到R2环回为非等开销负载均衡 5.保证更新安全&#xff0c;减少路由条目数量 6.R6到达R8环回通过R7进行 7.R2…

EIGRP协议

EIGRP是距离矢量路由协议&#xff0c;但又非距离矢量那样路由完全是别人告诉&#xff0c;而是通过维护3张表自己对比计算后放入路由表。同样会受水平分割影响。 EIGRP建邻居过程 第一步&#xff1a;路由器R1和R2接口配置EIGRP后&#xff0c;在相应接口上向外组播发送Hello包…

EIGRP总结

EIGRP 增强内部网关路由协议 无类别距离矢量IGP协议&#xff1b; 增量更新—仅触发更新&#xff0c;无周期更新----更新量小&#xff08;DV&#xff09;&#xff0c;可靠性高&#xff08;RTP&#xff09;&#xff0c;保活机制&#xff08;hello&#xff09; 复合度量—多个参数…

EIGRP

EIGRP增强型网关路由协议 基本内容&#xff1a; Cisco私有&#xff1b;无类别距离矢量协议&#xff1b;跨层封装协议&#xff0c;封装于网络层–协议号88&#xff1b;组播更新&#xff1a;224.0.0.10 &#xff1b;支持非等开销负载均衡&#xff1b;增量更新&#xff08;部分更…

思科EIGRP配置及基本讲解

思科EIGRP配置及基本讲解 什么是EIGRP EIGRP全称 [增强型内部网关路由选择协议] 是思科自主研发的动态路由选择协议&#xff0c;按类型划分是一款IGP协议&#xff0c;距离矢量协议&#xff0c;是一款基于传闻的协议。 EIGRP是思科的私有协议&#xff0c;直到13年&#xff0c;此…

EIGRP协议的配置

EIGRP(Enhanced Interior Gateway Routing Protocol&#xff0c;增强型内部网关路由协议)是Cisco公司开发的一个平衡混合型路由协议&#xff0c;它融合了距离向量和链路状态两种路由协议的优点&#xff0c;支持IP&#xff0c;IPX和ApplleTalk等多种网络层协议。由于TCP/IP是当今…

网络篇 EIGRP协议-27

目录 一、EIGRP的基本概述 二、EIGRP的特点 三、EIGRP的四种重要技术 四、EIGRP的相关术语 五、EIGRP的三张表 1.路由表 2.邻居表 3.拓扑表 六、EIGRP的五个分组 1.Hello分组&#xff1a; 2.Update更新分组&#xff1a; 3.Query查询分组&#xff1a; 4.Reply应答分…

EIGRP(Enhanced Interior Gateway Routing Protocol,增加型内部网关路由协议)

EIGRP是Cisco公司于1992年开发的一个无类别距离矢量路由协议&#xff0c;它融合了距离矢量和链路状态两种路由协议的优点。EIGRP是Cisco的专有路由协议&#xff0c; 是Cisco的IGRP协议的增加版。IGRP是一种有类距离矢量协议&#xff0c;Cisco IOS 12.3版以后不再支持该协议。 E…

EIGRP理论详解及基础实验

EIGRP:( Enhanced Interior Gateway Routing Protocol )增强型内部网关路由协议 EIGRP 是一种Cisco专用协议,同时具备链路状态和距离矢量路由协议的优点.只发送变化后的信息(这类似于链路状态协议),同时只将这些信息发送给邻接路由器(这类似于距离矢量协议). 距离矢量路由协议…

CSMA协议

介质访问控制 CSMA协议 1-坚持CSMA 非坚持CSMA p-坚持CSMA 三种CSMA对比总结

3.4.2 CSMA/CD协议

为了解决各站点争用总线的问题&#xff0c;共享总线使用了一种专用协议CSMA/CD&#xff0c;它是载波监听多址接入/碰撞检测&#xff08;Carrier Sence Multiple Access Collision Detection&#xff09;的英文缩写。 假设站点C要发送帧&#xff0c;它首先进行载波监听&#xff…

关于CSMA/CA和CSMA/CD的区别

转载自&#xff1a;https://www.cnblogs.com/aixin0813/p/3289183.html 1.1 载波侦听多路访问 根据具体的监听/发送策略&#xff0c;可将CSMA分为&#xff1a; 非持续CSMA&#xff08;英语&#xff1a;non-persistent CSMA&#xff09; 当要发送帧的设备侦听到线路忙或发生冲…

计算机网络:随机访问介质访问控制之CSMA/CA协议

CSMA/CD协议已成功应用于使用有线连接的局域网&#xff0c;但在无线局域网环境下&#xff0c;却不能简单地搬用CSMA/CD协议&#xff0c;特别是碰撞检测部分。主要有两个原因: 1&#xff09;接收信号的强度往往会远小于发送信号的强度&#xff0c;且在无线介质上信号强度的动态…

CSMA/CD协议详解

一、协议背景 最早的以太网是总线网络&#xff0c;当一台计算机发送数据时&#xff0c;总线上所有计算机都能检测到这个数据(广 播通讯方式)。为了通讯的简便&#xff0c;传统总线型以太网采取了以下措施&#xff1a; 1.提供的服务为不可靠的交付&#xff1a; (1.采用较为灵活…

CSMA/CD

carrier sense multi-access/collision detect&#xff0c;载波监听多路访问/冲突检测 工作原理&#xff1a; 发送数据前进行载波监听判断信道是否空闲&#xff0c;若信道忙则等待一段随机时间&#xff1b;若信道空闲则立即发送数据&#xff0c;发送数据过程中同时检测是否产…

CSMA/CD和拥塞控制AIMD其实是一回事!

今天下班的班车上&#xff0c;撸论文&#xff0c;找到一篇关于CSMA/CD性能分析的&#xff0c;然而下载需要钱&#xff0c;作罢。我讨厌知识付费&#xff0c;因为我崇尚知识免费共享。 正好我上周末也写了一篇与此相关的&#xff1a; 谈谈CSMA/CD&#xff0c;TCP中的二进制指数…

CSMA/CD和CSMA/CA的区别(最全知识点总结)

在最后有总结&#xff0c;中间对CSMA/CD和CSMA/CA的描述也很详尽 一.CSMA/CD&#xff08;载波监听多点接入/碰撞检测&#xff09; 为什么要使用CSMA/CD&#xff1a; 因为总线上只要有数据&#xff0c;传输资源时就会被占用&#xff0c;又因为传统总线型以太网采用半双工的通讯…

CSMA/CA精辟总结

1. CSMA/CA https://blog.csdn.net/qq894040717/article/details/82426965 https://blog.csdn.net/LMM_5201/article/details/81673371 参考了以上链接的内容,然后进行了整理补充 CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)协议只能用于有明确目标地…