Подгонка сплайна через разброс

У меня есть два набора данных, из которых я хочу найти корреляцию. Хотя существует довольно некоторый разброс данных, связь очевидна. В настоящее время я использую numpy polyfit (8-й порядок), но есть некоторое «покачивание» строки (особенно в начале и в конце), что неуместно. Во-вторых, я не думаю, что посадка в начале линии не очень хорошая (кривая должна быть немного круче.

Как я могу получить наиболее подходящий «сплайн» через эти точки данных?

Разброс данных с полифитом

Мой текущий код:

# fit regression line
regressionLineOrder = 8
regressionLine = np.polyfit(data['x'], data['y'], regressionLineOrder)
p = np.poly1d(regressionLine)

person Yorian    schedule 25.04.2017    source источник
comment
Это может быть скорее перекрестная проверка, но в любом случае эти эффекты естественны для полиномиальной подгонки. Если вы хотите получить лучшую кривую, вам может понадобиться более продвинутая техника регрессии; scikit-learn предоставляет несколько алгоритмов. Гауссовский процесс может быть здесь хорошим выбором, хотя может быть слишком много данных, чтобы использовать его напрямую. .   -  person jdehesa    schedule 25.04.2017


Ответы (1)


Взгляните на ответ @MatthewDrury для Зачем использовать регуляризацию в полиномиальной регрессии вместо понижения степени?. Это просто фантастика и в точку. Самое интересное начинается в конце, когда он начинает говорить об использовании натурального кубического сплайна для подбора регрессии вместо регуляризованного полинома степени 10. Вы можете использовать реализацию scipy.interpolate.CubicSpline, чтобы выполнить что-то очень похожее. Существует множество классов для других методов сплайна, содержащихся в scipy.interpolate для подобные методы.

Вот простой пример:

from scipy.interpolate import CubicSpline

cs = CubicSpline(data['x'], data['y'])
x_range = np.arange(x_min, x_max, some_step)
plt.plot(x_range, cs(x_range), label='Cubic Spline')
person Grr    schedule 25.04.2017