Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载:Auorui/Pattern-recognition-programming: 模式识别编程 (github.com)

简述

分别依照身高、体重数据作为特征,在正态分布假设下利用最大似然法估计分布密度参数,建立最小错误率Bayes分类器,写出得到的决策规则,将该分类器应用到测试样本,考察测试错误情况。在分类器设计时考察采用不同先验概率(如0.5对0.5, 0.75对0.25, 0.9对0.1等)进行实验,考察对决策规则和错误率的影响。

同时采用身高与体重数据作为特征,在正态分布假设下估计概率密度,建立最小错误率Bayes分类器,写出得到的决策规则,将该分类器应用到训练/测试样本,考察训练/测试错误情况。 比较相关假设和不相关假设下结果的差异。在分类器设计时可以考察采用不同先验概率进行实验,考察对决策和错误率的影响。

最小错误率贝叶斯决策

这里要对男性和女性的数据进行分类,先要求解先验概念P(x),这个概率是通过统计得到的,或者依据自身依据经验给出的一个概率值,所以这个值是可以进行设定的,可选择0.5对0.5,0.75对0.25,0.9对0.1这些进行测试。

在贝叶斯统计中,后验概率是在考虑新信息之后事件发生的修正或更新概率。后验概率通过使用贝叶斯定理更新先验概率来计算。

P(w_{i}|x)=\frac{p(x|w_{i})\times P(w_{i})}{p(x)}

其中p(x)为x的概率密度函数,即是:

p(x)=\sum_{i=1}^{2}p(x|w_{i})p(w_{i})

贝叶斯决策可以使用下面的等式来等价表示为

p(x|w_{1})P(w_{1})>p(x|w_{2})P(w_{2})

如果满足上式条件,则x属于w_{1},否则就属于w_{2},这个就是最小错误贝叶斯决策规则。

最小风险贝叶斯决策

在实际的应用中,分类错误率最小并不一定是最好的标准,不同类别的分类错误可能会导致不同的后果。有时,某些类别的错误分类可能比其他类别更为严重。例如,在医疗诊断中,将疾病误诊为健康可能比将健康误诊为疾病更为严重。在有决策风险时候,根据风险重新选择区域R_{1}R_{2}从而使得P_{e}最小。与w_{k}相关的风险或损失定义为:

r_{k}=\sum_{i=1}^{c}\lambda _{ki}\int_{R_{i}}p(x|w_{k})dx

对于本数据,只有两类:

l_{1}=\lambda _{11}p(x|w_{1})p(w_{1})+\lambda _{21}p(x|w_{2})p(w_{2})

l_{2}=\lambda _{12}p(x|w_{1})p(w_{1})+\lambda _{22}p(x|w_{2})p(w_{2})

l_{1}<l_{2},则x属于w_{i}类,即有

(\lambda _{12}-\lambda _{11})p(x|w_{1})P(w_{1})>(\lambda _{21}-\lambda _{22})p(x|w_{2})P(w_{2})

再经过简化,当w_{2}类的样本被错误的分类会产生更严重的后果,可设置为\lambda _{21}>\lambda _{12},所以若p(x|w_{2})>p(x|w_{1})\frac{\lambda _{12}}{\lambda _{21}},则判定为w_{2}类。

数据预处理

首先我们可以观察我们的数据:

它大概是这样分布的,一行数据为身高和体重。你可以使用python文件按行读取进行数据清洗,这里可以直接使用np.loadtxt,它会返回一个二维的数组,使用切片的方法就能划分出身高和体重的特征并进行均值方差化。

# @Auorui
import numpy as np
from scipy.stats import normclass Datasets:# 一个简单的数据加载器def __init__(self, datapath, t):self.datapath = datapathself.data = np.loadtxt(self.datapath)  # 二维数组self.height = self.data[:, 0]self.weight = self.data[:, 1]self.length = len(self.data)self.t = tdef __len__(self):return self.lengthdef mean(self, data):# 均值,可以使用np.mean替换total = 0for x in data:total += xreturn total / self.lengthdef var(self, data):# 方差,可以使用np.var替换mean = self.mean(data)sq_diff_sum = 0for x in data:diff = x - meansq_diff_sum += diff ** 2return sq_diff_sum / self.lengthdef retain(self, *args):# 保留小数点后几位formatted_args = [round(arg, self.t) for arg in args]return tuple(formatted_args)def __call__(self):mean_height = self.mean(self.height)var_height = self.var(self.height)mean_weight = self.mean(self.weight)var_weight = self.var(self.weight)return self.retain(mean_height, var_height, mean_weight, var_weight)

