Arrays 从数组平均值计算数组元素平均差的有效方法

Arrays 从数组平均值计算数组元素平均差的有效方法,arrays,algorithm,average,Arrays,Algorithm,Average,是否有一种方法可以通过只访问每个数组元素一次来计算数组元素与数组平均值之间的平均距离?我搜索一个算法 例如: Array : [ 1 , 5 , 4 , 9 , 6 ] Average : ( 1 + 5 + 4 + 9 + 6 ) / 5 = 5 Distance Array : [|1-5|, |5-5|, |4-5|, |9-5|, |6-5|] = [4 , 0 , 1 , 4 , 1 ] Average Distance : ( 4 + 0 + 1 + 4 + 1 ) / 5 = 2

是否有一种方法可以通过只访问每个数组元素一次来计算数组元素与数组平均值之间的平均距离?我搜索一个算法

例如:

Array : [ 1 , 5 , 4 , 9 , 6 ]
Average : ( 1 + 5 + 4 + 9 + 6 ) / 5 = 5
Distance Array : [|1-5|, |5-5|, |4-5|, |9-5|, |6-5|] = [4 , 0 , 1 , 4 , 1 ]
Average Distance : ( 4 + 0 + 1 + 4 + 1 ) / 5 = 2
这个简单的算法需要两个过程

第一遍读取并累加值,然后将结果除以数组长度以计算数组元素的平均值

第二遍读取值,累加每个值与先前计算的平均值之间的距离,然后将结果除以数组长度,以找到元素与数组平均值之间的平均距离

这两个过程是相同的。它是计算一组值的平均值的经典算法。第一种方法将数组的元素作为输入,第二种方法将每个元素与数组平均值的距离作为输入

计算平均值可以修改为不累加值,而是在从数组顺序读取元素时动态计算平均值

公式是:

Compute Running Average of Array's elements
-------------------------------------------
RA[i] = E[i] {for i == 1}
RA[i] = RA[i-1] - RA[i-1]/i + A[i]/i { for i > 1 }
其中A[x]是位置x处的数组元素,RA[x]是位置1和x之间数组元素的平均值

我的问题是:

有没有类似的算法,在读取数组元素的同时,计算元素与数组平均值的平均距离


问题是,当我们读取数组的元素时,数组的最终平均值是未知的。只有运行平均值是已知的。因此,计算运行平均值的差异不会产生正确的结果。我想,如果存在这样的算法,它可能应该能够在某种程度上补偿读取的每个新元素所计算的错误。

我不认为你能比logn做得更好

假设数组已排序。然后我们可以把它分为小于平均值的元素和大于平均值的元素。如果某些元素等于平均值,那没关系。假设前k个元素小于平均值。那么平均距离是

D=xave-x1+xave-x2+xave-x3+…+xave xk+xk+1-xave+xk+2-xave+…+xn xave/n

=-x1+-x2+-x3+…+-xk+xk+1+xk+2+…+xn+n-2kxave/n

=[高于平均值的元素之和]-[低于平均值的元素之和]+n-2kxave/n


您可以通过从两端开始工作,在前进过程中调整尚未确定的平均值的限制,一次完成计算。这将打开,排序在logn上,它们可能在同一个操作中完成,所以整个过程都在logn上。

我认为你做得不会比在logn上更好

假设数组已排序。然后我们可以把它分为小于平均值的元素和大于平均值的元素。如果某些元素等于平均值,那没关系。假设前k个元素小于平均值。那么平均距离是

D=xave-x1+xave-x2+xave-x3+…+xave xk+xk+1-xave+xk+2-xave+…+xn xave/n

=-x1+-x2+-x3+…+-xk+xk+1+xk+2+…+xn+n-2kxave/n

=[高于平均值的元素之和]-[低于平均值的元素之和]+n-2kxave/n


您可以通过从两端开始工作,在前进过程中调整尚未确定的平均值的限制,一次完成计算。这将是打开的,排序在logn上,它们可能在相同的操作中完成,因此整个过程都在logn上。

