2017-04-06 48 views
1

我得到了一些隨機失真的值,現在我正在尋找一種方法來平均失真。數學用於平均扭曲值

在下面的代碼中我有一個我的問題的例子,測量a []的數組。我有一個隨機陣列失真[]。這通過rnd.Nextbytes

與陣列創建的B [] i的嘗試去接近陣列的[]

在我使用10.000樣本samplecode,但它不是真的固定,100.000樣本值也可以,最後我寧願讓它運行一段時間或直到按下一個鍵。

using System; 
namespace test_math 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Random rnd = new Random(); 
     byte[] distortion = new byte[8]; 

     int[] b = { 0, 0, 0, 0, 0, 0, 0, 0 }; 
     int[] a = { 100, 200, 300, 400, 500, 600, 700, 800 }; 

     for (int count = 0; count < 100000; count++) 
     { 
      Console.Write(count+ " "); 
      rnd.NextBytes(distortion);    
      for (int i = 0; i < distortion.Length; i++) 
      { 
       b[i] = (int)(b[i] * .8 + (a[i] + 127-(int)(distortion[i])) * .2); 
       Console.Write(b[i].ToString() + " "); 
      } 
      Console.WriteLine(); 
     } 
     Console.ReadLine(); 
    } 
    } 
} 

與線

b[i] = (int)(b[i] * .8 + (a[i] + 127-(int)(distortion[i])) * .2); 

凡0.8和0.2的因素目前,它(我與其他數字測試以及)。 但我認爲這遠非理想,雖然這樣的數學具有抑制作用,但它沒有考慮到在某個時間點新的測量結果應該對平均值具有較小的影響。PS []我現在不知道如何用統計學的術語來稱呼它,如果有一個術語,我也很樂意知道它。

+2

你不明白你在問什麼。具體來說,不清楚上述內容的哪一部分,要求的結果是什麼,以及上面的哪部分代表了你從試圖獲得所需結果的不成功嘗試。 –

+1

隨着時間的推移,似乎很清楚,假設一個好的隨機分佈,這些值應該收斂在正確的值上。但就改進你的目標而言,目前還不清楚你的目標是什麼。代碼現在究竟做了什麼,以及_specifically_與您希望做的有什麼不同? –

+0

在上面的代碼b []不會收斂到[] 實質上[n]被[n] +隨機(-127 .. + 127) 扭曲我正在尋找數學,當重複足夠多次一個[N] +隨機的;會將b []收斂到a []的原始值。所以b []跳到{100,200,300,400,500,600,700,800}。 該代碼只是一個容易複製和編輯的問題示例 – user3800527

回答

2

我還不完全清楚你的目標是在這裏。然而,在數學上,我希望這個想法應該是隨着時間的推移對樣本進行平均。從字面上看,這隻意味着你可以簡單地將它們與每次迭代相加,然後找到收斂值,除以總採樣數。

這是你的代碼的版本則是(我花了一點自由的與你的輸出邏輯,使代碼將在合理的時間內完成,而不是填補控制檯窗口的緩衝區):

static void Main(string[] args) 
{ 
    Random rnd = new Random(); 
    byte[] distortion = new byte[8]; 

    long[] b = { 0, 0, 0, 0, 0, 0, 0, 0 }; 
    int[] a = { 100, 200, 300, 400, 500, 600, 700, 800 }; 

    for (int count = 1; count <= 100000; count++) 
    { 
     bool display = count % 100 == 0; 

     if (display) 
     { 
      Console.Write(count + " "); 
     } 
     rnd.NextBytes(distortion); 
     for (int i = 0; i < distortion.Length; i++) 
     { 
      int distortedValue = a[i] + 127 - (int)(distortion[i]); 

      b[i] += distortedValue; 

      if (display) 
      { 
       Console.Write(((int)((double)b[i]/count + 0.5)).ToString() + " "); 
      } 
     } 

     if (display) 
     { 
      Console.WriteLine(); 
     } 
    } 
    Console.ReadLine(); 
} 

給定足夠的樣本,這最終會收斂於原始值。如果你真的想使用加權總和的變化,我想你可以。這將涉及通過將b[]數組值乘以count - 1,添加當前失真值,然後再將其除以count,然後將其存儲回b[]數組中,重新構造先前的總和。

+0

接縫工作得很好,在統計中有一個名字嗎? 並且會有與您在評論中建議的其他選項的行爲差異。 – user3800527

+0

這平均接縫工作得很好,會有一個行爲與你在評論中建議的其他選擇不同(它會更快收斂?)。不確定,如果在我的情況下,收斂速度越慢或越快, – user3800527

+0

@ user3800527:_「在統計中有一個名稱」_ - 不知道。我不是統計員。 :) _「會有行爲差異」_ - 沒有區別。在數學上,這兩種方法是相同的。只是在一種情況下,當您想要顯示當前進度時,只計算平均值,而在另一種情況下,每次迭代都有效地重新計算平均值。在任何一種情況下,收斂速度都很快;經過100次迭代後,你的差距在10%左右,1000次迭代,接近1%。 –