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

时间:2014-06-01 13:50:28

标签: 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,它最小化总和平方误差:

error =对{E(x)^ 2}

的所有x求和

对于给定的数据集。

1 个答案:

答案 0 :(得分:4)

假设权重被归一化为总和为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系统来解决。