用于平均失真值的数学运算

时间:2017-04-06 08:11:05

标签: c# math

我得到了一些随机失真的值,现在我正在寻找一种平均失真的方法。

在下面的代码中我有一个我的问题的例子,一个测量a []的数组a。我得到了一个随机数组失真[]。这是由rnd.Nextbytes

创建的

使用数组b []我试着接近数组a []

的值

在样本代码中,我使用了10.000个样本,但是它没有真正修复,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);

其中.8和.2是因子(我也测试了其他数字)。 但我确实认为这远非理想,虽然这种数学具有抑制作用但它没有考虑到在某个时间点新测量对b []

的平均值影响较小。

PS我现在不知道怎么称这个接近于统计术语的值,如果有一个术语,我也很高兴知道它。

1 个答案:

答案 0 :(得分: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,然后再将其存储回{{1}数组。