(一)多项式回归简介:
在上一篇的一般线性回归中,使用的假设函数是一次方程,假设数据集呈简单线性关系,但实际上,很多不是非线性的,直线方程无法很好的拟合数据的情况,这个时候可以尝试使用多项式回归方式。
多项式回归中,加入了特征的更高次方,也相当于增加了模型的自由度,用来捕获数据中非线性的变化。添加高阶项的时候,也增加了模型的复杂度。随着模型复杂度的升高,模型的容量以及拟合数据的能力增加,可以进一步降低训练误差,但导致过拟合的风险也随之增加。
(二)多项式回归实现原理:
我们以y=ax2为例。实际上就是将x2作为一个特征值。
__author__ = 'Administrator'
import sys
import numpy as np
import matplotlib.pyplot as plt
x=np.random.uniform(-3,3,size=100)
X=x.reshape(-1,1)
y=2*x**2+3*x+2+np.random.normal(0,1,size=100)
plt.scatter(X,y,c='g')
from sklearn import linear_model
linear_regressor = linear_model.LinearRegression()
linear_regressor.fit(X, y)
y_pred=linear_regressor.predict(X)
plt.plot(X,y_pred,c='red')
#解决方案,添加一个特征值。
x2=np.hstack([X,X**2])
# print(x2)
linear_regressor2 = linear_model.LinearRegression()
linear_regressor2.fit(x2, y)
y_pred2=linear_regressor2.predict(x2)
plt.plot(np.sort(x),y_pred2[np.argsort(x)],c='b')
plt.show()
print(linear_regressor2.coef_)
print(linear_regressor2.intercept_)
当然,我们拟合的自由度越高,就需要添加的特征值就越多,计算复杂度急剧上升。如果是输入样本具有两个特征值(依然为2阶),那么,就需要分别计算X12、X22、x1x2加上原来的两个,这样需要计算5个特征值的线性回归样本了。
(三)sklearn中多项式实现方法:
import sys
import numpy as np
filename = "test.txt"
X = [];y = []
with open(filename, 'r') as f:
for line in f.readlines():
data = [float(i) for iin line.split(',')]
xt, yt = data[:-1],data[-1]
X.append(xt)
y.append(yt)
train = int(0.7* len(X))
test = len(X) - train
X_train = np.array(X[:train])
y_train = np.array(y[:train])
X_test = np.array(X[train:])
y_test = np.array(y[train:])
from sklearn import linear_model
linear_regressor = linear_model.LinearRegression()
linear_regressor.fit(X_train, y_train)
from sklearn.preprocessing import PolynomialFeatures
polynomial = PolynomialFeatures(degree=3)
X_train_transformed = polynomial.fit_transform(X_train)
datapoint = np.array([[-0.13,1.47,4.46]]) #样本真值为-9.81
poly_datapoint = polynomial.fit_transform(datapoint)
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(X_train_transformed, y_train)
print("Linear regression:\n",linear_regressor.predict(datapoint))
print("Polynomial regression:\n",poly_linear_model.predict(poly_datapoint))
poly_linear_model = linear_model.LinearRegression()
poly_linear_model.fit(X_train_transformed, y_train)
print("\nLinear regression:\n",linear_regressor.predict(datapoint))
print("\nPolynomial regression:\n",poly_linear_model.predict(poly_datapoint))