真正对梯度下降的理解和操作

梯度

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度在形式上是各个变量的偏导数。
在这里插入图片描述

为什么沿着梯度方向函数值下降最快?

在这里插入图片描述

梯度下降的具体算法

计算拟合F(x) = θx,拟合以下三个点(1,1),(2,2),(3,3)我们使用的损失函数还是 J ( θ ) = 1 2 m ∑ i = 1 m ( y ′ − θ x ) 2 J(θ)=\frac{1}{2m}\sum_{i=1}^m(y^{'}-θx)^2 J(θ)=2m1i=1myθx2的最小值。只有一个参数θ是不确定的,而通过三个观测点去不断优化。
优化的方式为算出,设定初始值 例如 θ = 5, 算出J(θ)的梯度,让 θ − α ∂ J ( θ ) ∂ θ θ-α\frac{\partial J(θ) }{\partial θ} θαθJ(θ),直到θ的值小于某个设定的值不再下降为止。其中α是学习步长。

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(-5, 5, 0.001)
y=(((x-1)*(x-1)+(x*2-2)*(x*2-2)+(x*3-3)*(x*3-3))*1/6.0)
plt.plot(x,y)  
#plt.show()    #显示图形  
 
 
 
def sum(x):
    return ((x*1-1)*1+(x*2-2)*2+(x*3-3)*3)
def fun(x):
    return ((1/3.0)*sum(x))   #方程是J(θ)的偏导,也即是梯度
 
old = 0
new = 5
step = 0.01
pre = 0.000001
 
def src_fun(x):
    print(((x-1)*(x-1)+(x*2-2)*(x*2-2)+(x*3-3)*(x*3-3))*1/6.0)
    
while abs(new-old)>pre:   
    old = new
    #src_fun(old)     #输出每次迭代的损失值
    new = new - step*fun(old)
    
    print(new,fun(old))
    
print(new)
print(src_fun(new))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值