修整曲线作为函数的一部分

时间:2018-12-22 14:14:32

标签: python numpy scipy rounding curve-fitting

我有一个分为两个列表的数字数据集。它由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文档无济于事。

1 个答案:

答案 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) 

请注意,如果您的切片很大/包含很多点,这可能会非常慢。