梯度
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度在形式上是各个变量的偏导数。
为什么沿着梯度方向函数值下降最快?
梯度下降的具体算法
计算拟合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=1∑m(y′−θx)2的最小值。只有一个参数θ是不确定的,而通过三个观测点去不断优化。
优化的方式为算出,设定初始值 例如 θ = 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))