Python 如何获得加权高斯滤波器

Python 如何获得加权高斯滤波器,python,numpy,scipy,gaussian,Python,Numpy,Scipy,Gaussian,我有一组加权的x,y点,如下所示(全套为): 我需要找到一条平滑的线,根据分配给每个点的重要性来调整这些点,即:权重越大,意味着数据点应该越相关 这是我到目前为止的代码,它基本上对数据应用了a(我从这个问题中得到了想法:): 此代码生成以下绘图(蓝色点的权重值较高): 问题是,这种拟合不考虑分配给每个点的权重。如何将这些信息引入高斯滤波器?请注意,以下想法不是一个精确的解决方案,但值得尝试 其思想是使用wweight参数重复x和y中的相应值。因此,如果将w缩放到范围[1,10]中,则x和y中的

我有一组加权的
x,y
点,如下所示(全套为):

我需要找到一条平滑的线,根据分配给每个点的重要性来调整这些点,即:权重越大,意味着数据点应该越相关

这是我到目前为止的代码,它基本上对数据应用了a(我从这个问题中得到了想法:):

此代码生成以下绘图(蓝色点的权重值较高):


问题是,这种拟合不考虑分配给每个点的权重。如何将这些信息引入高斯滤波器?

请注意,以下想法不是一个精确的解决方案,但值得尝试

其思想是使用
w
weight参数重复
x
y
中的相应值。因此,如果将
w
缩放到范围
[1,10]
中,则
x
y
中的所有对应值将被复制10次,使
w
等于10。也就是说,将创建新的
x
y
。通过这种方式,我们将权重合并为
x
y
中的值的频率。完成这项工作后,将新的输入到您的算法中,希望能够得到所需的结果,如下面的工作示例所示

  • 对于第一个图,蓝色到红色的光谱对应于从低到高的权重。标题编号为上文所述的复制系数
  • 对于第二个数字,您的数据,我们没有触及您的颜色格式


许多scipy插值允许指定权重@tom10你能给我指一个具体的吗?据我所见,单变量样条函数具有权重,但它要求x数组增加,这是我的数据不符合的条件。您是否知道numpy.interp文档中说:“xp:数据点的x坐标必须增加。”以及“不检查x坐标序列xp是否在增加。如果xp没有增加,那么结果是毫无意义的。”因此,对于其中任何一个,最好从排序开始(使用numpy.argsort,这样您就可以使用x一致地执行所有轴)@tom10我不确定我是否明白你的意思。如果我对数据进行排序,这将影响我尝试拟合/插值的点云的形状。你能以答案的形式展开一点你的意思吗?谢谢。不幸的是,我暂时没有在我可以访问的任何计算机上安装scipy,因此我无法给出完整的示例。但是,换句话说:排序不应该改变云的形状,它只意味着x值是有序的。也就是说,如果你有一堆(x,y)成对,每对中的值创建云的形状,您只需按其x值对它们进行排序。对于单独的x、y、w数组,则需要按x对所有x、y和w进行排序:例如,ysorted=y[np.argsor(x)],即,配对相同,但重新排序。虽然这不完全是我要求的,但似乎符合我的需要,因此我将其标记为已接受。非常感谢@Developer!
#  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
...
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()