Вменяемая кубическая интерполяция для «большого» набора данных, альтернатива interp1d? - PullRequest
3 голосов
/ 28 декабря 2011

Я работаю со звуковыми данными, поэтому мои наборы данных обычно составляют от 40000 до 120000 точек (от 1 до 3 секунд).В настоящее время я использую линейную интерполяцию для некоторых задач, и я хотел бы использовать кубическую интерполяцию для улучшения некоторых результатов.

Я использовал interp1d с kind='linear' для генерации функции интерполяции.Это прекрасно работает и очень интуитивно понятно.

Однако, когда я переключаюсь на kind='cubic', мой компьютер сходит с ума - память начинает биться, окно Emacs темнеет, указатель мыши начинает двигаться очень медленно,и жесткий диск становится очень активным.Я предполагаю, что это потому, что он использует много памяти.Я вынужден (очень медленно) открыть новое окно терминала, запустить htop и завершить процесс Python.(Я должен был упомянуть, что использую Linux.)

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

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

Редактировать:Я только что попробовал UnivariateSpline, и это почти то, что я ищу.Проблема в том, что интерполяция не затрагивает все точки данных.Я ищу что-то, что генерирует плавные кривые, которые проходят через все точки данных.

Edit2: Похоже, что InterpolatedUnivariateSpline - это то, что я искал.

1 Ответ

1 голос
/ 06 декабря 2013

У меня была похожая проблема в интерполяции ND.Моим решением было разделить данные на домены и построить функции интерполяции для каждого домена.

В вашем случае вы можете разбить данные на группы по 500 точек и интерполировать их в зависимости от того, где вы находитесь.

f1 = [0,...495]
f2 = [490,...,990]
f3 = [985,...,1485]
..
.
.
.

и т. Д.

Также убедитесь, что интервалы каждой функции перекрываются.В примере перекрытие составляет 5 баллов.Я полагаю, вам нужно поэкспериментировать, чтобы определить оптимальное перекрытие.

Надеюсь, это поможет.

...