基于梯度下降的线性回归求解问题

题目:建立线性回归模型。

求解方法:梯度下降法。

预处理:将living area缩小1000倍,price缩小100倍。

基于梯度下降的线性回归求解问题_第1张图片

 

 大题思路:

1)使用np.array将样本存到矩阵中

2)定义函数hy用来求解每一次沿梯度方向下降后的th0,th1和th2。相比于每次训练一个样本,因为已知的样本数目有限,所以每次训练的时候,训练所有的样本,即训练5个样本。沿梯度方向下降的时候,求的是平均梯度。

3)最后在for循环中,定义循环的次数,来代表训练的次数,可以不断地增加训练的次数,直到th0,th1,th2收敛到我们想要的值。

import numpy as np
#h = th0+th1*x1+th2*x2
#J = 1/2*(h - y)**2
th0 = 0
th1 = 0
th2 = 1
alpha = 0.1
data = np.array([[2.104,3,4],
                [1.600,3,3.3],
                [2.400,3,3.69],
                [1.416,2,2.32],
                [3,4,5.4],
                 ])

def hy(th0,th1,th2,alpha,data):
    loss = 0
    bp0 = 0
    bp1 = 0
    bp2 = 0
    for i in data:
        loss += 1/2*(th0+th1*i[0]+th2*i[1]-i[2])**2
        bp0 += th0+th1*i[0]+th2*i[1]-i[2]
        bp1 +=(th0+th1*i[0]+th2*i[1]-i[2])*i[0]
        bp2 +=(th0+th1*i[0]+th2*i[1]-i[2])*i[1]
    N = len(data)
    loss = loss/N
    bp0 = bp0 / N
    bp1 = bp1 / N
    bp2 = bp2 / N
    th0 = th0 -alpha*bp0
    th1 = th1 -alpha*bp1
    th2 = th2 - alpha*bp2
    return loss,th0,th1,th2

for loop in range(2000):
    j,th0,th1,th2 = hy(th0,th1,th2,alpha,data)
#    print(f"j={j:.4f},th0={th0:.4f},th1={th1:.4f},th2={th2:.4f}")
    print(j,th0,th1,th2)


收敛结果如下:

基于梯度下降的线性回归求解问题_第2张图片

 其中j为损失。

也可以使用while循环,当梯度达到我们的要求,比如梯度0.001的时候,结束循环。

你可能感兴趣的:(线性回归,python,机器学习)