Учитывая, что у меня есть массив X и Y такой, что:
X = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
и
Y = np.array([-19.9, -19.6, -17.6, -15.9, -19.9, -18.4, -17.7, -16.6, -19.5, -20.4, -17.6, -15.9])
Я получаю график типа:
Здесь есть 3 очень четких пика, которые я вижу.Я могу подобрать эти данные, используя:
# fit polynomial
z = np.polyfit(X1, Y, 8)
f = np.poly1d(z)
# calculate new x's and y's
x_new = np.linspace(X[0], X[-1], 100)
y_new = f(x_new)
, и могу получить следующее, которое показывает изменение сигнала в течение года - в данном случае в рисовом земледелии и количестве сельскохозяйственных циклов (3 пика)):
Здесь я использую scipy.signal.argrelextrema, чтобы найти пики и впадины кривой.Однако, чтобы получить кривую с хорошей подгонкой, это очень «ручной» подход, и мне нужно сначала интерпретировать данные на глаз, чтобы выбрать порядок полиномов.Я буду повторять этот процесс на многих наборах данных (100 000), поэтому я не смогу делать это каждый раз вручную.
Кроме того, число пиков, которые у меня есть, вероятно, изменится.На самом деле моя конечная цель - классифицировать наборы данных по количеству пиков, которые я могу обнаружить.Есть также случаи, когда сигнал имеет больше шума.
Я изучил scipy.signal.find_peaks (и связанные алгоритмы), но это находит все пики, а не только основные, особенно в шумных данных.Я также изучил фильтры savgol и гауссовские фильтры и могу получить результат, но часто приходится указывать порядок полинома и т. Д., Который может меняться в зависимости от количества пиков.
Есть ли способсгладить сигнал, чтобы получить аппроксимацию количества пиков без необходимости вручную указывать полиномиальные порядки и т. д.?Существует ли алгоритм / метод, который может обнаруживать общие тенденции без слишком большого вмешательства пользователя?
Я также открыт для альтернативных методов, если есть лучший метод, чем подгонка кривой.Я боюсь, что результат, который я получу, будет таким же хорошим, как и то, что я положил, и поэтому любые общие методы подбора кривой будут давать худшие результаты.