首页 > 解决方案 > Scipy 曲线拟合(优化) - 使用自定义函数对条件进行矢量化以识别阈值

问题描述

我试图用来scipy curve_fit捕获a0参数的值。截至目前,它没有改变(总是以 1 出现)

X = [[1,2,3],[4,5,6]]
def func(X, a0, c):
     x1 = X[0]; x2 = X[1]
     a = x1*x2
     result = np.where(a(a<a0), -c*(a + np.sqrt(x2)), -c*x1)
     return result

Popt, Cov = scipy.curve_fit(func, X, y) 
a0, c = Popt
Predicted = func(X, a0, c) # a0 and c are constants

我得到了 c 的值,它是一个标量,没有任何问题。我无法解释为什么a0(也是标量)总是 1,我不知道如何解决它。我确实在 SO 的其他地方np.where看到了可以按照我在这里使用的方式使用,但显然不适用于 curve_fit 函数。也许我需要使用不同的优化方法,我想要一些指针来使用 scipy 方法来做到这一点。

编辑:我尝试了布拉德建议的结构,但不是这样。

标签: pythonoptimizationscikit-learnscipycurve-fitting

解决方案


更新!

这应该有效。请注意,a在这个长度为 3 的示例中,变量是一个向量,因为它是通过第一个和第二个元素的元素乘法计算得出的,其中第一个和第二个元素X是一个 2x3 矩阵。因此a0可以是标量或长度为 3 的向量,c也可以是标量或长度为 3 的向量。

import numpy as np


X = np.array([[1, 2, 3], [4, 5, 6]])

a0 = np.array([8,25,400])
# a0 = 2


# Code works whether C is scalar or a matrix since it can be broadcast to matrix a below.
# c = 3 # Uncomment this for scalar
c = np.array([8, 12, 2000])  # Element wise


def func(X, a0, c):
    x = X[0]
    y = X[1]
    a = x * y
    print(a.shape)
    result = np.where(a < a0, c * (a + np.sqrt(y)), c * x)
    return result


func(X, a0, c)

这是有效的最少代码量。请注意,我删除了y>0和 定义a为与c. 现在您得到了正确的插入,因为 的第一个参数np.where现在与第二个和第三个参数的大小相同。之前 (x<a) & (y>0)总是评估为TrueorFalse并且在这种情况下这是一个标量。如果a是 N 维数组,您将收到 aValueError因为操作数不能一起广播

import numpy as np


c = np.array([[22,34],[33,480]])


def func(X, a):
     x = X[0]; y = X[1]
     return np.where(c[(x<a)], -c*(a + np.sqrt(y)), -c*x)


X = [25, 600]
a = np.array([[2,14],[33,22]])

func(X,a)

如果c是一个常量并且a是您想要操作的数组,这也适用

import numpy as np


c = 2


def func(X, a):
     x = X[0]; y = X[1]
     return np.where(a[(x<a)], -c*(a + np.sqrt(y)), -c*x)


X = [25, 600]
a = np.array([[2,14],[33,22]])

func(X,a)

推荐阅读