使用梯度下降法解决实际问题:
代码:
import numpy as np
a=0.01 #学习率
del0 = 1
del1 = 1
del2 = 1
w0 = 0
w1 = 0
w2 = 0
if __name__ == '__main__':
# 训练线性单元
x1 = np.array([2.104, 1.600, 2.400, 1.416, 3.000])
x2 = np.array([3, 3, 3, 2, 4])
t = np.array([4.00, 3.30, 3.69, 2.32, 5.40])
# 题目数值比较大,用小数来表示
def mysum(x1,x2):
return w0+w1*x1+w2*x2
for i in range(500): # 迭代次数500
w0 = w0 - a * (mysum(x1[i % 5], x2[i % 5]) - t[i % 5])
w1 = w1 - a * (mysum(x1[i % 5], x2[i % 5]) - t[i % 5]) * x1[i % 5]
w2 = w2 - a * (mysum(x1[i % 5], x2[i % 5]) - t[i % 5]) * x2[i % 5]
del0 = (mysum(x1[i % 5], x2[i % 5]) - t[i % 5])
del1 = (mysum(x1[i % 5], x2[i % 5]) - t[i % 5]) * x1[i % 5]
del2 = (mysum(x1[i % 5], x2[i % 5]) - t[i % 5]) * x2[i % 5]
# 因为我们的题目中有五个数,所以对迭代次数取余数取5
while(del0<a and del1<a and del2<a):
print(del0,del1,del2) #输出梯度
break
结果: