Решение коэффициентов набора данных с использованием curve_fit из scipy.optimize

У меня есть массив A экспортированный из excel, содержащий значения данных, как показано. 1-й столбец x и второй столбец y являются зависимыми переменными, а третий столбец z – независимыми переменными (выход).

 from xlrd import open_workbook Data = open_workbook("simple.xls") sheet = Data.sheet_by_name('Sheet1') A=[] # Read row by row for rownum in range(sheet.nrows): rowValues = sheet.row_values(rownum) A.append(rowValues) A = np.array(A) A= [[ 0.00000000e+00 1.49761692e-05 0.00000000e+00] [ 8.85000000e+02 1.49761692e-05 6.41362500e-02] [ 1.48500000e+03 1.49761692e-05 1.19340000e-01] [ 2.09000000e+03 1.49761692e-05 1.58760000e-01] [ 3.36000000e+03 1.49761692e-05 2.08080000e-01] [ 3.87000000e+03 1.49761692e-05 2.16933750e-01] [ 6.48000000e+03 1.49761692e-05 2.46746250e-01] [ 8.22000000e+03 1.49761692e-05 2.54700000e-01] [ 1.05300000e+04 1.49761692e-05 2.59470000e-01] [ 1.58250000e+04 1.49761692e-05 2.62035000e-01] [ 2.37600000e+04 1.49761692e-05 2.68751250e-01] [ 8.18400000e+04 1.49761692e-05 2.92848750e-01] [ 0.00000000e+00 8.57250668e-06 0.00000000e+00] [ 6.75000000e+02 8.57250668e-06 4.97436412e-02] [ 1.27500000e+03 8.57250668e-06 1.27749375e-01] [ 1.88000000e+03 8.57250668e-06 1.88617039e-01] [ 3.15000000e+03 8.57250668e-06 2.65089780e-01] [ 3.66000000e+03 8.57250668e-06 2.90344849e-01] [ 6.27000000e+03 8.57250668e-06 3.36295316e-01] [ 8.01000000e+03 8.57250668e-06 3.42702439e-01] [ 1.03200000e+04 8.57250668e-06 3.65205982e-01] [ 1.56150000e+04 8.57250668e-06 3.67269626e-01] [ 2.35500000e+04 8.57250668e-06 3.87296798e-01] [ 8.16300000e+04 8.57250668e-06 4.43486869e-01] [ 0.00000000e+00 4.26671486e-06 0.00000000e+00] [ 4.65000000e+02 4.26671486e-06 2.61407250e-02] [ 1.06500000e+03 4.26671486e-06 1.22371762e-01] [ 1.67000000e+03 4.26671486e-06 2.19629475e-01] [ 2.94000000e+03 4.26671486e-06 3.26680087e-01] [ 3.45000000e+03 4.26671486e-06 3.34340662e-01] [ 6.06000000e+03 4.26671486e-06 4.18330575e-01] [ 7.80000000e+03 4.26671486e-06 4.50631350e-01] [ 1.01100000e+04 4.26671486e-06 4.55053950e-01] [ 1.54050000e+04 4.26671486e-06 4.60937587e-01] [ 2.33400000e+04 4.26671486e-06 5.10770813e-01] [ 8.14200000e+04 4.26671486e-06 6.12569587e-01] [ 0.00000000e+00 2.13335743e-06 0.00000000e+00] [ 8.55000000e+02 2.13335743e-06 1.03773150e-01] [ 1.46000000e+03 2.13335743e-06 2.21130000e-01] [ 2.73000000e+03 2.13335743e-06 3.45515625e-01] [ 3.24000000e+03 2.13335743e-06 3.85634925e-01] [ 5.85000000e+03 2.13335743e-06 4.76061300e-01] [ 7.59000000e+03 2.13335743e-06 4.79220300e-01] [ 1.51950000e+04 2.13335743e-06 5.24709900e-01] [ 2.31300000e+04 2.13335743e-06 5.64829200e-01] [ 8.12100000e+04 2.13335743e-06 6.46568325e-01] [ 0.00000000e+00 1.42359023e-06 0.00000000e+00] [ 6.45000000e+02 1.42359023e-06 8.03596500e-02] [ 1.25000000e+03 1.42359023e-06 2.36700000e-01] [ 2.52000000e+03 1.42359023e-06 4.25941650e-01] [ 3.03000000e+03 1.42359023e-06 4.61683350e-01] [ 5.64000000e+03 1.42359023e-06 5.99561100e-01] [ 7.38000000e+03 1.42359023e-06 6.05952000e-01] [ 9.69000000e+03 1.42359023e-06 6.16958550e-01] [ 1.49850000e+04 1.42359023e-06 6.57434250e-01] [ 2.29200000e+04 1.42359023e-06 6.45954300e-01] [ 8.10000000e+04 1.42359023e-06 7.79689800e-01] [ 0.00000000e+00 9.36010573e-07 0.00000000e+00] [ 4.35000000e+02 9.36010573e-07 3.40200000e-02] [ 1.04000000e+03 9.36010573e-07 1.91160000e-01] [ 2.31000000e+03 9.36010573e-07 3.77640000e-01] [ 2.82000000e+03 9.36010573e-07 4.44240000e-01] [ 5.43000000e+03 9.36010573e-07 5.50440000e-01] [ 7.17000000e+03 9.36010573e-07 5.36580000e-01] [ 9.48000000e+03 9.36010573e-07 5.83740000e-01] [ 1.47750000e+04 9.36010573e-07 5.87340000e-01] [ 2.27100000e+04 9.36010573e-07 6.33060000e-01] [ 8.07900000e+04 9.36010573e-07 7.36200000e-01]] x= A[:,0] y= A[:,1] z= A[:,2] 

