簡體   English   中英

“運行”加權平均值

[英]“Running” weighted average

我一直在用Python在列表中添加/刪除元組,並且對加權平均值(而不是列表本身)感興趣。 由於這部分與其他部分相比在計算上非常昂貴,因此我想對其進行優化。 跟蹤加權平均值的最佳方法是什么? 我可以想到兩種方法:

  • 保留列表並在每次訪問/更改列表時計算加權平均值(我當前的方法)
  • 只需跟蹤當前加權平均值和所有權重的總和,並為每個添加/刪除操作更改權重和當前加權平均值

我更喜歡第二種選擇,但是我擔心由於不斷的加/減引起的“浮點錯誤”。 處理此問題的最佳方法是什么?

嘗試以整數進行操作嗎? Python bignums應該為有理數做一個有理的參數(對不起,太晚了,實際上真的很抱歉)。

這實際上取決於您使用多少個術語以及您的加權系數對天氣的影響,您將遇到很多浮點漂移。 您只能得到53位精度,可能不需要那么多精度。

如果您的加權因子小於1,則由於您一直在減少它,因此應該限制錯誤。 假設您的體重為0.6 (太糟糕了,因為您不能用二進制表示)。 0.00110011...表示為0.0011001100110011001101 (在最后一位舍入)。 因此,您在四舍五入過程中引入的任何誤差都會在您再次相乘后減少。 最新術語中的錯誤將占主導地位。

在需要之前不要進行最后的划分。 再次給定0.6作為權重和10個學期,則第一個學期的學期權重將99.2290301275212499.22903012752124 ,最后一個學期的權重將一直降為1( 0.6**-t )。 將新項乘以99.22... ,將其與您的運行總和相加,然后減去尾項,然后除以246.5725753188031( sum([0.6**-x for x in range(0,10)]

如果您確實要對此進行調整,可以在要刪除的術語中添加一個ULP,但是我認為這只是有意低估了。

這是一個保留浮點數以保持運行總計的答案-我認為加權平均值僅需要兩個運行總計:

分配一個數組來存儲您的數字,因此插入數字意味着在數組中找到一個空白空間並將其設置為該值,刪除一個數字意味着將其在數組中的值設置為零並聲明該空間為空-您可以使用空閑條目的鏈接列表,以在時間O(1)中查找空條目

現在,您需要計算大小為N的數組的總和。將該數組視為完整的二叉樹,就像在heapsort中一樣,所以offset 0是根,1和2是其子代,3和4是1的子代,5和6是2的孩子,依此類推-i的孩子在2i + 1和2i + 2。

對於每個內部節點,將所有條目的總和保持在樹中該節點處或節點以下。 現在,當您修改條目時,可以通過從條目到樹的根的方式重新計算數組中值的總和,並在進行過程中更正部分和-這將花費O(log N),其中N是數組的長度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM