В настоящее время я работаю с переменными звездными данными, и мне нужно сгладить данные временных рядов. У меня есть многочисленные (десятки тысяч) точек данных, разбросанных по диапазону времени. Чтобы упростить задачу, я разбил данные на 1001 интервал времени, и именно с помощью этого усредненного набора данных я пытаюсь нарисовать плавную кривую.
Я пробовал несколько различных методов. , но ни один из них не работает идеально. Два наиболее перспективных - выполнить свертку с NumPy и использовать фильтр Савицкого-Голея от SciPy. Некоторый код для этого здесь:
# Define a smoothing algorithm using the convolve function in NumPy. The function
# will use a window of 3 points surrouding each point.
window_len = 3
kernel = np.ones(window_len, dtype=float) / window_len
y_smooth = np.convolve(full_average_array, kernel, "same")
y_smooth2 = savgol_filter(full_average_array, 11, 2)
# Run the smoothing algorithm for 50 loops to better smooth annoying light curves.
for n in range(0, 50):
y_smooth = np.convolve(y_smooth, kernel, "same")
y_smooth2 = savgol_filter(y_smooth2, 5, 3)
Как я уже сказал, ни один не работает идеально. Вот некоторые увеличенные изображения выходных данных:
![This shows the waviness of the Savitzky-Golay filter (blue) and the smoothness of the convolution (green), but the Savitzky-Golay filter method better approximates the large dip around phi = 0](https://i.stack.imgur.com/6phvJ.png)
Это показывает волнистость фильтра Савицкого-Голея (синего цвета) и плавность свертки (зеленый), но метод фильтра Савицкого-Голея лучше приближается к большому провалу около phi = 0
![This shows that the Savitzky-Golay filter method is a much better representation of the minimum than the convolution.](https://i.stack.imgur.com/8ttZb.png)
Это показывает, что метод фильтра Савицкого-Голея является гораздо лучшим представлением минимума, чем свертка.
Каждый раз, когда я увеличиваю числа, чтобы сделать кривую более гладкой, кривая является худшим приближением к наблюдаемым данным. Мне нужна кривая, которая была бы достаточно гладкой и подходила бы для данных, но я не нашла хорошего метода для достижения этой цели. Какие функции / методы мне следует использовать в этом случае?