利用梯度下降法代替最小二乘法,求线性回归方程。
首先引用库
import numpy as np
import matplotlib.pyplot as plt
定义相应的x和y
np.random.seed(666)
x = np.random.random(size=100)
y = x * 3. + 4. + np.random.normal(size=100)
绘制散点图
封装算法·
def J(x_b,y,theta):
return np.sum((y - x_b.dot(theta))**2)/len(theta)
def dJ(x_b,y,theta):
res = np.empty(len(theta))
res[0] = np.sum(x_b.dot(theta) - y)
for i in range(1,len(theta)):
res[i] = (x_b.dot(theta) - y).dot(x_b[:,i])
return 2/len(x_b)*res
def gradient_descent(x_b,y,eta,esplison,inital_theta,n_iter=1e4):
theta = inital_theta
crue_iter = 0
while crue_iter < n_iter:
gradient = dJ(x_b,y,theta)
last_theta = theta
theta = theta - eta*gradient
if (abs(J(x_b,y,theta)-J(x_b,y,last_theta)) < esplison):
break
crue_iter += 1
return theta
调用函数
x_b = np.hstack([np.ones((len(x),1)),x.reshape(-1,1)])
eta = 0.1
esplison = 1e-8
inital_theta = np.zeros(x_b.shape[1])
gradient_descent(x_b,y,eta,esplison,inital_theta)
结果为:
array([4.0238372 , 3.01008419])
调用sklearn.linear_model
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(x.reshape((-1,1)),y)
lin_reg.intercept_
结果为4.0236966721039
lin_reg.coef_
结果为array([3.01034894])