C语言概率统计(贝叶斯定理、最大似然估计)的完整实例
创作时间:
2025-03-25 00:43:56
作者:
@小白创作中心
C语言概率统计(贝叶斯定理、最大似然估计)的完整实例
引用
CSDN
1.
https://m.blog.csdn.net/chenby186119/article/details/145799591
本文通过一个完整的C语言程序,演示了贝叶斯定理和最大似然估计(MLE)的基本应用。通过一个医疗测试场景,详细解释了如何使用贝叶斯定理计算后验概率,以及如何使用MLE估计正态分布的参数。
示例场景
我们假设有一个医疗测试用于检测某种疾病:
- 该疾病在总体人群中的先验概率为1%(即P(D) = 0.01)。
- 测试对患病者的敏感度(True Positive Rate)为90%(即P(T|D) = 0.9)。
- 测试对健康者的特异度(True Negative Rate)为80%(即P(
T|D) = 0.8)。 - 目标:在测试结果为阳性(T)时,计算患者实际上患病的概率(后验概率P(D|T))。
此外,我们还基于一个样本数据集来估计某个分布参数,使用最大似然估计(MLE)方法。
实现功能
- 贝叶斯定理计算(计算后验概率P(D|T))。
- 最大似然估计(MLE)(估计正态分布均值μ)。
完整C代码
#include <stdio.h>
#include <math.h>
// 贝叶斯定理计算后验概率 P(D|T)
double bayes_theorem(double prior, double sensitivity, double specificity) {
double false_positive_rate = 1.0 - specificity; // P(T|~D)
double denominator = (sensitivity * prior) + (false_positive_rate * (1.0 - prior));
return (sensitivity * prior) / denominator;
}
// 计算均值(最大似然估计 MLE 用于正态分布的 μ)
double mle_mean(double data[], int size) {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += data[i];
}
return sum / size;
}
int main() {
// 贝叶斯定理示例
double prior = 0.01; // P(D) 先验概率
double sensitivity = 0.9; // P(T|D) 敏感度
double specificity = 0.8; // P(~T|~D) 特异度
double posterior = bayes_theorem(prior, sensitivity, specificity);
printf("在测试阳性时,患者患病的后验概率 P(D|T) = %.5f\n", posterior);
// 最大似然估计(MLE)示例
double sample_data[] = {5.0, 6.2, 4.8, 5.6, 5.1, 6.0, 5.9, 5.5}; // 假设从正态分布抽样
int sample_size = sizeof(sample_data) / sizeof(sample_data[0]);
double estimated_mean = mle_mean(sample_data, sample_size);
printf("基于样本数据的 MLE 估计的均值 μ = %.2f\n", estimated_mean);
return 0;
}
代码解析
- 贝叶斯定理部分
- 计算测试阳性时患病的后验概率:
- 其中:
- 最大似然估计(MLE)部分
- 对于正态分布,均值的MLE估计为:
- 代码中,我们计算样本均值作为MLE估计。
示例输出
在测试阳性时,患者患病的后验概率 P(D|T) = 0.04348
基于样本数据的 MLE 估计的均值 μ = 5.64
解释:
- 贝叶斯后验概率P(D∣T)P(D|T)P(D∣T)≈4.35%,说明即使测试阳性,患者实际患病的概率仍然较低(因为总体患病率较低)。
- 最大似然估计的均值≈5.64,基于样本数据估计正态分布的参数。
总结
- 该C语言程序演示了如何使用贝叶斯定理来计算后验概率。
- 代码还展示了最大似然估计(MLE)来估计正态分布的均值。
- 这些概念在医学诊断、机器学习、数据科学中广泛应用。
你可以修改测试参数或样本数据来观察不同结果!🚀
扩展功能
我们可以进一步扩展这个示例,增加以下功能:
- 计算最大似然估计(MLE)的方差参数
- 目前我们只估计了正态分布的均值μ,现在我们可以计算方差σ²。
- MLE估计的方差公式:
- 增加用户输入数据功能
- 允许用户输入一组数据点,计算其均值和方差。
- 计算最大后验估计(MAP)
- 在贝叶斯估计中,最大似然估计(MLE)可以扩展到最大后验估计(MAP):
- 在正态分布参数估计中,如果我们有先验信息(如μ的一个正态分布先验),我们可以计算MAP估计。
扩展C代码
#include <stdio.h>
#include <math.h>
// 贝叶斯定理计算后验概率 P(D|T)
double bayes_theorem(double prior, double sensitivity, double specificity) {
double false_positive_rate = 1.0 - specificity; // P(T|~D)
double denominator = (sensitivity * prior) + (false_positive_rate * (1.0 - prior));
return (sensitivity * prior) / denominator;
}
// 计算均值(最大似然估计 MLE 用于正态分布的 μ)
double mle_mean(double data[], int size) {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += data[i];
}
return sum / size;
}
// 计算方差(最大似然估计 MLE 用于正态分布的 σ²)
double mle_variance(double data[], int size, double mean) {
double sum = 0.0;
for (int i = 0; i < size; i++) {
sum += (data[i] - mean) * (data[i] - mean);
}
return sum / size;
}
// 计算最大后验估计(MAP)的均值
double map_mean(double mle_mean, double prior_mean, double prior_variance, double sample_variance, int sample_size) {
return (sample_variance * prior_mean + prior_variance * mle_mean) / (prior_variance + sample_size * sample_variance);
}
int main() {
// 贝叶斯定理示例
double prior = 0.01; // P(D) 先验概率
double sensitivity = 0.9; // P(T|D) 敏感度
double specificity = 0.8; // P(~T|~D) 特异度
double posterior = bayes_theorem(prior, sensitivity, specificity);
printf("在测试阳性时,患者患病的后验概率 P(D|T) = %.5f\n", posterior);
// 用户输入样本数据
int sample_size;
printf("\n请输入样本数量: ");
scanf("%d", &sample_size);
double sample_data[sample_size];
printf("请输入 %d 个数据点:\n", sample_size);
for (int i = 0; i < sample_size; i++) {
scanf("%lf", &sample_data[i]);
}
// 计算 MLE 均值和方差
double estimated_mean = mle_mean(sample_data, sample_size);
double estimated_variance = mle_variance(sample_data, sample_size, estimated_mean);
printf("\n基于样本数据的 MLE 估计:\n");
printf("均值 μ = %.5f\n", estimated_mean);
printf("方差 σ² = %.5f\n", estimated_variance);
// 假设我们有一个先验均值和先验方差(用于 MAP 估计)
double prior_mean = 5.0; // 先验均值
double prior_variance = 1.0; // 先验方差
double map_estimated_mean = map_mean(estimated_mean, prior_mean, prior_variance, estimated_variance, sample_size);
printf("\n基于样本数据的 MAP 估计:\n");
printf("MAP 估计的均值 μ = %.5f\n", map_estimated_mean);
return 0;
}
新增功能解析
- MLE估计方差
- 计算样本数据的方差(最大似然估计)。
- 用户输入数据
- 让用户输入样本数据,而不是使用固定数据。
- 最大后验估计(MAP)
- 结合先验均值和样本均值计算更好的估计值。
示例运行
用户输入:
请输入样本数量: 5
请输入 5 个数据点:
5.1 5.3 5.2 5.4 5.6
程序输出:
在测试阳性时,患者患病的后验概率 P(D|T) = 0.04348
基于样本数据的 MLE 估计:
均值 μ = 5.32000
方差 σ² = 0.03040
基于样本数据的 MAP 估计:
MAP 估计的均值 μ = 5.21388
总结
- MLE方法估计正态分布的均值和方差。
- 贝叶斯定理计算后验概率P(D|T)。
- MAP估计结合先验信息,提供更鲁棒的参数估计。
你可以修改数据或先验信息,观察不同结果!
热门推荐
肾囊肿与肾积水:影像学检查下的区别与诊断要点
微调真的能让LLM学到新东西吗:引入新知识可能让模型产生更多的幻觉
北京养老助残卡的各种补贴怎么申领?
远程管理虚拟机:如何在ESXi上快速搭建Ubuntu虚拟机并进行远程管理
基于机器视觉的建筑工地钢筋粗细自动检测与识别系统
企业利润分享方案落地指南:从部门独立核算到数字化薪酬激励
阿伦尼乌斯公式与速率方程解读
应收利息属于哪个会计科目?附账务处理
数字化转型:畜牧产业的现代化引擎
卫生巾选购指南:三种类型需谨慎选择
阿昔替尼用药指南:药物相互作用与印度仿制药上市信息
揭秘阴阳师清姬:毒火双修的蛇蝎美人,爱恨交织的传奇式神
太阳的吸收光谱
二级建造师的执业规模标准是什么
《镜双城》结局是什么?镜双城是悲剧吗
如何收集浙江建设工程施工合同纠纷的证据?
Win10电脑怎么传输文件到另一台电脑?电脑文件迁移指南
阿托品注射液主治什么
劳动关系解除原因及法律规定探讨
解决U盘插入电脑不显示问题的有效方法与步骤总结
李白《宣州谢朓楼饯别校书叔云》诗词赏析
资源的种类有哪些?这些资源在经济发展中起到怎样的作用?
为什么现在的电机都是8级48槽呢?来聊聊极槽配合的那些事儿
外贸人必看!俄罗斯外贸收款方式2024最新版来啦!
科幻巨著《银河帝国》剖析:从星际殖民的壮阔图景到未来启示
辣椒炒肉成流量密码!为啥这道家常菜有如此大“杀伤力”?
金鱼缸摆放风水:位置禁忌与家居应用详解
五行缺木多水怎么办
解密圆的神奇规则:四点共圆的判定方法
解密圆的神奇规则:四点共圆的判定方法