正弦函数与回归算法

回归算法一般可以用于连续值的预测的情况。最简单的自然就是一元函数的情况,比如正弦函数:

>>> import numpy as np  
>>> n_dots = 500  
>>> X = np.linspace(-2 * np.pi,2*np.pi,n_dots)  
>>> Y = np.sin(X) + 0.2 * np.random.rand(n_dots) - 0.1  
>>> X = X.reshape(-1,1) #自行转换为1维向量  
>>> Y = Y.reshape(-1,1) #自行转换为1维向量

接着开启交互模式的绘图模式:

>>> from matplotlib import pyplot as plt  
>>> plt.interactive(True)  
>>> plt.scatter(X,Y)

下面引入线性回归算法:

>>> from sklearn.linear_model import LinearRegression  
>>> linear = LinearRegression()  
>>> linear.fit(X,Y)

根据样例数据进行拟合。之后进行对应数值的拟合及模型评估:

>>> pred = linear.predict(X)  
>>> plt.plot(X,pred)  
>>> linear.score(X,Y)  
0.1520015546428054

可以看到,使用线性模型完全就是不行的。因此有必要更换模型。
下面使用岭回归试试看:

>>> from sklearn.linear_model import Ridge  
>>> ridge = Ridge()  
>>> ridge.fit(X,Y)

结果重复上述的操作会发现,效果是一样的。毕竟岭回归也是线性回归中的1种。
接着尝试使用多项式的方式来解决,毕竟上述的数值太低,说明是欠拟合,需要增加维度:

>>> from sklearn.preprocessing import PolynomialFeatures  
>>> quad = PolynomialFeatures(degree=3)  
>>> x = quad.fit_transform(X)  #进行多项式拟合并变换  
>>> model_quad = LinearRegression()  
>>> model_quad.fit(x,Y)  
>>> pred = model_quad.predict(x)[:,-1]  
>>> plt.plot(X,pred)  
>>> model_quad.score(x,Y)  
0.2840243428573178

可以看到,采用多项式的方式比线性的方式稍微有所提升。那么我们考虑使用线性加多项式的方式:

>>> from sklearn.pipeline import Pipeline  
>>> def polynomial_model(degree=1):  
...     poly = PolynomialFeatures(degree=degree)  
...     linear = LinearRegression()  
...     pipeline = PipeLine([("polynomial_features",poly),("linear_regression",linear)])  
...     return pipeline  
...   
>>> model = polynomial_model(degree=5)  
>>> model.fit(X,Y)  
>>> model.score(X,Y)  
0.8998668264018288  
>>> pred = model.predict(X)  
>>> plt.plot(X,pred)

可以发现随着多项式项数的增加,其拟合度越越来越高。

若文章对您有帮助,请打赏1块钱。您的支持,可以让我分享更多精彩的文章。转载请注明来源


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。