Подтвердить что ты не робот

Подгонка многовариантных curve_fit в python

Я пытаюсь подобрать простую функцию для двух массивов независимых данных в python. Я понимаю, что мне нужно объединить данные для моих независимых переменных в один массив, но что-то все еще кажется неправильным в том, как я передаю переменные, когда я пытаюсь сделать это. (Есть несколько предыдущих сообщений, связанных с этим, но они не очень помогают.)

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x_3d, a, b, c, d):
    return a + b*x_3d[0,:] + c*x_3d[1,:] + d*x_3d[0,:]*x_3d[1,:]

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

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d[:2,:], x_3d[2,:], p0)
print ' fit coefficients:\n', fitParams

Ошибка, которую я читаю,

raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m)) 
TypeError: Improper input: N=4 must not exceed M=3

Что такое M длина? Является ли N длиной p0? Что я здесь делаю неправильно?

4b9b3361

Ответ 1

N и M определены в help для этой функции. N - количество точек данных, а M - количество параметров. Поэтому ваша ошибка в основном означает, что вам нужно как минимум столько точек данных, сколько у вас есть параметры, что имеет смысл.

Этот код работает для меня:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fitFunc(x, a, b, c, d):
    return a + b*x[0] + c*x[1] + d*x[0]*x[1]

x_3d = np.array([[1,2,3,4,6],[4,5,6,7,8]])

p0 = [5.11, 3.9, 5.3, 2]

fitParams, fitCovariances = curve_fit(fitFunc, x_3d, x_3d[1,:], p0)
print ' fit coefficients:\n', fitParams

Я включил больше данных. Я также изменил fitFunc на запись в форме, которая сканирует только как функцию одного x - обработчик будет обрабатывать вызов этого для всех точек данных. Код, который вы отправили, также ссылался на x_3d[2,:], что вызывало ошибку.