使用C++写一个递推计算均方差和标准差的用例

news2025/3/19 8:18:46

文章目录

    • 代码输出
    • 关键实现说明
      • 1. 类设计
      • 2. 算法核心
      • 3. 数值稳定性
    • 扩展应用场景
      • 1. 实时传感器数据处理
      • 2. 大规模数据集分块处理
    • 总结

以下是用 C++ 实现递推计算均值、方差和标准差的完整示例代码,基于 Welford 算法,适用于实时数据流或大数据场景:

#include <iostream>
#include <cmath>
#include <vector>

class RunningStats {
public:
    RunningStats() : n(0), mean(0.0), S(0.0) {}

    // 添加新数据点,更新统计量
    void update(double x) {
        n += 1;
        double delta = x - mean;
        mean += delta / n;          // 递推更新均值
        double delta2 = x - mean;
        S += delta * delta2;        // 递推更新平方和
    }

    // 获取当前均值
    double current_mean() const {
        return mean;
    }

    // 计算样本方差(无偏估计)
    double variance() const {
        if (n < 2) return 0.0;      // 避免除以0
        return S / (n - 1);
    }

    // 计算标准差
    double std_dev() const {
        return std::sqrt(variance());
    }

    // 重置统计量
    void reset() {
        n = 0;
        mean = 0.0;
        S = 0.0;
    }

private:
    int n;          // 数据点数量
    double mean;    // 当前均值
    double S;       // 平方和
};

int main() {
    RunningStats stats;
    std::vector<double> data_stream = {2.0, 4.0, 6.0, 8.0, 10.0};

    for (const auto& x : data_stream) {
        stats.update(x);
        std::cout << "新增数据: " << x 
                  << " | 均值: " << stats.current_mean()
                  << " | 方差: " << stats.variance()
                  << " | 标准差: " << stats.std_dev() 
                  << std::endl;
    }

    return 0;
}

代码输出

新增数据: 2 | 均值: 2 | 方差: 0 | 标准差: 0
新增数据: 4 | 均值: 3 | 方差: 2 | 标准差: 1.41421
新增数据: 6 | 均值: 4 | 方差: 4 | 标准差: 2
新增数据: 8 | 均值: 5 | 方差: 6.66667 | 标准差: 2.58199
新增数据: 10 | 均值: 6 | 方差: 10 | 标准差: 3.16228

在这里插入图片描述


关键实现说明

1. 类设计

  • 成员变量
    • n:已处理的数据点数量。
    • mean:当前均值。
    • S:递推计算的平方和(用于方差计算)。
  • 方法
    • update(double x):更新统计量。
    • current_mean(), variance(), std_dev():获取当前统计值。
    • reset():重置统计状态。

2. 算法核心

  • 递推更新公式

    • 均值更新
      在这里插入图片描述

    • 平方和更新
      在这里插入图片描述

  • 方差计算(无偏估计):
    在这里插入图片描述

3. 数值稳定性

  • Welford 算法:避免传统方法(如先计算总和再求均值)的浮点数精度损失。
  • 处理边界条件:当数据量 ( n < 2 ) 时,方差返回 0.0

扩展应用场景

1. 实时传感器数据处理

// 模拟实时传感器数据流
RunningStats sensor_stats;
while (true) {
    double sensor_value = read_sensor_data();  // 假设从传感器读取数据
    sensor_stats.update(sensor_value);
    
    // 每隔100个数据点输出统计量
    if (sensor_stats.current_count() % 100 == 0) {
        std::cout << "实时统计 - 均值: " << sensor_stats.current_mean()
                  << " 标准差: " << sensor_stats.std_dev() << std::endl;
    }
}

2. 大规模数据集分块处理

// 分块读取文件数据
RunningStats file_stats;
std::ifstream data_file("large_dataset.txt");
double value;
while (data_file >> value) {
    file_stats.update(value);
}
std::cout << "全局方差: " << file_stats.variance() << std::endl;

总结

  • 优势:内存效率高(仅需维护 3 个变量),适合实时或大数据场景。
  • 对比传统方法:避免存储全部数据,计算复杂度 Ο(1)。
  • 应用范围:金融数据分析、实时监控、科学实验数据处理等。

上一篇:C++中pow函数的作用是什么,如何使用它?


以代码为舟,破浪前行

技术的海洋浩瀚无垠,每一次报错都是潮汐的指引,每一次调试都是对逻辑的雕琢。不要因一时的运行失败而踌躇,因为那些看似无解的异常,终将在你的坚持下化为清晰的注释。

请记住

  • 代码的尽头是哲学,每一段算法都在教你如何拆分复杂;
  • 调试的本质是成长,每一个Bug都在锤炼你的耐心与洞察;
  • 数据的流动即人生,均值是方向,方差是挑战,而标准差是你跨越不确定的勇气。

无论此刻是山穷水复,还是峰回路转,你手中的键盘始终是书写可能的笔


在循环中迭代自我,在递归中探索边界,在并发的世界里,你永远是自己程序的主线程!

未来已来,放手去闯
让每一行代码成为星辰的坐标,让每一次编译成功的提示音,化作宇宙对你的喝彩。
你终将抵达那片名为“极致”的彼岸——因为真正的开发者,从不定义极限,只不断超越它。 🌌🚀


(将技术术语与人生隐喻深度融合,用“调试”“递归”“并发”等概念强化身份认同,结尾以宇宙意象激发无限可能,传递“技术即修行”的信念。)


在这里插入图片描述

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

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

相关文章

