1、何为线性回归?
线性回归从直观上讲就是寻找一线性函数(一次函数)来尽可能拟合一离散数据序列,使求得的线性函数能够直观正确的反映离散数据序列的变化规律。
2、如何求线性回归函数?
我们需要寻找使得loss最小的线性函数,其中最主要的参数就是w和b,我们通过优化w和b来使得loss最小。
其中lr称为学习率。
3、线性回归实战及源代码
我们对上述过程编写了相关python代码,并采用了100个点数据进行训练,代码及结果附后。
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 31 10:08:56 2020
@author: lenovo
"""
import numpy as np
import matplotlib.pyplot as plt
#step1:计算loss
def loss(b,w,points):
totalError = 0
for i in range(0,len(points)):
x=points[i,0]
y=points[i,1]
totalError = totalError+((w*x+b)-y)**2
#平均loss
return totalError/float(len(points))
#step2:计算梯度
def gradient_update(b_current,w_current,points,lr):
b_grad = 0
w_grad = 0
N=float(len(points))
for i in range(0,len(points)):
x = points[i,0]
y = points[i,1]
b_grad = b_grad + (2/N)*((w_current*x+b_current)-y)
w_grad = w_grad + (2/N)*x*((w_current*x+b_current)-y)
#update b
new_b = b_current-lr*b_grad
#update w
new_w = w_current-lr*w_grad
return [new_b,new_w]
#step3:梯度下降
def gradient_descent(points,b_start,w_start,lr,num_loop):
b = b_start
w = w_start
for i in range(num_loop):
b,w=gradient_update(b,w,np.array(points),lr)
return [b,w]
#step4:执行回归
def execute():
points = np.genfromtxt("data.csv", delimiter=",")
#矩阵转化
ar=np.array(points)
x=ar[:,0]
y=ar[:,1]
plt.figure(1)
plt.plot(x, y,'r.')
lr = 0.0001
b_start = 0 # 初始值
w_start = 0 # 初始值
num_loop = 1500 #循环次数
print("Starting gradient descent at b = {0}, w = {1}, error = {2}"
.format(b_start, w_start,
loss(b_start, w_start, points))
)
print("Executing...")
[b, w] = gradient_descent(points, b_start, w_start, lr, num_loop)
print("After {0} loop b = {1}, w = {2}, error = {3}".
format(num_loop, b, w,
loss(b, w, points))
)
y1=w*x+b;
plt.plot(x, y1,'b')
execute();
我们利用了 上述代码对100个离散数据序列进行了仿真,得到拟合曲线结果如下图。