拟合的定义:形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。 因为这条曲线有无数种可能,从而有各种拟合方法。 拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。------百度百科
多项式曲线拟合:使用多项式找到x和y之间的函数关系式
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
def uniform(size):
x = np.linspace(0,1,size)#生成0-1 size个数
return x.reshape(size,1)#改变形状10行1列
def create_data(size):
x = uniform(size)
np.random.seed(42)#每一次生成相同的随机数
y = sin_fun(x)+np.random.normal(scale=0.15, size=x.shape)#高斯分布scale为标准差
return x,y
def sin_fun(x):
return np.sin(2*np.pi*x)
X_train,y_train = create_data(10)
X_test = uniform(100)
y_test = sin_fun(X_test)
plt.scatter(X_train,y_train,facecolor="none", edgecolor="b", s=50, label="training data")
plt.plot(X_test,y_test,c="g",label="$\sin(2\pi x)$")
plt.ylabel("y",size=20)
plt.xlabel("x",size=20)
plt.legend()
plt.show()
fig = plt.figure(figsize=(12,8))#创建一个图形实例12*8
for i,order in enumerate([0,1,3,9]):
plt.subplot(2,2,i+1)#绘制子图
poly = PolynomialFeatures(order)#生成特征式order为2时
X_train_ploy = poly.fit_transform(X_train)#fit_transform先拟合数据再标准化
X_test_ploy = poly.fit_transform(X_test)
lr = LinearRegression()
lr.fit(X_train_ploy,y_train)
y_pred = lr.predict(X_test_ploy)
plt.scatter(X_train,y_train,facecolor="none", edgecolor="b", s=50, label="training data")
plt.plot(X_test,y_pred,c="r",label="fitting")
#plt.plot(X_test,y_test,c="g",label="$\sin(2\pi x)$")
plt.plot(X_train_ploy,y_train,c="g",label="$\sin(2\pi x)$")
plt.title("M={}".format(order))
plt.legend()
plt.show()
另外一种拟合的函数
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
z1 = np.polyfit(x, y, 5)#用3次多项式拟合
print(z1)
p1 = np.poly1d(z1)
print(p1) #在屏幕上打印拟合多项式
yvals=p1(x)#也可以使用yvals=np.polyval(z1,x)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)#指定legend的位置,读者可以自己help它的用法
plt.title('polyfitting')
plt.show()