У меня есть функция, которая будет вписываться в данные из массива A, чтобы решить для коэффициентов a и b .

 def func(data,a,b): return a/(data[:,1]*b)*np.log(1+(data[:,1]*b/a)*(1-np.exp(-a*data[:,0]))) 

Остальная часть кода показывает начальное предположение о коэффициентах a и b , функции scipy.optimize.curve_fit() и matplotlib.pyplot для построения результата.

 guess = [3.0e-5, 128 ] print guess, 'initial guessed parameters' params, pcov = scipy.optimize.curve_fit(func, A[:,:2], A[:,2], guess) print params, 'fitted parameters' import matplotlib.pyplot as plt plt.plot(x,func(A,params[0],params[1]),'-r',x,z,'o') plt.title('Plot') plt.legend(['Fit', 'Data'], loc='lower right') plt.show() 

Результатом сюжета является

введите описание изображения здесь

И полученный коэффициент:

 [3e-05, 128] initial guessed parameters [ 2.00773153e-04 1.22752179e+02] fitted parameters 

Поскольку все данные находятся внутри array A, scipy думает, что точки в массиве соединяются из одной точки в другую, в результате каждая кривая возвращается к началу координат, что также является началом последующих кривых.

Как мне закодировать в python , так что scipy.optimize.curve_fit знает, что данные в массиве состоят из нескольких кривых, а не одного единственного объединенных данных? Любые советы будут очень признательны.

2 Solutions collect form web for “Решение коэффициентов набора данных с использованием curve_fit из scipy.optimize”

Я отредактировал код (добавленный ниже), который вы дали немного, чтобы он был вырезан и вставлялся воспроизводимым в Python, если кто-то еще захочет попробовать его.

Хотя я не уверен, что понимаю ваш вопрос. Оказывается, x и y являются вашими независимыми (не зависимыми) переменными и z вашей зависимой переменной (т. Е. Вещью, вычисленной из каждой пары (x,y) ). В этом случае, я думаю, вам нужен трехмерный сюжет – в настоящее время, если я читаю это право, вы рисуете z vs x и не показываете y .

