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

news2024/11/20 20:26:49

代码与文件请从这里下载: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 norm


class Datasets:
    # 一个简单的数据加载器
    def __init__(self, datapath, t):
        self.datapath = datapath
        self.data = np.loadtxt(self.datapath)  # 二维数组
        self.height = self.data[:, 0]
        self.weight = self.data[:, 1]
        self.length = len(self.data)
        self.t = t

    def __len__(self):
        return self.length

    def mean(self, data):
        # 均值,可以使用np.mean替换
        total = 0
        for x in data:
            total += x
        return total / self.length

    def var(self, data):
        # 方差,可以使用np.var替换
        mean = self.mean(data)
        sq_diff_sum = 0
        for x in data:
            diff = x - mean
            sq_diff_sum += diff ** 2
        return sq_diff_sum / self.length

    def 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.5
    p_female = 1 - p_male

    cost_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 2

    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)

        risk_male = cost_male + cost_false_negative if p_height_given_male * p_male <= p_height_given_female * p_female else cost_female
        risk_female = cost_female + cost_false_positive if p_height_given_male * p_male >= p_height_given_female * p_female else cost_male

        return 1 if risk_male <= risk_female else 2

    if 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 2

    if 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 2

    return 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 = data
        true_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_label

def 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_predictions
    return 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.coloradmin.cn/o/1137695.html

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

相关文章

@AutoConfigurationPackage注解类

包名package org.springframework.boot.autoconfigure 方法 String[] basePackages() 向AutoConfigurationPackages中注册的基本包&#xff0c;使用basePackageClasses作为基于字符串的包的类型安全替代方案 Class<?>[] basePackageClasses() 键入basePackage…

VL10F后台生成发货单时报错:物料 XXXXX 状态被锁定/未激活(不允许发货)

错误原因&#xff1a;物料主数据&#xff1a;销售视图1中&#xff0c;物料的发货状态没有激活。MM02修改物料的发货状态后正常生成单据。

双十一值得买的数码产品、这几款都不容错过

一年一度的双11终于来了&#xff0c;相信很多朋友都打算在此次的双11入手自己想要的产品&#xff0c;作为一个数码爱好者&#xff0c;我也是在此次的双11入手了下面4款数码产品&#xff0c;一起来看看吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 …

WebSocket协议:5分钟从入门到精通

一、内容概览 WebSocket的出现&#xff0c;使得浏览器具备了实时双向通信的能力。本文由浅入深&#xff0c;介绍了WebSocket如何建立连接、交换数据的细节&#xff0c;以及数据帧的格式。此外&#xff0c;还简要介绍了针对WebSocket的安全攻击&#xff0c;以及协议是如何抵御类…

互联网产品说明书指南,附撰写流程与方法

产品说明书&#xff0c;对于普通产品而言&#xff0c;再常见不过。药物、电器、电子产品等产品在正式出售时&#xff0c;往往都会附带一份产品说明书&#xff0c;以此告诉用户这个产品的功能与特性&#xff0c;并指导用户如何来使用这个产品。 产品说明书 那么&#xff0c;对于…

洗衣行业在线预约小程序+前后端完整搭建教程

大家好哇&#xff0c;好久不见&#xff01;今天源码师父来给大家推荐一款洗衣行业在线预约的小程序&#xff0c;带有前后端的完整搭建教程。 目前&#xff0c;人们对生活品质的追求不断提高&#xff0c;但生活节奏却也不断加快。对品质的追求遇到了忙碌的生活节奏&#xff0c;…

天锐绿盾终端安全管理系统

所谓透明&#xff0c;是指对使用者来说是未知的。当使用者在打开或编辑指定文件时&#xff0c;系统将自动对未加密的文件进行加密&#xff0c;对已加密的文件自动解密。文件在硬盘上是密文&#xff0c;在内存中是明文。一旦离开使用环境&#xff0c;由于应用程序无法得到自动解…

web安全-原发抗抵赖

原发抗抵赖 原发抗抵赖也称不可否认性&#xff0c;主要表现以下两种形式&#xff1a; 数据发送者无法否认其发送数据的事实。例如&#xff0c;A向B发信&#xff0c;事后&#xff0c;A不能否认该信是其发送的。数据接收者事后无法否认其收到过这些数据。例如&#xff0c;A向B发…

动态规划(记忆化搜索)

AcWing 901. 滑雪 给定一个 R行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能…

git更新代码时显示“auto-detection of host provider took too long“移除方法

git更新代码时显示"auto-detection of host provider took too long"移除方法 问题描述 在windows操作系统&#xff0c;未连接互连网电脑&#xff0c;更新内网代码库时显示“auto-detection of host provider took too long (>2000ms)”&#xff0c;如下图所示。…

idea 中配置 maven

前文叙述&#xff1a; 配置 maven 一共要设置两个地方&#xff1a;1、为当前项目设置2、为新项目设置maven 的下载和安装可参考我之前写过的文章&#xff0c;具体的配置文章中也都有讲解。1、为当前项目进行 maven 配置 配置 VM Options: -DarchetypeCataloginternal2、为新项…

设将n(n>1)个整数存放在一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P(0<P<n)个位置

设将n&#xff08;n>1&#xff09;个整数存放在一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移P&#xff08;0<P<n&#xff09;个位置。即将R中保存的数据由&#xff08;x0,x1…,xn-1&#xff09;变为&#xff08;xp,xp1…x0,x…

vscode下ssh免密登录linux服务器

vscode使用ssh免密登录linux 1、安装SSH插件2、生成密钥3、linux安装ssh服务4、linux下配置公钥5、vscode远程登录 注&#xff1a;测试环境为window10Ubuntu1804/Ubuntu2204 1、安装SSH插件 扩展->搜索SSH->点击install进行安装&#xff0c;如下图所示&#xff1a; 2、…

【Linux】安装部署Redis

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis安装部署linux 1.gcc编译环境2.c库环境3.…

记src-Juniper

一、hunter搜索web.title”Juniper Web Device Manager”&#xff0c;查找到香港的一处资产。 二、访问相关网页&#xff0c;界面就是Juniper登录界面。 三、根据编号为CVE-2023-36845的利用方法&#xff0c;抓包&#xff0c;修改提交方式&#xff0c;成功读取到文件。 原始包…

09. 主频和时钟配置

09. 主频和时钟配置 硬件原理图分析7路PLL时钟源时钟树简介内核时钟系统主频设置CCM_CACRRCCSRCCM_ANALOG_PLL_ARMn代码实例 PFD时钟设置PLL2的4路设置PLL3的4路设置代码实例 AHB、IPG和PERCLK根时钟设置AHB_CLK_ROOT 和 IPG_CLK_ROOTPERCLK_CLK_ROOTCCM_CBCDRCCM_CBCMRCCM_CSC…

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

创建并启动华为HarmonyOS本地与远程模拟器及远程真机

1.打开设备管理器 2.选择要添加的手机设备,然后点击安装 3.正在下载华为手机模拟器 4.下载完成 5.创建新模拟器 下载系统镜像 点击下一步,创建模拟器 创建成功 启动模拟器 华为模拟器启动成功 6.登陆华为账号并使用远程模拟器 7.使用远程真机

论环境如何影响我们的一切

本心、输入输出、结果 文章目录 论环境如何影响我们的一切前言相关书籍极大影响我们的潜在客观环境环境带给我们的影响是如何进行具象化的大的框架体系是什么弘扬爱国精神论环境如何影响我们的一切 编辑:简简单单 Online zuozuo 地址:https://blog.csdn.net/qq_15071263 如果…

每日一练——返回链表的中间结点

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…