Как добиться наилучшего соответствия строки вместо логарифмического

#python #curve-fitting #scipy-optimize

#python #подгонка кривой #scipy-оптимизация

Вопрос:

Я попытался подогнать линию наилучшего соответствия к своим точкам данных, используя scipy.optimize.curvefit функцию:

 x = np.array([0,2246,2600,3465,4392])
y = [-0.763,0.052,0.081,0.266,0.179]
yerror = [0.201,0.113,0.139,0.162,0.204]
plt.errorbar(wavelength,A,yerr=B, xerr=None, fmt='o')

def func(x, a, b, c):#the best fit function
    return a   (b * x)**c 

popt, pcov = scipy.optimize.curve_fit(func, x, y)
x_fit = np.linspace(0, np.max(x), 1000) # create curve line of best fit

plt.plot(x_fit, func(x_fit, *popt), "b")
 

Мое значение popt равно: array([-7.63283206e-01, 2.23580046e-04, 2.63164486e-01])
где первое значение -7.63283206e-01 — это перехват, я хочу, чтобы он отображался на графике.

Точки данных и наилучшая подгонка нанесены здесь с использованием приведенного выше кода и дают логарифмическую кривую, но я хочу, чтобы линия наилучшей подгонки проходила через ось y вот так, чтобы проиллюстрировать более прямую кривую.

Заранее спасибо!

Комментарии:

1. Кривая, которую вы получили в своем коде, выглядит намного лучше, чем кривая, которую вы хотели бы получить.

2. На вашем целевом графике есть еще одна точка данных, не так ли? Около x = 5500

3. @foglerit Моя текущая линия наилучшего соответствия не соответствует моим ожидаемым результатам более линейной кривой, я беспокоюсь, что мне придется применить простую прямую «линию наилучшего соответствия»

4. @itaishz Да, это так, но моя точка зрения по-прежнему остается в силе относительно того, как добиться такого наилучшего соответствия, я подозреваю, что красные точки считаются выбросами, но даже в этом случае я не уверен, как это закодировать таким образом

5. @VictorSong если вам нужна прямая линия, попробуйте ограничить некоторые параметры (возможно c ) или использовать другую функцию подгонки. Если вы подозреваете, что точка данных является выбросом, не включайте ее.

Ответ №1:

«Наилучшее соответствие» ничего не значит, пока не будут указаны критерии подгонки (наименьшая среднеквадратичная ошибка или относительная ошибка наименьшего квадрата или наименьшая средняя абсолютная ошибка или т. Д.). «Наилучшее соответствие» отличается для каждого из них.

Поскольку критерии подгонки не указаны, почему бы не выбрать самый простой метод, без итеративного процесса и без необходимости угадывать начальные значения параметров.

Метод, приведенный ниже, из https://fr.scribd.com/doc/14674814/Regressions-et-equations-integrales дает :

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

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

Если вы укажете конкретные критерии подгонки, то потребуется итеративный метод с угаданными начальными значениями. Вы можете использовать приведенные выше значения a, b, c в качестве начальных значений для надежной и быстрой конвергенции.