Взвешенная 1D-интерполяция точки облачных данных - PullRequest
0 голосов
/ 27 июня 2019

У меня есть облако точек данных (x, y), которые я хотел бы интерполировать и сгладить.

В настоящее время я использую scipy:

from scipy.interpolate import interp1d
from scipy.signal import savgol_filter

spl = interp1d(Cloud[:,1], Cloud[:,0]) # interpolation
x = np.linspace(Cloud[:,1].min(), Cloud[:,1].max(), 1000)
smoothed = savgol_filter(spl(x), 21, 1) #smoothing

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

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

1 Ответ

2 голосов
/ 27 июня 2019

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

В зависимости от вашей цели,Вы можете посмотреть другие методы интерполяции, например, B-сплайны .Затем вы можете использовать scipy scipy.interpolate.splrep и установить аргумент w:

w - Строго положительный массив весов ранга 1 такой же длины, что и x и y,Веса используются при вычислении взвешенного соответствия сплайна наименьших квадратов.Если ошибки в значениях y имеют стандартное отклонение, заданное вектором d, то w должно быть 1 / d.По умолчанию единицы (len (x)).

...