梯度下降算法

梯度下降在机器学习中作为一种优化算法,通常要最小化一个损失函数来优化模型的参数。
梯度下降算法的基本思路是:通过计算损失函数关于模型参数的梯度(也就是变化率的方向),然后沿着梯度的反方向逐步调整参数,使得损失函数的值不断减小。
简单来说,它就像是在一个参数空间的山坡上,我们要找到山底(即最小的损失值),通过不断沿着最陡峭的方向往下走(即根据梯度调整参数)来逐步接近目标。
在实际应用中,有不同的梯度下降变体,如批量梯度下降、随机梯度下降和小批量梯度下降等,它们在计算效率和收敛性等方面各有特点。
以下是一个简单的梯度下降算法示例代码(以线性回归为例):

x = [(2, 0, 3), (1, 0, 3), (1, 1, 3), (1,4, 2), (1, 2, 4)]  # 定义输入数据 x
y = [5, 6, 8, 10, 11]  # 定义目标值 y
epsilon = 0.002  # 允许的误差阈值
alpha = 0.02  # 学习率
diff = [0, 0]  # 用于存储差值的列表
max_itor = 1000  # 最大迭代次数
error0 = 0  # 上一次的误差
error1 = 0  # 当前误差
cnt = 0  # 迭代计数
m = len(x)  # 数据数量
theta0 = 0  # 模型参数 theta0
theta1 = 0  # 模型参数 theta1
theta2 = 0  # 模型参数 theta2

while True: 
    cnt += 1 
    for i in range(m):  # 遍历数据
        diff[0] = (theta0 * x[i][0] + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]  # 计算预测值与真实值的差值
        theta0 -= alpha * diff[0] * x[i][0]  # 根据梯度下降更新 theta0
        theta1 -= alpha * diff[0] * x[i][1]  # 根据梯度下降更新 theta1
        theta2 -= alpha * diff[0] * x[i][2]  # 根据梯度下降更新 theta2
      
    error1 = 0  # 重置当前误差为 0
    for lp in range(len(x)):  # 再次遍历数据计算总误差
        error1 += (y[lp] - (theta0 * x[lp][0] + theta1 * x[lp][1] + theta2 * x[lp][2])) ** 2 / 2  # 计算单个样本的误差平方和并累加到总误差
    if abs(error1 - error0) < epsilon:  # 如果误差变化小于阈值
        break  # 退出循环
    else:  # 否则
        error0 = error1  # 更新上一次误差为当前误差
print('最终: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2))  
print('迭代次数: %d' % cnt)  

运行结果如下:
在这里插入图片描述
拟合的目标函数可表示为: f ( x 0 , x 1 , x 2 ) = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 f({{x}_{0}},{{x}_{1}},{{x}_{2}})={{\theta }_{0}}{{x}_{0}}+{{\theta }_{1}}{{x}_{1}}+{{\theta }_{2}}{{x}_{2}} f(x0,x1,x2)=θ0x0+θ1x1+θ2x2,通过迭代更新参数的方式来逐渐逼近最优解

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值