найти нелинейное уравнение python scipy

Я новичок в аналитике, я ищу решение, чтобы найти модель для решения нелинейного уравнения формы Y=a(X1^b) + c(X2^d) + e (где X1, X2 - независимые переменные) Ниже приведен полный набор, к сожалению, у нас мало наблюдений, все, что нам нужно является любой простой подгонкой. Но эти данные не имеют выбросов, необходимо учитывать каждое наблюдение.

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

x1=np.array([217,160,97,75])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344])
y=np.array([14,7,7,1])

def func(X, a, b, c ,d , e ):
    x1,x2 = X
    return a*x1**b + c*x2**d + e

popt, pcov = curve_fit(func, (x1,x2), y)

plt.plot(y, func((x1,x2), *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()

но запуск curve_fit дает мне ошибку, говорящую, что

TypeError: Неверный ввод: N=5 не должно превышать M=4

Затем мне пришлось добавить еще несколько фиктивных входных данных, поскольку наблюдения за почти одинаковыми значениями добавляли разницу в десятичных точках, что приводило к ошибке.

x1=np.array([217,160,97,75,76,219])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344,1.420635344,143.420635344])
y=np.array([14,7,7,1,1,14])

RuntimeError: Оптимальные параметры не найдены: количество вызовов функции достигло maxfev = 1200.

Затем мне пришлось удалить переменную d и сохранить функцию как

def func(X, a, b, c ,e ):
    x1,x2 = X
    return a*x1**b + c*x2 + e

Наконец, он запустился, но снова с предупреждением ниже, но результаты не очень хорошие.

RuntimeWarning: переполнение мощности

Обратите внимание, что

х3 = макс (х2 - {(х1 ^ 2) * 2,6}, 0)

и решение

y = a * (x3 ^ b) дает a = 0,89 и b = 0,58 с r2 = 0,98 и ошибкой = 0,19, что является лучшим, что я мог получить до сих пор

Но я хотел бы получить результат в обобщенной форме, не пытаясь приравнять отношение. Поскольку на основе набора данных функция x3=f(x1,x2) может меняться, и это не фиксированное уравнение для всех случаев.


person niths4u    schedule 06.06.2017    source источник


Ответы (1)


Очень хорошим подходом к получению приемлемых результатов подгонки является использование начальных предположений свободных параметров. curve_fit принимает аргумент p0. Если ваши данные не слишком сильно различаются между двумя наборами данных, это должно быть правильным способом. По моему опыту, неплохой подход — угадать хорошие начальные значения p0 и установить ограничения по параметру bounds. В противном случае вы можете попытаться интерполировать данные, если вам не нужно знать математическое соотношение.

person Franz    schedule 06.06.2017