python - 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 方法来做到这一点。
编辑:我尝试了布拉德建议的结构,但不是这样。
解决方案
更新!
这应该有效。请注意,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)
总是评估为True
orFalse
并且在这种情况下这是一个标量。如果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)
推荐阅读
- java - 使用 Selenium WebDriver java 单击复选框
- terraform - Terraform 为 API 网关选择查询参数
- firebase - 错误:未处理的异常:PlatformException(执行 getDocuments 时出错,INVALID_ARGUMENT)
- eclipselink - eclipselink 中的更新语句中缺少字段
- python - 熊猫 groupby 班次不尊重团体
- javascript - Javascript 地图数组 promise.all
- node.js - 使用 React 和节点放置对象
- flutter - Flutter dotenv 包如何将环境变量导入 gitignore 中的 .env 文件中的 Travis
- reactjs - 变量的值在以反应形式提交时重置
- sql - 正则表达式帮助,拉出用分号分隔的最后两个动词