数据加载

def Dataloader(maledata,femaledata):mmh, mvh, mmw, mvw = maledata()fmh, fvh, fmw, fvw = femaledata()male_height_dist = norm(loc=mmh, scale=mvh**0.5)male_weight_dist = norm(loc=mmw, scale=mvw**0.5)female_height_dist = norm(loc=fmh, scale=fvh**0.5)female_weight_dist = norm(loc=fmw, scale=fvw**0.5)data_dist = {'mh': male_height_dist,'mw': male_weight_dist,'fh': female_height_dist,'fw': female_weight_dist}return data_dist

 这里使用字典的方式存储男女数据的正态分布化。

计算概率密度函数(pdf值)以及贝叶斯决策

这里我们将会采用身高进行最小风险贝叶斯决策,采用体重进行最小错误率贝叶斯决策,采用身高、体重进行最小错误率贝叶斯决策。

def classify(height=None, weight=None, ways=1):"""根据身高、体重或身高与体重的方式对性别进行分类:param height: 身高:param weight: 体重:param ways: 1 - 采用身高2 - 采用体重3 - 采用身高与体重:return: 'Male' 或 'Female',表示分类结果"""# 先验概率的公式 : P(w1) = m1 / m ,样本总数为m,属于w1类别的有m1个样本。p_male = 0.5p_female = 1 - p_malecost_male = 0  # 预测男性性别的成本,设为0就是不考虑了cost_female = 0  # 预测女性性别的成本cost_false_negative = 10  # 实际为男性但预测为女性的成本cost_false_positive = 5  # 实际为女性但预测为男性的成本assert ways in [1, 2, 3], "Invalid value for 'ways'. Use 1, 2, or 3."assert p_male + p_female == 1., "Invalid prior probability, the sum of categories must be 1"# if ways == 1:#     assert height is not None, "If mode 1 is selected, the height parameter cannot be set to None"#     p_height_given_male = male_height_dist.pdf(height)#     p_height_given_female = female_height_dist.pdf(height)###     return 1 if p_height_given_male * p_male > p_height_given_female * p_female else 2if ways == 1:assert height is not None, "If mode 1 is selected, the height parameter cannot be set to None"p_height_given_male = male_height_dist.pdf(height)p_height_given_female = female_height_dist.pdf(height)risk_male = cost_male + cost_false_negative if p_height_given_male * p_male <= p_height_given_female * p_female else cost_femalerisk_female = cost_female + cost_false_positive if p_height_given_male * p_male >= p_height_given_female * p_female else cost_malereturn 1 if risk_male <= risk_female else 2if ways == 2:assert height is not None, "If mode 2 is selected, the weight parameter cannot be set to None"p_weight_given_male = male_weight_dist.pdf(weight)p_weight_given_female = female_weight_dist.pdf(weight)return 1 if p_weight_given_male * p_male > p_weight_given_female * p_female else 2if ways == 3:assert height is not None, "If mode 3 is selected, the height and weight parameters cannot be set to None"p_height_given_male = male_height_dist.pdf(height)p_height_given_female = female_height_dist.pdf(height)p_weight_given_male = male_weight_dist.pdf(weight)p_weight_given_female = female_weight_dist.pdf(weight)return 1 if p_height_given_male * p_weight_given_male * p_male > p_height_given_female * p_weight_given_female * p_female else 2return 3

使用测试集验证并计算预测准确率

def test(test_path,ways=3):test_data = np.loadtxt(test_path)true_gender_label=[]pred_gender_label=[]for data in test_data:height, weight, gender = datatrue_gender_label.append(int(gender))pred_gender = classify(height, weight, ways)pred_gender_label.append(pred_gender)if pred_gender == 1:print('Male')elif pred_gender == 2:print('Female')else:print('Unknown\t')return true_gender_label, pred_gender_labeldef accuracy(true_labels, predicted_labels):assert len(true_labels) == len(predicted_labels), "Input lists must have the same length"correct_predictions = sum(1 for true, pred in zip(true_labels, predicted_labels) if true == pred)total_predictions = len(true_labels)accuracy = correct_predictions / total_predictionsreturn accuracy

