我得到了一些随机失真的值,现在我正在寻找一种平均失真的方法。
在下面的代码中我有一个我的问题的例子,一个测量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我现在不知道怎么称这个接近于统计术语的值,如果有一个术语,我也很高兴知道它。
答案 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}数组。