评估加权平均最佳权重的算法

标签 algorithm average

我有一个以下形式的数据集:

[9.1 5.6 7.4] => 8.5,[4.1 4.4 5.2] => 4.9,...,x => y(x)

因此 x 是由三个元素组成的实向量,y 是标量函数。

我假设该数据的加权平均模型:

y(x) = (a * x[0] + b * x[1] + c * x[2])/(a+b+c) + E(x)

其中 E 是未知的随机误差项。

我需要一种算法来找到 a、b、c,以最小化总平方误差:

误差 = { E(x)^2 } 的所有 x 的总和

对于给定的数据集。

最佳答案

假设权重归一化为 1(幸运的是,这不失一般性),那么我们可以用 c = 1 - a - b 重新求解问题,因此我们实际上是在求解 a 和 b。

有了这个我们就可以写

error(a,b) = sum over all x { a x[0] + b x[1] + (1 - a - b) x[2] - y(x) }^2

现在问题只是取偏导数 d_error/da 和 d_error/db 并将它们设置为零以找到最小值。

经过一些摆弄,你就得到了 a 和 b 的两个方程组。

C(X[0],X[0],X[2]) a + C(X[0],X[1],X[2]) b = C(X[0],Y,X[2])
C(X[1],X[0],X[2]) a + C(X[1],X[1],X[2]) b = C(X[1],Y,X[2])

X[i]的含义是数据集x值中所有第i个分量的向量。

Y的含义是所有y(x)值的向量。

系数函数C的含义如下:

C(p, q, r) = sum over i { p[i] ( q[i] - r[i] ) }

我将省略如何求解 2x2 系统,除非这是一个问题。

如果我们插入您提供的二元素数据集,我们应该得到精确的系数,因为您总是可以用一条线完美地逼近两个点。例如,第一个方程系数是:

C(X[0],X[0],X[2]) =  9.1(9.1 - 7.4) + 4.1(4.1 - 5.2) = 10.96
C(X[0],X[1],X[2]) = -19.66
C(X[0],Y,X[2]) = 8.78

第二个方程类似:4.68 -13.6 4.84

求解 2x2 系统会产生:a = 0.42515,b = -0.20958。因此 c = 0.78443。

请注意,在此问题中会产生负系数。尽管“真实”数据集可能会产生这样的结果,但没有什么可以保证它们会是积极的。

事实上,如果用这些系数计算加权平均值,它们分别是 8.5 和 4.9。

为了好玩,我也尝试了这个数据集:

X[0]        X[1]        X[2]        Y
0.018056028 9.70442075  9.368093544 6.360312244
8.138752835 5.181373099 3.824747424 5.423581239
6.296398214 4.74405298  9.837741509 7.714662742
5.177385358 1.241610571 5.028388255 4.491743107
4.251033792 8.261317658 7.415111851 6.430957844
4.720645386 1.0721718   2.187147908 2.815078796
1.941872069 1.108191586 6.24591771  3.994268819
4.220448549 9.931055481 4.435085917 5.233711923
9.398867623 2.799376317 7.982096264 7.612485261
4.971020963 1.578519218 0.462459906 2.248086465

我使用 1/3 x[0] + 1/6 x[1] + 1/2 x[2] + E 生成 Y 值,其中 E 是 [- 0.1..+0.1]。如果算法工作正常,我们期望从此结果中得到大约 a = 1/3 和 b = 1/6。事实上,我们得到 a = .3472 和 b = .1845。

OP 现在表示他的实际数据大于 3 个向量。这种方法可以推广,没有太多麻烦。如果向量的长度为 n,则需要求解 n-1 x n-1 系统。

关于评估加权平均最佳权重的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980556/

相关文章:

algorithm - 数据的快速交织

java - 尝试实现一种递归算法,该算法确定一个字符串是否是其他两个字符串的有序混洗

Java Stream 平均值的最大值

r - 求子集的均值

algorithm - 检查两条线段是否相交(只检查是否相交,不检查哪里相交)

python - 如何在 Python 中对 TSP 实现动态编程算法?

java - 在java中计算 double vector 的平均值

java - 如何在JAVA中求随机生成数的平均值

c++:一个程序来找到非常高的数字的平均值?

python - Python 中的 Voronoi 分割