多项式曲线拟合

拟合的定义:形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。 因为这条曲线有无数种可能,从而有各种拟合方法。 拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。------百度百科

 

多项式曲线拟合:使用多项式找到xy之间的函数关系式

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值