Scipy优化器查找最小误差总和

时间:2019-10-08 07:07:55

标签: python dataframe optimization scipy

我有一个这样的表: enter image description here

我的目标是使用Scipy优化来查找P1和P2的正确值,以便我的V3等于V1,并且V3 = P1 + P2。我正在寻找一种方法来尝试P1和P2的不同值以获得abs(误差和)= abs(V3-V1)的最小可能值

使用excel求解器的解决方案: enter image description here

但我不想让每行具有不同的P1和P2值,而是希望有一个组合,使V3尽可能接近V1,并且条件可能是最小误差总和。

1 个答案:

答案 0 :(得分:2)

看,我想我了解您要达到的目标,并且您确实不需要做事。 对于初学者,您实际上对P1和P2的值并不感兴趣,因为您真的只想优化它们的和V3,因此实际上总和为最佳V3的任何两个数字都可以完成工作。 现在我们可以找到V3。实际上,这很容易做到,因为上述最佳值将是两个数字之一,只有一个有效小数位最接近平均值。在代码中:

def find_minimum_error_sum(V1):
    error = lambda x: sum(abs(i-x) for i in V1)
    adjusted_mean = (sum(V1)*10//len(V1))/10
    if error(adjusted_mean) <= error(adjusted_mean+0.1):
        return adjusted_mean
    else:
        return adjusted_mean+0.1

在包含您的V1值的数组上调用该函数,将返回您要查找的V3。再一次,总和为V3的任何2个数字都可以是您的P1和P2。 不过要小心:只有在数组中的每个数字都包含一个有效的十进制数字时,该函数才起作用!

编辑:正如约瑟夫·布丁(Joseph Budin)巧妙指出的那样,您只需计算数组的中位数即可直接找到V3:

from statistics import median   
V3 = median([0.5, 0.3, 0.6, 0.5, 0.7, 0.2, 0.1])

就是这样。