机器学习经典算法之(十九)多项式回归

(一)多项式回归简介:

在上一篇的一般线性回归中,使用的假设函数是一次方程,假设数据集呈简单线性关系,但实际上,很多不是非线性的,直线方程无法很好的拟合数据的情况,这个时候可以尝试使用多项式回归方式。

多项式回归中,加入了特征的更高次方,也相当于增加了模型的自由度,用来捕获数据中非线性的变化。添加高阶项的时候,也增加了模型的复杂度。随着模型复杂度的升高,模型的容量以及拟合数据的能力增加,可以进一步降低训练误差,但导致过拟合的风险也随之增加。

(二)多项式回归实现原理:

我们以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))

猜你喜欢

转载自blog.csdn.net/weixin_42039090/article/details/80740330