Кривая Python соответствует нескольким параметрам для нескольких наборов данных - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь использовать функцию Scipy's Curve_fit для определения параметров модели. Я использовал Python curve_fit с несколькими независимыми переменными в качестве отправной точки и смог удовлетворить свои потребности, но теперь я хотел бы использовать два входных набора данных для получения параметров модели, которые будут совместно использоваться этими двумя наборами данных ( В долгосрочной перспективе я хотел бы использовать более двух наборов данных, но в качестве отправной точки я использую два).

Я подумал, что самым простым способом сделать это может быть использование curve_fit и ввод моих данных в виде матрицы. В качестве очень надуманного примера я попытался «дополнить» пример, приведенный в ссылке выше (я понимаю, что это не самый красивый код - я просто пытаюсь понять, как я на самом деле должен это делать).

def func(X, a, b, c):
    x,y = X
    result0 = np.log(a) + b*np.log(x[0]) + c*np.log(y[0])
    result1 = np.log(a) + b*np.log(x[1]) + c*np.log(y[1])
    return np.array([result0, result1])

# some artificially noisy data to fit
x0 = np.linspace(0.1,1.1,101)
y0 = np.linspace(1.,2., 101)

x1 = np.linspace(0.1,1.1,101)
y1 = np.linspace(1.,2., 101)

a, b, c = 10., 4., 6.

x = np.array([x0,x1])
y = np.array([y0,y1])

z = func((x,y), a, b, c)
z[0] = z[0] * 1 + np.random.random(101)/100
z[1] = z[1] * 1 + np.random.random(101)/100

# initial guesses for a,b,c:
p0 = 8., 2., 7.
print curve_fit(func, (x,y), z, p0)

Этот скрипт возвращает следующую ошибку:

Файл "curveFitting.py", строка 135, в print curve_fit (func, (x, y), z, p0) Файл "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", строка 533, в curve_fit res = leastsq (func, p0, args = args, full_output = 1, ** кВт) Файл "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/optimize/minpack.py", строка 371, в leastsq повысить TypeError ('Неправильный ввод: N =% s не должен превышать M =% s'% (n, m)) Ошибка типа: неправильный ввод: N = 3 не должно превышать M = 2

Пытаюсь ли я использовать curve_fit непреднамеренно / неуместно? Есть ли другая функция / библиотека, которую я должен использовать вместо этого?

1 Ответ

0 голосов
/ 29 июня 2018

Ошибка говорит о том, что у вас есть 3 переменные и 2 наблюдения, что недопустимо: количество переменных должно превышать количество наблюдений.

Ваш надуманный пример имеет 3 наблюдения для каждого набора данных - это было бы маргинально, но с двумя такими наборами данных это должно работать.

Но, чтобы она работала с curve_fit, ваша модельная функция должна использовать np.concatenate или np.flatten для создания одномерного массива с шестью наблюдениями для ваших 2 наборов данных по 3 наблюдения в каждом. То есть значение, возвращаемое функцией модели для curve_fit, должно быть одномерным массивом.

Вы спрашиваете об альтернативной функции или библиотеке: lmfit может оказаться полезным. Помимо других функций, он позволяет использовать несколько независимых переменных без хака, на который вы ссылаетесь. Он также будет работать с вашей моделью без необходимости использовать np.concatenate или flatten, поскольку он сделает это автоматически для вас. В этот момент кто-то прокомментирует, если я не укажу ясно, что я один из авторов lmfit. Конечно, я не сомневаюсь, что вы сможете увидеть это из lmfit документов и кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...