我有一组加权 x,y
点,如下所示(全套为here):
# 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应用于数据(我从这个问题得到了这个想法:line smoothing algorithm in python?):
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()
此代码生成以下图表(蓝点具有更高的权重值):
问题是这种拟合不考虑分配给每个点的权重。如何将这些信息引入高斯滤波器?
答案 0 :(得分:5)
请注意,以下想法是解决方法而不是一个确切的解决方案,但值得尝试。
我们的想法是使用w
权重参数重复x
和y
中的相应值。因此,如果您将w
扩展到范围[1,10]
,x
中的所有相应值,y
中的所有相应值将重复10次,w
等于10。也就是说,将创建新的x
,y
。通过这种方式,我们确实将权重作为x
和y
中的值的频率。完成这项工作后,将新的算法提供给您的算法有望为您提供所需的结果,如下面的工作示例所示。