对于以下x值不等的曲线,我希望平滑y值。
这如何在Python中完成?
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import pandas as pd
x = [0,0.1, 0.3, 0.6,0.7, 0.8, 0.9, 1.2, 1.4, 1.6, 1.9, 2.1, 2.4, 2.6, 2.9, 3.1, 3.3, 3.6, 4.0, 4.1, 4.5, 4.7, 5.1, 5.6, 5.9, 6.1]
y = np.sin(x) + np.random.random(len(x)) * 0.4
df = pd.DataFrame(y,index=x)
plt.plot(df, "-o", markersize=2)
plt.grid()
plt.show()
答案 0 :(得分:2)
您可以采取许多措施来“平滑”曲线。一种有效的方法是查看scipy.interpolate库并使用UnivariateSpline function:
from scipy.interpolate import UnivariateSpline
x = np.array([0,0.1, 0.3, 0.6,0.7, 0.8, 0.9, 1.2, 1.4, 1.6, 1.9, 2.1, 2.4,
2.6, 2.9, 3.1, 3.3, 3.6, 4.0, 4.1, 4.5, 4.7, 5.1, 5.6, 5.9, 6.1])
y = np.sin(x) + np.random.random(len(x)) * 0.4
plt.plot(x, y, "-o", markersize=2)
s = UnivariateSpline(x,y)
x_interp = np.linspace(0, 6, 1000)
plt.plot(x_interp, s(x_interp), 'r-')
plt.xlabel('x')
plt.ylabel('y')
UnivariateSpline做什么?
我不是专家,但实际上您是在x
中不同点(或结)之间拟合分段多项式(指定度,这里使用默认参数)。内插的自由度随着结数或多项式次数的增加而增加。本质上,您是在最小化插值数据中的错误,但是不想过多地描述数据。
话虽如此,如果您知道信号的预期形式,则最好将正弦曲线拟合到数据中……