预测结果

采用身高进行最小风险贝叶斯决策

当采用身高进行最小风险贝叶斯决策,准确率在test1数据上的准确率为94.29%,在test2数据上的准确率为91.0%。

采用体重进行最小错误率贝叶斯决策

当采用体重进行最小风险贝叶斯决策,准确率在test1数据上的准确率为94.29%,在test2数据上的准确率为85.33%。 

采用身高、体重进行最小错误率贝叶斯决策

当采用身高、体重进行最小错误率贝叶斯决策,准确率在test1数据上的准确率为97.14%,在test2数据上的准确率为90.33%。

添加新的特征

除了身高、体重的组合,我们也可以延伸出新的特征,比如bmi。

def calculate_bmi(height,weight):# 计算BMI作为新特征height_meters = height / 100  # 将身高从厘米转换为米bmi = weight / (height_meters ** 2)  # BMI计算公式return bmi

这样能做出的特征就更多了,感兴趣的不妨沿着这个思路继续做。

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

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

相关文章

驱动开发7 基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,5秒钟打印一次hello world

驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/timer.h> #include <linux/of_irq.h> #include <linux/interrupt.h…

Java 四种引用类型

文章目录 前言一、整体架构二、强引用&#xff08;Reference&#xff09;三、软引用&#xff08;SoftReference&#xff09;四、弱引用&#xff08;WeakReference&#xff09;五、虚引用&#xff08;PhantomReference&#xff09;六、引用队列&#xff08;ReferenceQueue&#…

GZ035 5G组网与运维赛题第3套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

软件测试---等价类划分(功能测试)

能对穷举场景设计测试点-----等价类划分 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 1&#xff09;有效等价类 2&#xff09;无效等价类步骤&#xff1a;1&#xff09;明确需求 2&#xff09;确定有效和无…

【面试经典150 | 链表】两数相加

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…

J2EE项目部署与发布(Windows版本)->会议OA单体项目Windows部署,spa前后端分离项目Windows部署

会议OA单体项目Windows部署spa前后端分离项目Windows部署 1.会议OA单体项目Windows部署&#xff08;以实施的角度&#xff09; 将项目放入webapp&#xff0c;项目能够访问: 首先拿到war包和数据库脚本&#xff0c;并检查是否有什么问题。 如何查看项目报错信息&#xff08;当你…

嵌入式中的MCU、ARM、DSP、FPGA

目录 “角色扮演” MCU ARM 特点 DSP 特点 FPGA 特点 应用 “角色扮演” MCU&#xff08;Microcontroller Unit&#xff09;、ARM&#xff08;Advanced RISC Machine&#xff09;、DSP&#xff08;Digital Signal Processor&#xff09;和FPGA&#xff08;Field-Progr…

[C++进阶篇]STL以及string的使用

目录 1. 什么是STL 2. STL库的六大组件 3. 标准库中的string类 3.3 对比size和capacity接口函数 size代表字符串有效长度 capacity代表字符串的实际长度 3.4 reserve&#xff0c;resize函数的使用 3.5 string类的访问和遍历 4. string的修改操作 5. insert和e…

微服务-Ribbon负载均衡

文章目录 负载均衡原理流程原理源码分析负载均衡流程 负载均衡策略饥饿加载总结 负载均衡原理 流程 原理 LoadBalanced 标记RestTemplate发起的http请求要被Ribbon进行拦截和处理 源码分析 ctrlshiftN搜索LoadBalancerInterceptor&#xff0c;进入。发现实现了ClientHttpRequ…

入学生活科研随笔

近而立之年&#xff0c;巅峰享受的时期有两段。一是高考后&#xff0c;收到入学通知书。早晨&#xff0c;八点多&#xff0c;我醒来在院子里看到&#xff0c;爸爸在门口和邮政快递员寒暄。那天应该是8月15号&#xff0c;清晨凉凉爽爽的&#xff0c;杨树遮住了大半个院子。第二段…