双过程方法的唯一问题是需要重新读取或存储第二次过程的整个序列。明显的改进是维护一个数据结构,以便在平均值发生变化时可以调整绝对差值之和

假设您通过观察一个巨大的数字,将平均值更改为一个非常大的值。现在,将这一变化与观察一个不太大的值所引起的变化进行比较。您将能够计算出两个绝对差之和之间的差,因为两个平均值都高于所有其他数字,所以所有绝对值都会随着两个巨大平均值之间的差而减小。这种可预测的变化一直持续到平均值达到标准数字中观察到的最高值,这种变化允许您找出观察到的最高数字是多少

通过运行这样的实验,您可以恢复在您投入运行实验之前观察到的一组数字。因此,任何用于跟踪绝对差和的智能数据结构都能够存储观察到的一组数字,除了顺序,在观察到同一数字的多个副本的情况下,存储第二遍所看到的所有数字几乎就是这样做的。所以我不认为绝对差和的情况有什么诀窍
与差异平方法一样,您所关心的大多数信息都是由一对数字和、平方和来描述的。

两遍法的唯一问题是,您需要重新读取或存储第二遍的整个序列。明显的改进是维护一个数据结构,以便在平均值发生变化时可以调整绝对差值之和

假设您通过观察一个巨大的数字,将平均值更改为一个非常大的值。现在,将这一变化与观察一个不太大的值所引起的变化进行比较。您将能够计算出两个绝对差之和之间的差,因为两个平均值都高于所有其他数字,所以所有绝对值都会随着两个巨大平均值之间的差而减小。这种可预测的变化一直持续到平均值达到标准数字中观察到的最高值,这种变化允许您找出观察到的最高数字是多少


通过运行这样的实验,您可以恢复在您投入运行实验之前观察到的一组数字。因此,任何用于跟踪绝对差和的智能数据结构都能够存储观察到的一组数字,除了顺序,在观察到同一数字的多个副本的情况下,存储第二遍所看到的所有数字几乎就是这样做的。所以我不认为绝对差和的情况有什么诀窍,就像差平方的情况一样,你关心的大多数信息都是由一对数字和来描述的。如果l2范数平均距离平方是可以的,那么它是:

sqrt(sum(x^2)/n - (sum(x)/n)^2)
这是平均值x^2的平方根减去平均值x的平方

这叫做,实际上,上面是方差的平方根,叫做标准差,是一个典型的价差度量


请注意,这比您最初要求的测量值对异常值更敏感。

如果l2范数平均距离平方是确定的,则它是:

sqrt(sum(x^2)/n - (sum(x)/n)^2)
这是平均值x^2的平方根减去平均值x的平方

这叫做,实际上,上面是方差的平方根,叫做标准差,是一个典型的价差度量


请注意,这比您最初要求的度量值对异常值更敏感。

您的后续描述将您的上下文描述为从纹理读取HLSL。如果过滤器示意图是2的幂,并且与原始图像中两个边界的相同幂对齐,则可以使用MIP贴图查找过滤器区域的平均值

例如,对于8x8过滤器,预计算MIP链下三级的MIP映射,其元素将是每个8x8区域的平均值。然后,从该MIP级别纹理读取的单个纹理将为您提供8x8区域的平均值。不幸的是,在本例中,这不适用于将过滤器滑动到任意位置(不是8的倍数)


您可以尽可能利用4x4或2x2区域的MIP平均值,使用中间MIP级别来减少纹理读取的次数,但这会使算法变得相当复杂。

您的后续描述将您的上下文描述为从纹理读取HLSL。如果过滤器示意图是2的幂,并且与原始图像中两个边界的相同幂对齐,则可以使用MIP贴图查找过滤器区域的平均值

例如,对于8x8过滤器,预计算MIP链下三级的MIP映射,其元素将是每个8x8区域的平均值。然后,从该MIP级别纹理读取的单个纹理将为您提供8x8区域的平均值。不幸的是,在本例中,这不适用于将过滤器滑动到任意位置(不是8的倍数)