Предполагая, что вы действительно хотите это сделать, я согласен с комментариями, что было бы лучше, если бы вы разделили отдельные кривые друг от друга – я бы подумал, что возврат к нулю отрицательно влияет на вашу пригодность. Вы можете использовать np.where(A[:,0]==0)[0] чтобы найти индексы, где x==0 и использовать это в цикле для разделения A – хотя я думаю, np.split(A,np.where(A[:,0]==0)[0]) делает это для вас в одной строке.

 from scipy.optimize import curve_fit import numpy as np import matplotlib.pyplot as plt def func(data,a,b): return a/(data[:,1]*b)*np.log(1+(data[:,1]*b/a)*(1-np.exp(-a*data[:,0]))) A=np.array( (0.00000000e+00, 1.49761692e-05, 0.00000000e+00, 8.85000000e+02, 1.49761692e-05, 6.41362500e-02, 1.48500000e+03, 1.49761692e-05, 1.19340000e-01, 2.09000000e+03, 1.49761692e-05, 1.58760000e-01, 3.36000000e+03, 1.49761692e-05, 2.08080000e-01, 3.87000000e+03, 1.49761692e-05, 2.16933750e-01, 6.48000000e+03, 1.49761692e-05, 2.46746250e-01, 8.22000000e+03, 1.49761692e-05, 2.54700000e-01, 1.05300000e+04, 1.49761692e-05, 2.59470000e-01, 1.58250000e+04, 1.49761692e-05, 2.62035000e-01, 2.37600000e+04, 1.49761692e-05, 2.68751250e-01, 8.18400000e+04, 1.49761692e-05, 2.92848750e-01, 0.00000000e+00, 8.57250668e-06, 0.00000000e+00, 6.75000000e+02, 8.57250668e-06, 4.97436412e-02, 1.27500000e+03, 8.57250668e-06, 1.27749375e-01, 1.88000000e+03, 8.57250668e-06, 1.88617039e-01, 3.15000000e+03, 8.57250668e-06, 2.65089780e-01, 3.66000000e+03, 8.57250668e-06, 2.90344849e-01, 6.27000000e+03, 8.57250668e-06, 3.36295316e-01, 8.01000000e+03, 8.57250668e-06, 3.42702439e-01, 1.03200000e+04, 8.57250668e-06, 3.65205982e-01, 1.56150000e+04, 8.57250668e-06, 3.67269626e-01, 2.35500000e+04, 8.57250668e-06, 3.87296798e-01, 8.16300000e+04, 8.57250668e-06, 4.43486869e-01, 0.00000000e+00, 4.26671486e-06, 0.00000000e+00, 4.65000000e+02, 4.26671486e-06, 2.61407250e-02, 1.06500000e+03, 4.26671486e-06, 1.22371762e-01, 1.67000000e+03, 4.26671486e-06, 2.19629475e-01, 2.94000000e+03, 4.26671486e-06, 3.26680087e-01, 3.45000000e+03, 4.26671486e-06, 3.34340662e-01, 6.06000000e+03, 4.26671486e-06, 4.18330575e-01, 7.80000000e+03, 4.26671486e-06, 4.50631350e-01, 1.01100000e+04, 4.26671486e-06, 4.55053950e-01, 1.54050000e+04, 4.26671486e-06, 4.60937587e-01, 2.33400000e+04, 4.26671486e-06, 5.10770813e-01, 8.14200000e+04, 4.26671486e-06, 6.12569587e-01, 0.00000000e+00, 2.13335743e-06, 0.00000000e+00, 8.55000000e+02, 2.13335743e-06, 1.03773150e-01, 1.46000000e+03, 2.13335743e-06, 2.21130000e-01, 2.73000000e+03, 2.13335743e-06, 3.45515625e-01, 3.24000000e+03, 2.13335743e-06, 3.85634925e-01, 5.85000000e+03, 2.13335743e-06, 4.76061300e-01, 7.59000000e+03, 2.13335743e-06, 4.79220300e-01, 1.51950000e+04, 2.13335743e-06, 5.24709900e-01, 2.31300000e+04, 2.13335743e-06, 5.64829200e-01, 8.12100000e+04, 2.13335743e-06, 6.46568325e-01, 0.00000000e+00, 1.42359023e-06, 0.00000000e+00, 6.45000000e+02, 1.42359023e-06, 8.03596500e-02, 1.25000000e+03, 1.42359023e-06, 2.36700000e-01, 2.52000000e+03, 1.42359023e-06, 4.25941650e-01, 3.03000000e+03, 1.42359023e-06, 4.61683350e-01, 5.64000000e+03, 1.42359023e-06, 5.99561100e-01, 7.38000000e+03, 1.42359023e-06, 6.05952000e-01, 9.69000000e+03, 1.42359023e-06, 6.16958550e-01, 1.49850000e+04, 1.42359023e-06, 6.57434250e-01, 2.29200000e+04, 1.42359023e-06, 6.45954300e-01, 8.10000000e+04, 1.42359023e-06, 7.79689800e-01, 0.00000000e+00, 9.36010573e-07, 0.00000000e+00, 4.35000000e+02, 9.36010573e-07, 3.40200000e-02, 1.04000000e+03, 9.36010573e-07, 1.91160000e-01, 2.31000000e+03, 9.36010573e-07, 3.77640000e-01, 2.82000000e+03, 9.36010573e-07, 4.44240000e-01, 5.43000000e+03, 9.36010573e-07, 5.50440000e-01, 7.17000000e+03, 9.36010573e-07, 5.36580000e-01, 9.48000000e+03, 9.36010573e-07, 5.83740000e-01, 1.47750000e+04, 9.36010573e-07, 5.87340000e-01, 2.27100000e+04, 9.36010573e-07, 6.33060000e-01, 8.07900000e+04, 9.36010573e-07, 7.36200000e-01)) A = A.reshape(len(A)/3, 3) x= A[:,0] y= A[:,1] z= A[:,2] guess = [3.0e-5, 128 ] print guess, 'initial guessed parameters' params, pcov = curve_fit(func, A[:,:2], A[:,2], guess) print params, 'fitted parameters' plt.plot(x,func(A,params[0],params[1]),'-r',x,z,'o') plt.title('Plot') plt.legend(['Fit', 'Data'], loc='lower right', numpoints=1) plt.show() 

