我正在尝试使用样条曲线绘制点+平滑线。但该线“超过”某些点,例如在下面的代码中,超过0.85点。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline
x=np.array([0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2])
y=np.array([0.57,0.85,0.66,0.84,0.59,0.55,0.61,0.76,0.54,0.55,0.48])
x_new = np.linspace(x.min(), x.max(),500)
y_smooth = spline(x, y, x_new)
plt.plot (x_new,y_smooth)
plt.scatter (x, y)
我该如何解决?
答案 0 :(得分:6)
您可以尝试在scipy.interpolate中使用interp1d:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
x=np.array([0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2])
y=np.array([0.57,0.85,0.66,0.84,0.59,0.55,0.61,0.76,0.54,0.55,0.48])
x_new = np.linspace(x.min(), x.max(),500)
f = interp1d(x, y, kind='quadratic')
y_smooth=f(x_new)
plt.plot (x_new,y_smooth)
plt.scatter (x, y)
产生:
kind
参数的其他一些选项位于文档中:
kind:str或int,optional指定插值的类型为字符串('linear','nearest','zero','slinear','quadratic','cubic',其中'zero','slinear' ,“二次”和“立方”是指第零,第一,第二或第三阶的样条插值)或指定要使用的样条插值器的阶数的整数。默认为“线性”。
答案 1 :(得分:0)
您也可以尝试使用来自 scipy 的径向基函数插值的 thin plate spline:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf
x = np.array([0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2])
y = np.array([0.57,0.85,0.66,0.84,0.59,0.55,0.61,0.76,0.54,0.55,0.48])
x_new = np.linspace(x.min(), x.max(), 500)
rbf = Rbf(x, y, function = 'thin_plate', smooth = 0.001)
y_smooth = rbf(x_new)
plt.plot(x_new, y_smooth)
plt.scatter (x, y);
通过改变 smooth
参数可以获得更好的数据近似值。
要考虑的替代 function
参数值包括“multiquadric”、“inverse”、“gaussian”、“linear”、“cubic”和“quintic”。在考虑 function
值时,我通常先尝试 'thin_plate',然后是 'cubic'。
检查 scipy.interpolate.Rbf docs 中的其他 Rbf 选项。