使用sklearn线性回归(Linear Regression)
一、Linear Regression
线性回归是相对简单的一种,表达式如下
其中,θ0表示bias,其他可以看做weight,可以转换为如下形式
为了更好回归,定义损失函数,并尽量缩小这个函数值,使用MSE方法(mean square equal)
缩小方法采用梯度下降法,即不断地向现在站立的山坡往下走,走的速度就是学习速率η(learning rate),太小耗尽计算资源,太大走过了山谷。
(1)Normal Equation
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()
(2)Batch Gradient Descent
基本算是遍历了所有数据,不适用于数据规模大的数据
# 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)
可以看出,结果是差不多的
(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优点
以下是各种方法对比
二、Polynomial Regression
但有的时候,y本身是由x取平方所得,无法找出来一条合适的线性回归线来拟合数据,该怎么办呢?
我们可以尝试将x取平方,取3次方等方法,多加尝试
相关推荐
lhxxhl 2020-01-14
机器学习之家 2020-11-10
lgblove 2020-10-26
Pokemogo 2020-10-05
meylovezn 2020-08-25
竭尽全力 2020-07-28
竭尽全力 2020-07-13
rainchxy 2020-06-16
wndong 2020-06-14
nurvnurv 2020-06-08
Hannah 2020-05-28
sayhaha 2020-05-26
PythonMaker 2020-05-09
playoffs 2020-05-01
HMHYY 2020-04-30
CYJ0go 2020-04-26
playoffs 2020-04-24
playoffs 2020-04-22