python实现梯度下降法

代码实现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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spiritqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值