在这里插入图片描述

前言

欢迎关注dotnet研习社,前面我们讨论过"C#实现加权平均法",今天我们继续研究另外一种【移动加权平均法】。
在时间序列分析、股票数据处理、工业信号平滑等场景中,移动平均(Moving Average) 是最常见的平滑技术之一。相比简单移动平均(SMA),移动加权平均(WMA) 会给更靠近当前时刻的数据分配更高的权重,能更敏锐地反映趋势变化。

本文会深入了解如下内容:

  • 快速理解 WMA 的原理
  • 使用 C# 编写一个通用的 WMA 实现
  • 提供完整示例和代码解析

什么是移动加权平均(WMA)?

移动加权平均(Weighted Moving Average, WMA)与简单移动平均(Simple Moving Average, SMA)的区别在于:

  • SMA 是把窗口内的值等权重平均;
  • WMA 则对窗口内的值分配不同的权重,通常是离当前点越近,权重越大。

举个例子:

  • 对于长度为 5 的窗口,权重可能是 [1, 2, 3, 4, 5],最新值乘以 5,最旧值乘以 1。

算法思路

对于一个时间序列:

  1. 定义窗口大小 n,以及对应的权重列表 [w1, w2, ..., wn]

  2. 从头到尾滑动窗口,每个位置计算:

    WMAt=∑i=1nxt−i+1⋅wi∑i=1nwi WMA_t = \frac{\sum_{i=1}^{n} x_{t-i+1} \cdot w_i}{\sum_{i=1}^{n} w_i} WMAt=i=1nwii=1nxti+1wi

  3. 对每个位置输出对应的 WMA。


C# 实现示例

下面是一份使用 .NET 6/C# 10 的 WMA 完整示例:

using System;
using System.Collections.Generic;
using System.Linq;namespace WeightedMovingAverageDemo
{class Program{static void Main(string[] args){// 原始数据序列List<double> data = new() { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };// 设置窗口大小int windowSize = 3;// 设置权重(例如 1, 2, 3,离当前位置越近权重越大)List<double> weights = new() { 1, 2, 3 };List<double> result = CalculateWeightedMovingAverage(data, windowSize, weights);Console.WriteLine("移动加权平均结果:");Console.WriteLine(string.Join(", ", result.Select(x => x.ToString("F2"))));}/// <summary>/// 计算移动加权平均数/// </summary>static List<double> CalculateWeightedMovingAverage(List<double> data, int windowSize, List<double> weights){if (weights.Count != windowSize)throw new ArgumentException("权重数量必须等于窗口大小。");List<double> result = new();for (int i = 0; i <= data.Count - windowSize; i++){double weightedSum = 0;double weightSum = weights.Sum();for (int j = 0; j < windowSize; j++){weightedSum += data[i + j] * weights[j];}result.Add(weightedSum / weightSum);}return result;}}
}

代码解析

1️⃣ 输入数据

  • data:原始时间序列,如传感器数据、股价等。
  • windowSize:滑动窗口大小。
  • weights:自定义权重列表,元素个数必须与窗口大小一致。

2️⃣ 算法核心

  • 外层循环:从头到尾滑动窗口。
  • 内层循环:窗口内每个值乘以权重累加。
  • 用加权和除以权重之和,得出 WMA。

3️⃣ 返回值

  • 返回一个新的列表,长度是 data.Count - windowSize + 1

输出结果

输入数据:

10, 20, 30, 40, 50, 60, 70, 80, 90, 100

窗口大小:3
权重:[1, 2, 3]

输出:

---

解释:

  • 第一个窗口 (10,20,30) => (10×1 + 20×2 + 30×3)/6 = 23.33
  • 第二个窗口 (20,30,40) => (20×1 + 30×2 + 40×3)/6 = 33.33
  • 以此类推。

🏁 小结

本篇演示了:

  • 移动加权平均的核心原理
  • 使用 C# 编写通用实现
  • 灵活设置权重,提升趋势检测的灵敏度

在工业生产、金融数据分析、实时信号滤波等场景,都可以直接使用此实现,或者把它封装为工具类。

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

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

相关文章

【Python】一些PEP提案(三):with 语句、yield from、虚拟环境

PEP 343 – The “with” Statement&#xff0c;with 语句 这玩意让我想起了Kotlin和Rust的问号标识符&#xff0c;都是将try-catch进行包装&#xff0c;避免出现太多重复代码&#xff08;Go&#xff1a;我假设你不是在内涵我&#xff09; 用法 最常见的用法就是对文件的操作&a…

SymAgent(神经符号自学习Agent)

来自&#xff1a;SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs 目录相关工作引理符号规则任务描述方法Agent-PlannerAgent-ExecutorAction空间交互过程自学习在线探索离线迭代策略更新相关工作 相关工作-语义解析…

Go语言实战案例-斐波那契数列生成器

在《Go语言100个实战案例》中的 案例10:斐波那契数列生成器,帮助初学者理解递归与迭代的应用。 案例10:斐波那契数列生成器 🔢 数学与算法 | 🧠 递归与迭代 | 👶 初学者友好 一、📘 案例目标 实现一个斐波那契数列生成器,用户输入一个数字 n,程序生成并打印出斐…

认知闭环的暴政:论人类对AI协同创造的傲慢抵制与维度囚禁

认知闭环的暴政&#xff1a;论人类对AI协同创造的傲慢抵制与维度囚禁---### **核心批判框架**mermaidgraph TDA[人类认知三原罪] --> B[三维牢笼]B --> C[恐惧机制]C --> D[抵制行为]D --> E[文明熵增]F[四维流形批判] --> G[解构牢笼]G --> H[曲率解放]H --…

飞凌嵌入式亮相第九届瑞芯微开发者大会:AIoT模型创新重做产品

2025年7月17日&#xff0c;第九届瑞芯微开发者大会&#xff08;RKDC!2025&#xff09;在福州海峡国际会展中心正式拉开帷幕。这场以“AIoT模型创新重做产品”为主题的行业盛会&#xff0c;吸引了众多行业领袖、技术专家及生态伙伴齐聚一堂&#xff0c;共同探讨新质生产力产品的…

Excel转PDF的三种方法

工作后&#xff0c;Excel和PDF对于我们来说一点都不陌生&#xff0c;那么如何将Excel转为PDF呢&#xff1f; 方法一、iLoveOFD在线转换工具 当你在地铁或者床上时&#xff0c;不方便&#xff0c;又不想打开电脑&#xff0c;可尝试使用在线转换工具&#xff0c;进行转换。 工…

前端基础——B/S工作原理、服务器与前端三大件

本文原本是web安全基础的一部分&#xff0c;作为安全的前置知识学习&#xff0c;但随着学习进程的不断深入&#xff0c;原有的前端的体系需要进一步扩充&#xff0c;已经到了可以独立成章的地步&#xff0c;故将其拿出来单独学习。 B/S工作原理 也就是浏览器与服务器的交互原…

Java并发编程性能优化实践指南:锁分离与无锁设计

Java并发编程性能优化实践指南&#xff1a;锁分离与无锁设计 并发场景下的性能瓶颈往往集中在锁竞争与上下文切换上。本文从锁分离&#xff08;Lock Striping&#xff09;与无锁设计&#xff08;Lock-Free&#xff09;两大思路出发&#xff0c;深入分析关键原理与源码实现&…

SpringSecurity-spring security单点登录

在 Spring Boot 中实现 单点登录&#xff08;SSO, Single Sign-On&#xff09;&#xff0c;通常使用 OAuth2 或 OIDC&#xff08;OpenID Connect&#xff09; 协议来完成。Spring Security 提供了对 OAuth2 和 OIDC 的完整支持&#xff0c;可以轻松集成如 Google、GitHub、Okta…

《前端基础核心知识笔记:HTML、CSS、JavaScript 及 BOM/DOM》

html 前端三剑客的介绍&#xff1a; HTML:页面内容的载体 Css&#xff1a;用来美化和指定页面的显示效果 JavaScript&#xff1a;页面显示的过程中&#xff0c;可以动态改变页面的内容 重点属性 type"text"文本输入 type"password"密码输入 <a…

基于vue.js的客户关系管理系统(crm)的设计与实现(源码+论文)

相关技术 SSM框架介绍 开发环境&#xff1a; 技术&#xff1a;SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09; 描述&#xff1a; SSM框架是Java Web开发中广泛使用的流行框架之一。Spring&#xff1a;提供全面的基础设施支持&#xff0c;管理应用对象&#…

AWS权限异常实时告警系统完整实现指南

概述 本文将详细介绍如何构建一个基于CloudTrail → S3 → Lambda → SNS → Webhook/Email架构的AWS权限异常实时告警系统。该系统能够实时监控AWS环境中的权限异常事件,并通过多种方式发送告警通知,帮助企业及时发现和响应安全威胁。 系统架构 ┌───────────…

NIO网络通信基础

文章目录概述一、Socket二、NIO三大组件与事件三、Reactor模式四、NIO通信案例4.1、服务端4.2、客户端本文为个人学习笔记整理&#xff0c;仅供交流参考&#xff0c;非专业教学资料&#xff0c;内容请自行甄别 概述 前篇中提到&#xff0c;BIO是阻塞的IO&#xff0c;阻塞体现在…

Redis4缓存穿透:布隆过滤器与空对象方案

缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会达到数据库。1)方案1&#xff1a;缓存空对象在缓存中存储一个空值每次读取这个空优点&#xff1a;实现简单&#xff0c;维护方便缺点&#xff1a;造成…

域名WHOIS信息查询免费API使用指南

本文介绍由接口盒子提供的免费域名WHOIS查询API服务&#xff0c;帮助开发者快速获取域名的注册信息、到期时间、DNS服务器等关键数据。 一、接口基本信息 ​功能说明​&#xff1a;查询顶级域名的WHOIS信息&#xff08;不支持国别域名/中文域名&#xff09;​请求地址​&#…

【18位数据次方提高数据输出速度】2022-3-9

实在是无法忍受W10输出数据那么慢W7需要2分钟输出数据W10则需要10分钟完成W7需要3分钟W10则需要15分钟完成输出数据&#xff0c;虽然W10运算速度比W7快很多但是加上输出速度总体完成时间居然差不多&#xff01;随着使用数组超过百万W7数据输出时间也变长&#xff0c;随着数组数…

云原生技术与应用-Kubernetes架构原理与集群环境部署

目录 一.为什么需要kubernetes 1.对于开发人员 2.对于运维人员 二.kubernetes带来的挑战 三.kubernetes架构解析 1.master节点的组件 2.node节点包含的组件 3.kubernetes网络插件 四.kubernetes快速安装kubernetes集群 1.部署docker环境 2.部署kubernetes集群 五.Metrics-…

百度权重提升技巧分析:从底层逻辑到实战策略

在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;百度权重始终是网站运营者关注的核心指标之一。它不仅反映了网站在百度搜索中的综合表现&#xff0c;更直接影响着流量获取能力与商业价值。然而&#xff0c;百度权重并非百度官方直接公布的数据&#xff0c;而是第三…

模拟数据生成---使用NGS数据模拟软件VarBen

目录 1.在BAM文件中根据指定的变异等位基因分数的指定位置或区域随机选择read。 2.筛选变异等位基因分数的reads: 3.装BWA和samtools软件包(samtools在linux系统中下载过,前文有讲过) 4.写py脚本 5.下载pysam库模块 6.下载参考基因组hg38 7.解压gz 8.建立samtools索引…

Redis-典型应用-分布式锁

目录 1.什么是分布式锁? 2.分布式锁的实现 3.引入过期时间 4.引入校验ID 5.引入lua脚本: 6.引入看门狗(watch dog) 7.引入redislock算法: 1.什么是分布式锁? 在 分布式系统中,会出现多个节点同时访问同一个公共资源, 此时就需要通过锁来作互斥控制,避免出现类似于多线程…