Spring Cloud之Gateway网关学习【详细】

目录 统一网关Gateway 网关的实现 搭建网关 编写配置文件 路由断言工程 路由的过滤器 全局过滤器 网关过滤器执行顺序 网关的cors跨域配置 问题及解决 统一网关Gateway 网关的实现 SpringCloud中存在两种网关 gateway&#xff1a;基于Spring5中提供的WebFlux实现&a…

设计师在团队协作中的关键角色与策略

作为设计师&#xff0c;团队协作也是日常工作的一部分。在设计团队中&#xff0c;设计师如何参与团队协作&#xff1f;怎样才能更好的发挥自己的价值&#xff0c;顺利推进项目呢&#xff1f; 设计师遇到的协作难题&#xff1f; 首先我们看一下设计师在日常团队协作工作中可能…

统计学习方法 决策树

文章目录 统计学习方法 决策树决策树模型与学习特征选择决策树的生成ID3 算法C4.5 的生成算法 决策树的剪枝CART 算法CART 回归树的生成CART 分类树的生成CART 剪枝 统计学习方法 决策树 阅读李航的《统计学习方法》时&#xff0c;关于决策树的笔记。 决策树模型与学习 决策…

【Linux】-docker配置容器并打包成镜像

查看本地的镜像: 容器和镜像的关系&#xff1a;容器是Object 镜像是class 一个镜像可以多个容器 docker commit 容器id 新镜像名称:版本号 运行容器&#xff1a; docker run -i -t ubuntu /bin/bash docker exec -it -u root zwbase /bin/bashdocker exec -it 会连接到容器…

Leetcode周赛369补题(3 / 3)

目录 1、找出数组的K-or值 - 位运算 模拟 2、数组的最小相等和 - 分情况讨论 3、使数组变美的最小增量运算数 - 动态规划dp 1、找出数组的K-or值 - 位运算 模拟 100111. 找出数组中的 K-or 值 思路&#xff1a; 根据范围&#xff0c;我们可以枚举0~30位&#xff0c;然后在…

TCP 协议的可靠传输机制是怎样实现的?

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层协议。 1 它通过以下几种方法来保证数据传输的可靠性&#xff1a; 检验和&#xff1a;TCP 在发送和接收数据时&#xff0c;都会计算一个检验和&#xff0c;用来检测数据是否在传输过程中发生了错误或损坏。如果检验和不匹…

Android平台GB28181执法记录仪技术方案

技术背景 我们在做Android平台GB28181设备接入模块的时候&#xff0c;对接过好多开发者&#xff0c;他们都是用于执法记录仪场景&#xff0c;执法记录仪是一种便携式设备&#xff0c;用于记录执法人员的行动和接触情况&#xff0c;通过实时回传音视频数据和实时位置信息给指挥…

大厂面试题-什么是JVM

JVM全称是Java虚拟机&#xff0c;在聊什么是JVM之前&#xff0c;我们不妨看⼀下这张图。 从这张图中可以看出JVM所处的位置&#xff0c;同时也能看出它两个作用&#xff1a; 1、运⾏并管理Java源码⽂件所⽣成的Class⽂件&#xff0c; 2、在不同的操作系统上安装不同的JVM&#…

游戏和内容创作者福音,Intel蝰蛇峡谷Nuc12SNKi7迷你主机:双十一降价来袭,从9999降至5999

引言 随着双十一购物节的到来&#xff0c;各大品牌纷纷推出了一系列优惠活动&#xff0c;其中备受关注的Intel蝰蛇峡谷Nuc12SNKi7迷你主机也迎来了降价。这款迷你主机以其独特的外观、卓越的性能以及灵活的应用场景&#xff0c;在市场上备受瞩目。此次双十一活动期间&#xff…

2023上半年系统集成项目管理工程师下午真题

文章目录 一&#xff1a;第5章 项目立项管理。第7章 项目范围管理&#xff0c;需求文件二&#xff1a;第9章 项目成本管理。第8章 项目进度管理&#xff0c;压缩工期三&#xff1a;第15章 信息&#xff08;文档&#xff09;和配置管理四&#xff1a;第18章 项目风险管理&#x…