首页 > 解决方案 > Scipy优化器找到最小误差和

问题描述

我有一张这样的桌子: 在此处输入图像描述

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

使用excel求解器的解决方案: 在此处输入图像描述

但不是为每一行设置不同的 P1 和 P2 值,我想要一个组合,使 V3 尽可能接近 V1,并且可能存在最小误差和。

标签: pythondataframeoptimizationscipy

解决方案


看,我想我理解你想要达到的目标,你真的不需要 scipy 来做到这一点。对于初学者,您对 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 将被返回。再说一次,任何 2 个总和为 V3 的数字都可以是您的 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])

就是这样。


推荐阅读