我有一个分为两个列表的数字数据集。它由round(mx + t)形式的函数生成。我想找到函数参数并决定使用Scipy。
我将两个数据数组的值都简化为以下示例:
x: [26 73 269 361 757]
y: [7 21 77 103 216]
这是我的代码,没有四舍五入m * x + t的结果。到目前为止,一切正常。
x_data_num = array(x_data)
y_data_num = array(y_data)
def test_func(x, m, t):
return m*x+t
params, params_covariance = optimize.curve_fit(test_func,
x_data_num, y_data_num)
print(params)
我首先尝试使用return round(m*x+t)
实现舍入,但是后来发现参数不是由值组成。
(TypeError: type numpy.ndarray doesn't define __round__ method
)
因此,我决定使用return np.round(m*x+t)
,但是它也不起作用,给我留下了错误的参数[1。 1。]
我怀疑我的所有努力都只是围绕最终参数,但是我不确定要在哪里找到答案。 This文档无济于事。
答案 0 :(得分:1)
您的函数是局部恒定的,因此很多优化方法(依靠m和t的小增量才能起作用)不会表现良好。
如果您知道变量m和t的某些界限,则可以手动(仅对m和t循环两个np.arange()并找到最小值),或使用{ {3}}。
使用数据作为工作示例:
import numpy as np
import scipy.optimize as optimize
x_data_num = np.array([26, 73, 269, 361, 757])
y_data_num = np.array([7, 21, 77, 103, 216])
def test_func(x, m, t):
return np.round(m*x+t)
def func_to_minimize(p):
return np.sum(np.abs(test_func(x_data_num, p[0], p[1]) - y_data_num))
x0 = optimize.brute(func_to_minimize, ranges=[slice(-1.,1.,0.1),slice(-1.,1.,0.1)])
print(x0)
请注意,如果您的切片很大/包含很多点,这可能会非常慢。