Как получить взвешенный гауссовский фильтр

У меня есть набор взвешенных x,y точек, как показано ниже (полный набор находится здесь):

#  x       y     w
-0.038  2.0127  0.71
0.058   1.9557  1
0.067   2.0016  0.9
0.072   2.0316  0.83
...

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

Это код, который у меня есть до сих пор, который в основном применяет gaussian_filter1d к данным (я понял идею из этого вопроса: сглаживание линий алгоритм на питоне?):

import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import gaussian_filter1d

# Read data from file.
data = np.loadtxt('data_file', unpack=True)
x, y, w = data[0], data[1], data[2]

# Return evenly spaced numbers over a specified interval.
t = np.linspace(0, 1, len(x))
t2 = np.linspace(0, 1, 100)    
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x)
y2 = np.interp(t2, t, y)

# Obtain Gaussian filter with fixed sigma value.
sigma = 7
x3 = gaussian_filter1d(x2, sigma)
y3 = gaussian_filter1d(y2, sigma)

# Make plot.
cm = plt.cm.get_cmap('RdYlBu')
plt.scatter(x, y, marker="o", c=w, s=40, cmap=cm, lw=0.5, vmin=0, vmax=1)
plt.plot(x3, y3, "r", lw=2)
plt.show()

Этот код создает следующий график (более синие точки имеют более высокое значение веса):

plot

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


person Gabriel    schedule 26.09.2013    source источник
comment
Многие из умных интерполяций позволяют указывать веса. docs.scipy.org/doc/scipy/reference/interpolate.html   -  person tom10    schedule 26.09.2013
comment
@ tom10 Не могли бы вы указать мне на конкретный? Для того, что я видел, функция UnivariateSpline имеет веса, но требует, чтобы массив x увеличивался, а мои данные не соответствуют этому условию.   -  person Gabriel    schedule 26.09.2013
comment
Знаете ли вы, что в документации numpy.interp сказано: xp: x-координаты точек данных должны увеличиваться. и Не проверяет, что последовательность x-координат xp увеличивается. Если xp не увеличивается, результаты - ерунда. Итак, для любого из них может быть лучше начать с сортировки (используя numpy.argsort, чтобы вы могли последовательно выполнять все оси с x).   -  person tom10    schedule 26.09.2013
comment
@ tom10 Я не уверен, что понимаю тебя. Если я сортирую свои данные, которые повлияют на форму облака точек, я пытаюсь подогнать / интерполировать. Не могли бы вы немного расширить то, что вы имеете в виду, в форме ответа? Спасибо.   -  person Gabriel    schedule 26.09.2013
comment
К сожалению, у меня нет scipy, установленного ни на одном компьютере, к которому у меня будет доступ какое-то время, поэтому я не могу сделать полный пример. Но на словах: сортировка не должна изменять форму облака, это просто означает, что значения x в порядке. То есть, если у вас есть набор пар (x, y), values ​​ в каждой из этих пар создает форму облака, и вам просто нужно упорядочить их по их x-значениям. Для отдельных массивов x, y, w вам необходимо отсортировать все x, y и w по x: например, ysorted = y [np.argsor (x)], то есть пары такие же, но переупорядочены.   -  person tom10    schedule 26.09.2013
comment
@ tom10 О, теперь я понимаю, что ты имеешь в виду! Я исправлю вопрос, как только выясню, как сортировать массивы, о которых вы упомянули. Большое спасибо за то, что указали на это, я полностью пропустил это!   -  person Gabriel    schedule 28.09.2013


Ответы (1)


Обратите внимание, что следующая идея - это обходной путь, а не точное решение, но его стоит попробовать.

Идея состоит в том, чтобы использовать параметр веса w для повторения соответствующих значений в x и y. Так, если вы масштабируете w, например, в диапазон [1,10], все соответствующие значения в x и поэтому в y будут дублироваться 10 раз для w, равного 10. То есть будут созданы новые x, y. Таким образом, мы действительно включаем вес как частоту значений в x и y. После этого добавление новых в ваш алгоритм, надеюсь, даст вам желаемые результаты, как показано в приведенных ниже примерах.

  • На первом рисунке спектр от синего к красному соответствует весам от меньшего к большему. Числа в заголовке являются дублирующим фактором, как описано выше.
  • Для второго рисунка, ваших данных, мы не трогали ваш цветовой формат.

введите описание изображения здесь

введите описание изображения здесь

person Developer    schedule 27.09.2013
comment
Хотя это не совсем то, о чем я просил, похоже, он соответствует тому, что мне нужно, поэтому я отмечаю его как принятый. Большое спасибо @Developer! - person Gabriel; 05.10.2013