在分配时最小化最小二乘的算法?

时间:2015-08-02 17:23:54

标签: algorithm math mathematical-optimization quadratic-programming

假设我们必须将x金额分配给所需的k金额。有没有算法来最小化实际k分配值和k期望值之间的平方距离?

例如,假设我们需要将x = 5分配给k = 3所需的2,-3,4。

我们可以分配5到2,-3,6的平方距离为0 ^ 2 + 0 ^ 2 + 2 ^ 2 = 4.

我们被允许为k金额分配负数或任何金额。唯一的限制是分配的金额必须与原始x相加。分配的金额也不需要是整数,只需要是实数。

4 个答案:

答案 0 :(得分:1)

设y是期望量的总和,并且d是x和y之间的差。通过在k个期望量之间平均分配d来获得最小值。为读者练习:使用拉格朗日乘数来证明这一点。

在给定的例子中,y = 2 - 3 + 4 = 3并且d = 5 - 3 = 2.将d = 2均匀地分配给k个期望值意味着向每个项目添加2/3,导致分配2 2/3,-2 1/3和4 2/3。

答案 1 :(得分:0)

我想到了两种方法:

  1. Lagrange multipliers。非常适合使用线性约束最小化二次成本函数。该链接提供了有关如何设置和解决问题的几个示例。

    cost

    lagrange

    产生

    lambda1

    应用约束并定义

    y

    给出

    lambda2

    替代后退给出最终解决方案

    soln

    换句话说,我们计算总期望输出与总约束之间的差异,并将它们平均分配。

  2. Fair division。如果您愿意放宽最小二乘标准,您可以使用公平分割技术解决问题。特别是,adjusted winner是一种在玩家之间公平分配商品的方式。你不会像你建议的那样得到负面答案,但更像是蛋糕切割解决方案。

答案 2 :(得分:0)

基本上,对于数据和总预算b的向量v(长度为k),您有以下优化问题:

min_{x1, x2, ..., xk} (x1-v1)^2 + (x2-v2)^2 + ... + (xk-vk)^2
s.t. x1 + x2 + ... + xk = b

这是一个线性约束的二次程序,可以使用二次编程软件包解决。例如,这是R语言中包含quadprog包的解决方案:

# Setup data
v <- c(2, -3, 4)
b <- 5

# Solve quadratic program
library(quadprog)
solve.QP(diag(length(v)), v, matrix(rep(1, length(v))), b, 1)$solution
# [1]  2.666667 -2.333333  4.666667

在这个例子中,我们得到客观值4/3,小于原始帖子中提供的分配的目标值4。

答案 3 :(得分:0)

这是一个特例LP。总是通过分配使得delta-k值完全相同来实现最小值。

由于目标函数是平方和,并且所有数据点都是相等加权的,因此除了相同值的delta-ks之外的分配会导致更高的平方和。 (请注意,在josilber的quadprog解决方案中,delta-k值都是2/3。有一个证据隐藏在偏导率土地的某个地方,我太累或愚蠢无法解决。)