Кажется, что ваш набор данных A содержит все эти кривые спина к спине.

Вместо этого вы можете разделить свой набор данных каждый раз, когда A[:,0] == 0.00000000e+00 . Разделив его на 6 наборов данных, вы можете поместиться отдельно.

Но если я правильно понимаю вашу проблему, вам также понравятся параметры a и b для каждого набора данных, правильно?

Чтобы помочь вам достичь этого, я буду бесстыдно подключать мой пакет symfit , который обертывает curve_fit чтобы облегчить решение таких проблем.

В symfit вы сделаете следующее:

 from symfit import Fit, variables, parameters, log, exp datasets = [A_1, A_2, ...] # I'm going to assume this holds the untangled datasets one through six xs = variables('x_1, x_2, x_3, x_4, x_5, x_6') ys = variables('y_1, y_2, y_3, y_4, y_5, y_6') zs = variables('z_1, ...') # same for z a, b = parameters('a, b') model_dict = { z: a/(y * b) * log(1 + (y * b/a) * (1 - exp(- a * x))) for x, y, z in zip(xs, ys, zs) } 

Этот код создаст векторную модель, которая позволит вам одновременно подходить к этой системе уравнений (с одним и тем же экземпляром a и b в каждом!). Чтобы соответствовать, мы можем просто сделать следующее:

 fit = Fit(model_dict, x_1=datasets[0][:,0], x_2=datasets[1][:,0], ..., y_1=datasets[0][:,1], y_2=datasets[1][:,1], ..., z_1=datasets[0][:,2], z_2=datasets[1][:,2], ... ) 

Я не написал все в полном объеме, но надеюсь, это даст вам представление о том, как это сделать. Более подробную информацию можно найти в документах: symfit docs .

Обратите внимание, что я использовал символический exp и log, а не numpy.

  • Экстраполировать с помощью LinearNDInterpolator
  • Как выполнить двухдисковый односторонний t-тест с numpy / scipy
  • Scipy Отрицательное расстояние? Какие?
  • Получите матрицу U, Sigma, V * из усеченного SVD в scikit-learn
  • Numpy: Как случайное разбиение / выбор матрицы на n-различные матрицы
  • scipy: savefig без фреймов, осей, только контент
  • Почему numpy.array () иногда очень медленный?
  • Якобиан и Гессен в `scipy.optimize.minimize`
  •  
    Interesting Posts for Van-Lav

    Как получить размер файла / ключа в boto S3?

    Запуск winpdb изнутри Enthought Canopy на MacOS 10.9.2

    Запрещено (403) Проверка CSRF не удалась. Запрос прерван. Даже используя {% csrf_token%}

    Изменить шрифт и цвет фона в записной книжке ipython

    Как скопировать таблицу sqlite из базы данных диска в базу данных памяти в python?

    Django: Как поймать конкретное исключение в представлении на основе класса при создании шаблона?

    Самая чистая и быстрая настройка сервера для Django

    Удаление свойства JSON в массиве объектов с помощью Python

    Python и RabbitMQ – Лучший способ прослушивать события из нескольких каналов?

    Массовые сберегательные объекты SQLAlchemy

    genfromtxt возвращающие строки NaN

    С помощью boto, как я могу назвать недавно созданный экземпляр EC2?

    Как заставить сервопривод медленно достичь желаемого угла?

    Python Добавить запятую в строку номера

    Необходимо найти исходный код для print или printf в python

    Python - лучший язык программирования в мире.