Есть ли способ построить кривую наилучшего соответствия без функции? Питон

Мне нужно построить гладкую кривую наилучшего соответствия, но все методы, которые я нашел, используют scipy.optimize.curve_fit(), и для этого требуется знать функцию, связывающую x и y. Есть ли более простой способ сделать это для основных точечных диаграмм?

Для чего я пытаюсь получить кривую:

import matplotlib.pyplot as plot

x = range(30)
y = [1, 1, 1, 2, 1, 1, 1, 2, 4, 5, 8, 12, 13, 14, 12, 11, 9, 6, 5, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1 ]

plot.plot(x, y, "o")
plot.show()

Любая помощь будет принята с благодарностью.


person harpreet bains    schedule 05.05.2015    source источник
comment
Что вы подразумеваете под the curve для ситуации, когда вы не знаете функцию? Ваши данные кажутся довольно гауссовыми - вы ищете гауссовскую подгонку к этим данным?   -  person Tom    schedule 06.05.2015
comment
Да, но разве мне не нужно знать конкретную функцию Гаусса, связывающую x с y, чтобы получить точную кривую?   -  person harpreet bains    schedule 06.05.2015


Ответы (1)


Обычно для сглаживания без угадывания производящей функции используют сплайн. Вот пример использования ваших данных:введите здесь описание изображения

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
import numpy as np

x = range(30)
y = [1, 1, 1, 2, 1, 1, 1, 2, 4, 5, 8, 12, 13, 14, 12, 11, 9, 6, 5, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1 ]

s = UnivariateSpline(x, y, s=5)
xs = np.linspace(0, 29, 100)
ys = s(xs)

plt.plot(x, y, 'o')
plt.plot(xs, ys)
plt.show()

Как вы, наверное, догадались, ключевое слово s используется для установки того, насколько точно подгонка соответствует данным, где s=0 будет проходить через каждую точку.

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

В scipy есть множество сплайновых процедур на выбор.

person tom10    schedule 06.05.2015
comment
Здорово. Из комментариев к вашему основному вопросу показалось, что вы можете предпочесть использовать гауссиан, что также возможно, но сильно отличается от этого решения. Пожалуйста, уточните, хотите ли вы сделать полную подгонку. - person tom10; 06.05.2015
comment
немного раздражает мои данные, что x должно строго увеличиваться для ввода в UnivariateSpline. в моем случае я просто усредняю ​​значения y для заданного x перед переходом к UnivariateSpline, но было бы неплохо иметь одну функцию, которая автоматически позаботится об этом. - person dbliss; 15.11.2019