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.mzph.cn/news/125668.shtml

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

相关文章

控梦术(一)之什么是清明梦

控梦术 首先&#xff0c;问大家一个问题。在梦中&#xff0c;你知道自己是在做梦吗&#xff1f;科学数据表明&#xff0c;大约23%的人在过去一个月中&#xff0c;至少有一次在梦中意识到自己正在做梦。科学家把这叫做清醒梦或者叫做清明梦。科学家说&#xff0c;每个人都能学会…

springboot的缓存和redis缓存,入门级别教程

一、springboot&#xff08;如果没有配置&#xff09;默认使用的是jvm缓存 1、Spring框架支持向应用程序透明地添加缓存。抽象的核心是将缓存应用于方法&#xff0c;从而根据缓存中可用的信息减少执行次数。缓存逻辑是透明地应用的&#xff0c;对调用者没有任何干扰。只要使用…

云计算与ai人工智能对高防cdn的发展

高防CDN&#xff08;Content Delivery Network&#xff09;作为网络安全领域的一项关键技术&#xff0c;致力于保护在线内容免受各种网络攻击&#xff0c;包括分布式拒绝服务攻击&#xff08;DDoS&#xff09;等。然而&#xff0c;随着人工智能&#xff08;AI&#xff09;和大数…

C#__委托delegate

委托存储的是函数的引用&#xff08;把某个函数赋值给一个委托类型的变量&#xff0c;这样的话这个变量就可以当成这个函数来进行使用了&#xff09; 委托类型跟整型类型、浮点型类型一样&#xff0c;也是一种类型&#xff0c;是一种存储函数引用的类型 using System.Reflec…

Linux网络基础2 -- 应用层相关

一、协议 引例&#xff1a;编写一个网络版的计算器 1.1 约定方案&#xff1a;“序列化” 和 “反序列化” 方案一&#xff1a;客户端发送形如“11”的字符串&#xff0c;再去解析其中的数字和计算字符&#xff0c;并且设限&#xff08;如数字和运算符之间没有空格; 运算符只…

RIS辅助MIMO广播信道容量

RIS辅助MIMO广播信道容量 摘要RIS辅助的BC容量矩阵形式的泰勒展开学习舒尔补 RIS-Aided Multiple-Input Multiple-Output Broadcast Channel Capacity论文阅读记录 基于泰勒展开求解了上行容量和最差用户的可达速率&#xff0c;学习其中的展开方法。 摘要 Scalable algorithm…

什么是神经网络,它的原理是啥?(1)

参考&#xff1a;https://www.youtube.com/watch?vmlk0rddP3L4&listPLuhqtP7jdD8CftMk831qdE8BlIteSaNzD 视频1&#xff1a; 简单介绍神经网络的基本概念&#xff0c;以及一个训练好的神经网络是怎么使用的 分类算法中&#xff0c;神经网络在训练过程中会学习输入的 pat…

Pmdarima实现单变量时序预测与交叉验证

目录 1. pmdarima实现单变量时间序列预测 2. 时间序列交叉验证 2.1 滚动交叉验证(RollingForecastCV) 2.2 滑窗交叉验证(SildingWindowForecastCV) 1. pmdarima实现单变量时间序列预测 Pmdarima是以statsmodel和autoarima为基础、封装研发出的Python时序分析库、也是现在市…

故障诊断模型 | Maltab实现GRU门控循环单元故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现GRU门控循环单元故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障检测和故障定位…

3ds Max2022安装教程(最新最详细)

目录 一.简介 二.安装步骤 网盘资源见文末 一.简介 3DS Max是由Autodesk公司开发的一款专业三维建模、动画和渲染软件&#xff0c;广泛应用于影视、游戏、建筑和工业设计等领域。 3DS Max的主要特点和功能包括&#xff1a; 三维建模&#xff1a;3DS Max提供了各种强大的建…

如何用思维导图开会

在办公室和会议室使用思维导图会有无数好处。今天我们就聊聊思维导图在开会中的作用&#xff1f; 为什么要在会议中使用思维导图&#xff1f; 思维导图可以帮助我们整理思路。会议通常涉及到复杂的议题和讨论&#xff0c;使用思维导图可以帮助整合和梳理参与者的思路和观点。通…

Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css&#xff08;css.txt&#xff09; 2.3 配置路由 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2…

priority_queue 的模拟实现

priority_queue 的底层结构 我们已经学习过栈和队列了&#xff0c;他们都是用一种容器适配出来的。今天我们要学习的 prority_queue 也是一个容器适配器。在 priority_queue 的使用部分我们已经知道想要适配出 priority_queue&#xff0c;这个底层的容器必须有以下接口&#x…

安装Python环境

Python 安装包下载地址&#xff1a;https://www.python.org/downloads/ 打开该链接&#xff0c;可以看到有两个版本的 Python&#xff0c;分别是 Python 3.x 和 Python 2.x&#xff0c;如下图所示&#xff1a; Python下载页面截图 图 1 Python 下载页面截图&#xff08;包含…

基于单片机设计的防煤气泄漏装置

一、前言 煤气泄漏是一个严重的安全隐患&#xff0c;可能导致火灾、爆炸以及对人体健康的威胁。为了提高家庭和工业环境中煤气泄漏的检测和预防能力&#xff0c;设计了一种基于单片机的防煤气泄漏装置。 单片机选择STC89C52作为主控芯片。为了检测煤气泄漏&#xff0c;采用了…

cocosCreator 调用wxAPI 及后台授权设置、获取用户昵称和头像

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 官方文档&#xff1a; 微信官方文档 - 开放能力 微信 API 小游戏环境 在cocosCreator的3.x版本项目开发中&#xff0c;TypeScript最终会被转换为JavaScript语言。 JavaScript的运行时调用的API…

联发科MT6893(天玑1200)_MTK5G芯片规格参数性能_安卓手机主板方案

联发科天玑1200集成MediaTek 5G调制解调器&#xff0c;通过包含6大维度、72个场景测试的德国莱茵TV Rheinland认证&#xff0c;支持高性能5G连接&#xff0c;带给用户全场景的高品质5G连网体验。 进入5G时代&#xff0c;AI多媒体成为主流应用&#xff0c;天玑1200以强劲的平台…

【高效开发工具系列】你真的会使用Mac吗?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

uniapp实现瀑布流

首先我们要先了解什么是瀑布流&#xff1a; 瀑布流&#xff08;Waterfall Flow&#xff09;是一种常见的网页布局方式&#xff0c;也被称为瀑布式布局或砌砖式布局。它通常用于展示图片、博客文章、商品等多个不同大小和高度的元素。 瀑布流布局的特点是每个元素按照从上到下…

现代的简洁,诠释轻奢的精致!福州中宅装饰,福州装修

轻奢风是一种生活新时尚 优雅、低调、舒适、简单&#xff0c;不断地推陈出新 站在时尚的前沿&#xff0c;引领潮流 中宅装饰集团轻奢风格产品 追求高品质生活细节 以设计精致的空间构造营造出 一种优雅、时尚生活氛围 将低调奢华之美注入现代家居设计中 客厅|The Sitt…