使用sklearn线性回归(Linear Regression)

一、Linear Regression

线性回归是相对简单的一种,表达式如下

使用sklearn线性回归(Linear Regression)

其中,θ0表示bias,其他可以看做weight,可以转换为如下形式

使用sklearn线性回归(Linear Regression)

为了更好回归,定义损失函数,并尽量缩小这个函数值,使用MSE方法(mean square equal)

使用sklearn线性回归(Linear Regression)

缩小方法采用梯度下降法,即不断地向现在站立的山坡往下走,走的速度就是学习速率η(learning rate),太小耗尽计算资源,太大走过了山谷。

(1)Normal Equation

使用sklearn线性回归(Linear Regression)
from sklearn.linear_model import LinearRegression
 import numpy as np
 import matplotlib.pyplot as plt
 
 # 数据集
 X = 2*np.random.rand(100, 1)
 y = 4+3*X+np.random.randn(100,1)
 
 # X每个元素加1
 X_b = np.c_[np.ones((100,1)), X]
 theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
 
 # 训练
 lin_reg = LinearRegression()
 lin_reg.fit(X, y)
 print(lin_reg.intercept_, lin_reg.coef_)
 
 # 测试数据
 X_new = np.array([[0],[2]])
 X_new_b = np.c_[np.ones((2,1)), X_new]
 y_predict = X_new_b.dot(theta_best)
 print(y_predict)
 
 # 画图
 plt.plot(X_new, y_predict, "r-")
 plt.plot(X, y, "b.")
 plt.axis([0,2,0,15])
 plt.show()
使用sklearn线性回归(Linear Regression)

(2)Batch Gradient Descent

基本算是遍历了所有数据,不适用于数据规模大的数据

使用sklearn线性回归(Linear Regression)
# BGD梯度下降
 eta = 0.1
 n_iterations = 1000
 m = 100
 theta = np.random.randn(2,1)
 for iteration in range(n_iterations):
     gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
     theta = theta - eta*gradients
 print(theta)

使用sklearn线性回归(Linear Regression)可以看出,结果是差不多的

(3)Stochastic Gradient Descent

可以避免局部最优结果,但是会震来震去。为了防止这种震荡,让学习速率η不断减小(类似模拟退火)

# SGD梯度下降
m = 100
n_epochs = 50
t0, t1 = 5, 50 # η初始值0.1
def learning_schedule(t):
    return t0 / (t + t1)

theta = np.random.randn(2,1) # random initialization
for epoch in range(n_epochs):
    for i in range(m):
        random_index = np.random.randint(m)
        xi = X_b[random_index:random_index+1]
        yi = y[random_index:random_index+1]
        gradients = 2 * xi.T.dot(xi.dot(theta) - yi)
        eta = learning_schedule(epoch * m + i)
        theta = theta - eta * gradients
print(theta)

# sklearn 提供了SGDRegressor的方法
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter=50, penalty=None, eta0=0.1)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.intercept_, sgd_reg.coef_)

(4)Min-batch Gradient Descent

使用小批随机数据,结合SGD与BGD优点

以下是各种方法对比

使用sklearn线性回归(Linear Regression)

二、Polynomial Regression

但有的时候,y本身是由x取平方所得,无法找出来一条合适的线性回归线来拟合数据,该怎么办呢?

我们可以尝试将x取平方,取3次方等方法,多加尝试

相关推荐