代码实现1(无权重,既定函数):
# 原函数
def Z(x, y):
return 2 * (x - 1) ** 2 + y ** 2
# x方向上的梯度
def dx(x):
return 4 * x - 4
# y方向上的梯度
def dy(y):
return 2 * y
# 初始值
X = x0 = 3
Y = y0 = 2
# 学习率
alpha = 0.1
# 保存梯度下降所经过的点
globalX = [x0]
globalY = [y0]
globalZ = [Z(x0, y0)]
# 迭代30次
for i in range(30):
temX = X - alpha * dx(X)
temY = Y - alpha * dy(Y)
temZ = Z(temX, temY)
# X,Y 重新赋值
X = temX
Y = temY
# 将新值存储起来
globalX.append(temX)
globalY.append(temY)
globalZ.append(temZ)
# 打印结果
print("最终结果为:(x,y,z)=(%.5f, %.5f, %.5f)" % (X, Y, Z(X, Y)))
print("迭代过程中取值")
num = len(globalX)
for i in range(num):
print("x%d=%.5f, y%d=%.5f, z%d=%.5f" % (i, globalX[i], i, globalY[i], i, globalZ[i]))
代码实现2:
import numpy as np
data = np.array([[2.104, 3, 4.00],
[1.600, 3, 3.30],
[2.400, 3, 3.69],
[1.416, 2, 2.32],
[3.000, 4, 5.40]])
w0 = 0
w1 = 0
w2 = 0
alpha = 0.1
J = 100
def training(data, alpha, w0, w1, w2):
loss = 0
bp0 = 0
bp1 = 0
bp2 = 0
for i in data:
loss += 1 / 2 * (w0 + w1 * i[0] + w2 * i[1] - i[2]) ** 2
bp0 += (w0 + w1 * i[0] + w2 * i[1] - i[2]) * 1
bp1 += (w0 + w1 * i[0] + w2 * i[1] - i[2]) * i[0]
bp2 += (w0 + w1 * i[0] + w2 * i[1] - i[2]) * i[1]
N = len(data)
loss = loss / N
bp0 = bp0 / N
bp1 = bp1 / N
bp2 = bp2 / N
w0 = w0 - alpha * bp0
w1 = w1 - alpha * bp1
w2 = w2 - alpha * bp2
return loss, w0, w1, w2
for i in range(1100):
J, w0, w1, w2 = training(data, alpha, w0, w1, w2)
print(J, w0, w1, w2)