题目:建立线性回归模型。
求解方法:梯度下降法。
预处理:将living area缩小1000倍,price缩小100倍。
大题思路:
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)
收敛结果如下:
其中j为损失。
也可以使用while循环,当梯度达到我们的要求,比如梯度0.001的时候,结束循环。