Кривая фитинга с закруглением как часть функции - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть числовой набор данных, который разделен на два списка.Он генерируется функцией вида 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.]

Я подозреваю, что все мои усилия сводятся к окончательным параметрам, но я не совсем уверен, где искать ответ. Эта документация не может помочь.

1 Ответ

0 голосов
/ 22 декабря 2018

Ваша функция локально постоянна, поэтому многие методы оптимизации, которые для работы работают с небольшими приращениями m и t, не будут работать хорошо.

Если вы знаете некоторые границы для ваших переменных m и t, вы можете перебрать свой результат методом грубой силы, либо вручную (просто обведите два np.arange () для m и t и найдите минимум), либоиспользуя scipy.optimize.brute () .

Чтобы привести рабочий пример с вашими данными:

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) 

Обратите внимание, что это может быть очень медленным, если вашломтики большие / содержат много точек.

...