您可以尽可能利用4x4或2x2区域的MIP平均值,利用中间MIP级别来减少纹理读取的次数,但这会使算法复杂化。

您可以在一次过程中计算距离l2范数的平方,但是我不知道绝对差l1的等价物。好吧,为了我想要的目的,也许距离的平方可以满足我的要求。它是用于图形HLSL语言的。其结果类似于降噪过滤器。所以,只要把噪音降到最低,它就对我有效:谢谢,我会看一看!好的,公式见下文。希望有帮助。你可以在一次传递中计算距离l2范数的平方,但我不知道绝对差l1的等效值。好吧,为了我想要的目的,也许距离的平方对我有用。它是用于图形HLSL语言的。其结果类似于降噪过滤器。所以,只要噪音最小化,它就会
为我工作:谢谢,我来看看!好的,公式见下文。希望有帮助。当我在玩一些用于图形的HLSL代码着色器代码(如DirectX)时,首先想到了这个问题。在这种情况下,数组实际上是内存中的纹理。事实上,它是一个围绕特定像素的NxN区域,有N^2个元素,首先读取以计算平均亮度,然后重新读取以计算每个像素亮度到先前计算平均值的平均距离。因此,在我第一次在着色器代码中使用NxN像素区域的数组之前,无法以任何方式对其进行排序或操作。我想找到一种方法来最小化从纹理读取像素值的纹理查找,因为此操作会显著降低性能。如果我有一个5x5内核,我会为每个像素在纹理中查找2*5*5次。如果我有1024*768像素的输入纹理,那么每帧总共有39321600个纹理读取。太多了。我认为将这个数量减半真的很好,所以我开始思考是否有一种方法可以一次性计算出我想要的东西,只需读取一次输入值。当我在玩一些用于图形的HLSL代码着色器代码(如DirectX)时,我首先想到了这个问题。在这种情况下,数组实际上是内存中的纹理。事实上,它是一个围绕特定像素的NxN区域,有N^2个元素,首先读取以计算平均亮度,然后重新读取以计算每个像素亮度到先前计算平均值的平均距离。因此,在我第一次在着色器代码中使用NxN像素区域的数组之前,无法以任何方式对其进行排序或操作。我想找到一种方法来最小化从纹理读取像素值的纹理查找,因为此操作会显著降低性能。如果我有一个5x5内核,我会为每个像素在纹理中查找2*5*5次。如果我有1024*768像素的输入纹理,那么每帧总共有39321600个纹理读取。太多了。我认为把这个数字减半真的很好,所以我开始思考是否有一种方法可以一次性计算出我想要的东西,一次读取输入值。这个问题可能比需要的更具体。我首先要寻找的是一种方法,通过读取数组值一次,得到一个值,该值告诉我数组中的元素是如何分散的。因为它在HLSL图形代码中,所以值在[0…255]中,所以在极端情况下,我希望值在0到255之间。我认为这个值不会大于128。例如,对于值[3,5,3,5],该值将为1,距数组的平均距离为1。对于[2,6,2,6],值为2,平均距离为2,尽管在这两种情况下,平均值为4,您可以很容易地在一次传递中计算方差。这个的平方根,标准偏差,和你的平均绝对偏差有很多相似之处。有很多方法可以做到这一点。at的一个已经被调整以提供良好的数值精度。这个问题可能比需要的更具体。我首先要寻找的是一种方法,通过读取数组值一次,得到一个值,该值告诉我数组中的元素是如何分散的。因为它在HLSL图形代码中,所以值在[0…255]中,所以在极端情况下,我希望值在0到255之间。我认为这个值不会大于128。例如,对于值[3,5,3,5],该值将为1,距数组的平均距离为1。对于[2,6,2,6],值为2,平均距离为2,尽管在这两种情况下,平均值为4,您可以很容易地在一次传递中计算方差。这个的平方根,标准偏差,和你的平均绝对偏差有很多相似之处。有很多方法可以做到这一点。一个在已经调整,以提供良好的数值精度。