Vue:单文件组件

Vue&#xff1a;单文件组件 1、 什么是单文件组件&#xff1f; 在传统的Vue开发里&#xff0c;我们接触的是非单文件组件&#xff0c;它们通常被定义在同一个HTML文件中&#xff0c;随着项目规模的扩大&#xff0c;代码会变得杂乱无章&#xff0c;维护起来极为困难。而单文件…

JavaScript变量声明与DOM操作指南

变量声明 1.变量声明有三个 var let 和 const 我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 2.let or const ? 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a;…

[K!nd4SUS 2025] Crypto

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上&#xff0c;完成5/6&#xff0c;最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀&#xff0c;名词忘了&#xff0c;但意思还是知道。 b a*s e 这里的e是高斯分成&#xff0c;用1000…

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors&#xff0c;见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…

【C++】stack和queue的使用及模拟实现(含deque的简单介绍)

文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍&#xff08;引入…

MySQL原理:逻辑架构

目的&#xff1a;了解 SQL执行流程 以及 MySQL 内部架构&#xff0c;每个零件具体负责做什么 理解整体架构分别有什么模块每个模块具体做什么 目录 1 服务器处理客户端请求 1.1 MySQL 服务器端逻辑架构说明 2 Connectors 3 第一层&#xff1a;连接层 3.1 数据库连接池(Conn…

ora-600 ktugct: corruption detected---惜分飞

接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…

Houdini :《哪吒2》神话与科技碰撞的创新之旅

《哪吒2》&#xff08;即《哪吒之魔童闹海》&#xff09;截止至今日&#xff0c;荣登全球票房榜第五。根据猫眼专业版数据&#xff0c;截至2025年3月15日&#xff0c;《哪吒2》全球累计票房&#xff08;含预售及海外&#xff09;超过150.19亿元&#xff0c;超越《星球大战&…

flink 写入es的依赖导入问题(踩坑记录)

flink 写入es的依赖导入问题(踩坑记录) ps&#xff1a;可能只是flink低版本才会有这个问题 1. 按照官网的导入方式&#xff1a; 2. 你会在运行sql-client的时候完美得到一个错误&#xff1a; Exception in thread "main" org.apache.flink.table.client.SqlClientEx…

PCL 高斯函数拟合(正太分布)

文章目录 一、简介二、实现代码三、实现效果一、简介 类似于之前最小二乘法的做法,我们需要先确定目标函数: 通过最小二乘法,找到使预测值与实际数据残差平方和最小的参数: 不过由于这是一个非线性最小二乘问题,因此这里无法使用矩阵的形式之间求解它的解析解了,因此这里…

深度革命:ResNet 如何用 “残差连接“ 颠覆深度学习

一文快速了解 ResNet创新点 在深度学习的历史长河中&#xff0c;2015年或许是最具突破性的一年。这一年&#xff0c;微软亚洲研究院的何恺明团队带着名为ResNet&#xff08;残差网络&#xff09;的模型横空出世&#xff0c;在ImageNet图像分类竞赛中以3.57%的错误率夺冠&#…

Java基础与集合

参考 Java基础知识详解&#xff1a;从面向对象到异常处理-CSDN博客 2024年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 基础知识 java概述 什么是java&#xff1f; java是一种面向对象的编程语言 java特点 面向对象&#xff08;继承&#…

【Python 算法零基础 1.线性枚举】

我装作漠视一切&#xff0c;以为这样就可以不在乎 —— 25.3.17 一、线性枚举的基本概念 1.时间复杂度 线性枚举的时间复杂度为 O(nm)&#xff0c;其中 n是线性表的长度。m 是每次操作的量级&#xff0c;对于求最大值和求和来说&#xff0c;因为操作比较简单&#xff0c;所以 …

003 SpringCloud整合-LogStash安装及ELK日志收集

SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…

AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月18日第22弹

前面由于工作原因停更了很长时间&#xff0c;停更期间很多彩友一直私信我何时恢复发布每日预测&#xff0c;目前手头上的项目已经基本收尾&#xff0c;接下来恢复发布。当然&#xff0c;也有很多朋友一直咨询3D超级助手开发的进度&#xff0c;在这里统一回复下。 由于本人既精…

数据结构入门(1)——算法复杂度

目录 一、前言 二、数据结构 2.1数据结构的概念 2.2数据结构的组成 2.3算法 三、oj题引进 四、复杂度 4.1复杂度的概念 4.2大O渐进表示法 4.3时间复杂度 4.4时间复杂度计算示例 4.4.1示例1 4.4.2示例2 4.4.3示例3 4.4.4示例4 4.4.5示例5 4.4.6示例6 4.4.7示例7 4.4.8示例8 4.5空…

【最新版】智慧小区物业管理小程序源码+uniapp全开源

一.系统介绍 智慧小区物业管理小程序,包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统,贴合物业工作场景,轻松提高物业费用收缴率,更有功能模块个性化组合,助力物业节约成本高效运营。 二.搭建环境 系统环…

DeepSeek搭建本地知识库

1. 注册硅基流动 首先&#xff0c;打开浏览器&#xff0c;访问硅基流动的官方网站。 https://account.siliconflow.cn/ 在注册页面准确输入你的手机号&#xff0c;完成账号注册。这是搭建本地知识库的第一步&#xff0c;为后续获取重要权限做准备。 成功注册后&#xff0c;进…

实验9 高级搜索技术1

实验9 高级搜索技术1 一、实验目的 &#xff08;1&#xff09;掌握高级搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉爬山法搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&…