LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

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

admin
2025年7月17日 22:12 本文熱度 322

前面我們討論過"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. 1. 定義窗口大小 n,以及對應的權重列表 [w1, w2, ..., wn]
  2. 2. 從頭到尾滑動窗口,每個位置計算:
  3. 3. 對每個位置輸出對應的 WMA。

C# 實現示例

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

using System;
using System.Collections.Generic;
using System.Linq;

namespaceWeightedMovingAverageDemo
{
    classProgram
    {
        static void Main(string[] args)
        {
            // 原始數據序列
            List<double> data = new() { 102030405060708090100 };

            // 設置窗口大小
            int windowSize = 3;

            // 設置權重(例如 1, 2, 3,離當前位置越近權重越大)
            List<double> weights = new() { 123 };

            List<double> result = CalculateWeightedMovingAverage(data, windowSize, weights);

            Console.WriteLine("移動加權平均結果:");
            Console.WriteLine(string.Join(", ", result.Select(x => x.ToString("F2"))));
        }

        /// <summary>
        /// 計算移動加權平均數
        /// </summary>
        static List<doubleCalculateWeightedMovingAverage(List<double> data, int windowSize, List<double> weights)
        {
            if (weights.Count != windowSize)
                thrownew 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# 編寫通用實現
  • ? 靈活設置權重,提升趨勢檢測的靈敏度

在工業生產、金融數據分析、實時信號濾波等場景,都可以直接使用此實現,或者把它封裝為工具類。


閱讀原文:原文鏈接


該文章在 2025/7/18 10:46:16 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
色福利网在线观看 | 亚洲乱码小电影AV | 亚洲日本乱码一区二区三区 | 日韩美女少妇免费观看 | 亚洲一区二区制服在线 | 在线一区二区网站永久不卡 |