当前位置: 首页 > news >正文

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

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

相关文章:

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

代码与文件请从这里下载&#xff1a;Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征&#xff0c;在正态分布假设下利用最大似然法估计分布密度参数&#xff0c;建立最小错误率Bayes分类器&#xff0c;写出得到的决…...

【考研数学】数学“背诵”手册 | 需要记忆且容易遗忘的知识点

文章目录 引言一、高数常见泰勒展开 n n n 阶导数公式多元微分函数连续、可微、连续可偏导之间的关系多元函数极值无条件极值条件极值 三角函数的积分性质华里士公式&#xff08; “点火”公式 &#xff09;特殊性质 原函数与被积函数的奇偶性结论球坐标变换公式 二、写在最后 …...

HJ3 明明的随机数

牛客网&#xff1a;HJ3 明明的随机数 https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0?tpId37&tqId21226&ru/exam/oj 使用Go语言解题&#xff0c;最简单的方式&#xff1a; 解题一&#xff1a; // 运行时间&#xff1a;5ms 占用内存&#xff1a…...

如何恢复u盘删除文件?2023最新分享四种方法恢复文件

U盘上删除的文件怎么恢复&#xff1f;使用U盘存储文件是非常方便的&#xff0c;例如&#xff1a;在办公的时候&#xff0c;会使用U盘来存储网络上查找到的资料、产品说明等。在学习的时候&#xff0c;会使用U盘来存储教育机构分享的教学视频、重点知识等。而随着U盘存储文件的概…...

8.稳定性专题

1. anr https://code84.com/303466.html 一句话&#xff0c;规定的时间没有干完要干的事&#xff0c;就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…...

基于51单片机的四种波形信号发生器仿真设计(仿真+程序源码+设计说明书+讲解视频)

本设计 基于51单片机信号发生器仿真设计 &#xff08;仿真程序源码设计说明书讲解视频&#xff09; 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0015 这里写目录标题 基于51单片机信号发生…...

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题&#xff0c;就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性&#xff0c;这里也需要详细记录下整个过程&#xff0c;明白的人不用看&#xff0c;可以直接跳过&#xff0c;到解决方法去…...

C#序列化与反序列化详解

在我们深入探时C#序列化和反序列化&#xff0c;之前我们先要明白什么是序列化&#xff0c;它又称串行化&#xff0c;是.ET运行时环境用来支持用户定义 类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去&#xff0c;反序列化就是在适当的时候把这个文件再…...

如何在k8s的Java服务镜像(Linux)中设置中文字体

问题描述&#xff1a;服务是基于springboot的Java服务&#xff0c;在项目上是通过Maven的谷歌插件打包&#xff0c;再由k8s部署的。k8s的镜像就是一个Java服务&#xff0c;Java服务用到了中文字体。 解决这个问题首先需要搞定镜像字体的问题。有很多类似的解决方案&#xff0c;…...

CT 扫描的 3D 图像分类-预测肺炎的存在

介绍 此示例将展示构建 3D 卷积神经网络 (CNN) 所需的步骤,以预测计算机断层扫描 (CT) 扫描中是否存在病毒性肺炎。2D CNN 通常用于处理 RGB 图像(3 通道)。3D CNN 就是 3D 的等价物:它以 3D 体积或一系列 2D 帧(例如 CT 扫描中的切片)作为输入,3D CNN 是学习体积数据表…...

整合管理案例题分析

本文摘自江山老师文档 五个过程 制定项目章程 1.没有写项目章程&#xff0c;没有颁布 2.项目经理自己颁布项目章程 3.项目经理修改项目章程 4.项目章程授权不够&#xff0c;项目经理没有权限&#xff0c;下面的人不听话 5.项目章程的内容不完整 制定项目管理计划 1.项目…...

mysql4

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 primary key name VARCHAR(50) 否 否 是 否 否 not null glass VARCHAR(50) 否 否 是 否 否 not nullsch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun …...

Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法&#xff0c;一种是基于tensorflow的keras框架&#xff0c;另一种是继承父类自定义class类&#xff0c;本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…...

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中&#xff0c;PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档&#xff0c;用户可以快速找出文档增加、删除和修改的内容&#xff0c;更好地了解文档的演变过程&#xff0c;轻松地管理…...

压敏电阻有哪些原理?|深圳比创达电子EMC

压敏电阻是一种金属氧化物陶瓷半导体电阻器。它以氧化锌(ZnO)为基料&#xff0c;加入多种(一般5&#xff5e;10种)其它添加剂&#xff0c;经压制成坯体&#xff0c;高温烧结&#xff0c;成为具有晶界特性的多晶半导体陶瓷组件。氧化锌压敏电阻器的微观结构如下图1所示。 氧化锌…...

【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …...

C51--PWN-舵机控制

PWM开发sg90舵机 1、简介 PWM&#xff08;pulse width modulation&#xff09;是脉冲宽度调制缩写。 通过对一系列脉冲的宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码&#xff0c;通过调节占空比的变化来…...

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…...

【k8s】kubeadm安装k8s集群

一、环境部署 master192.168.88.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.88.30docker、kubeadm、kubelet、kubectl、flannelhub.lp.com192.168.88.40 docker、docker-compose harbor-offli…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...