Как использовать curve_fit из scipy.optimize с общим параметром подгонки для нескольких наборов данных? - PullRequest
0 голосов
/ 14 февраля 2020

При условии, что у меня есть функция подгонки f с несколькими параметрами, например a и b. Теперь я хочу вписать несколько наборов данных в эту функцию и использовать один и тот же a для всех них (общий параметр), тогда как b может быть индивидуальным для каждого соответствия.

Пример:

import numpy as np

# Fit function
def f(x, a, b):
    return a * x + b

# Datasets
x = np.arange(4)
y = np.array([x + a + np.random.normal(0, 0.5, len(x)) for a in range(3)])

Итак, у нас есть 4 значения x и 3 набора данных по 4 года в каждом.

1 Ответ

0 голосов
/ 14 февраля 2020

Один из способов сделать это - объединить наборы данных и использовать настроенную функцию подгонки.

В следующем примере это происходит внутри новой функции подбора g с np.concatenate. Индивидуальные подборы для каждого набора данных также выполняются, поэтому мы можем сравнить их график с каскадным подбором с помощью общего параметра.

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


# Create example datasets

x = np.arange(4)
y = np.array([x + a + np.random.normal(0, 0.5, len(x)) for a in range(3)])
print("x =", x)
print("y =", y)


# Individual fits to each dataset

def f(x, a, b):
    return a * x + b

for y_i in y:
    (a, b), _ = curve_fit(f, x, y_i)
    plt.plot(x, f(x, a, b), label=f"{a:.1f}x{b:+.1f}")
    plt.plot(x, y_i, linestyle="", marker="x", color=plt.gca().lines[-1].get_color())

plt.legend()
plt.show()


# Fit to concatenated dataset with shared parameter

def g(x, a, b_1, b_2, b_3):
    return np.concatenate((f(x, a, b_1), f(x, a, b_2), f(x, a, b_3)))

(a, *b), _ = curve_fit(g, x, y.ravel())
for b_i, y_i in zip(b, y):
    plt.plot(x, f(x, a, b_i), label=f"{a:.1f}x{b_i:+.1f}")
    plt.plot(x, y_i, linestyle="", marker="x", color=plt.gca().lines[-1].get_color())

plt.legend()
plt.show()

Вывод:

x = [0 1 2 3]
y = [[0.40162683 0.65320576 1.92549698 2.9759299 ]
 [1.15804251 1.69973973 3.24986941 3.25735249]
 [1.97214167 2.60206217 3.93789235 6.04590999]]

Индивидуальные подборки с тремя различными значениями для a:

Figure 1

Подходит с общим параметром a:

Figure 2

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