假设我们必须将x金额分配给所需的k金额。有没有算法来最小化实际k分配值和k期望值之间的平方距离?
例如,假设我们需要将x = 5分配给k = 3所需的2,-3,4。
我们可以分配5到2,-3,6的平方距离为0 ^ 2 + 0 ^ 2 + 2 ^ 2 = 4.
我们被允许为k金额分配负数或任何金额。唯一的限制是分配的金额必须与原始x相加。分配的金额也不需要是整数,只需要是实数。
答案 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)
我想到了两种方法:
Lagrange multipliers。非常适合使用线性约束最小化二次成本函数。该链接提供了有关如何设置和解决问题的几个示例。
产生
应用约束并定义
给出
替代后退给出最终解决方案
换句话说,我们计算总期望输出与总约束之间的差异,并将它们平均分配。
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。有一个证据隐藏在偏导率土地的某个地方,我太累或愚蠢无法解决。)