使用 C# 實現移動加權平均(Weighted Moving Average)算法

在這里插入圖片描述

前言

歡迎關注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=1n?wi?i=1n?xt?i+1??wi??

  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.什么是分布式鎖? 在 分布式系統中,會出現多個節點同時訪問同一個公共資源, 此時就需要通過鎖來作互斥控制,避免出現類似于多線程…