0x1,梯度下降简介:
可能简单的说:f(x)=y,x1=x-y导数,不停的求梯度。
首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。
0x2,简单的例子
1,由最简单的y=wx+b+eps(eps为可能的误差)。通常会给出数据,其中数据有干燥点,这里我们来算出最合理的w和b的值。
2,为了排除负数的影响,用loss=(y-wx-b)?,这里loss函数的极小值对应的w,b即为我们要求的。
3,代码:(关键已经注释)
import torch
import numpy as np
#y=wx+b
def compter_error_for_line_given_points(b,w,points):
totalError=0
for i in range(0,len(points)):
x=points[i,0] #对于数据取x值
y=points[i,1] #对于数据取取y值
totalError+=(y-(w*x+b))**2 #数据差进行迭代
return totalError/float(len(points))
def step_radient(b_current,w_current,points,learningRate):#求梯度
b_gradient=0
w_gradient=0
N=float(len(points))
for i in range(0,len(points)):
x=points[i,0]
y=points[i,1]
b_gradient+=-(2/N)*(y-((w_current*x)+b_current)) #对b求导
w_gradient+=-(2/N)*x*(y-((w_current*x)+b_current)) #对w求导
new_b=b_current-(learningRate*b_gradient)
new_m=w_current-(learningRate*w_gradient)
return [new_b,new_m]
def gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iterations):
b=starting_b #配合上面函数使用,求解出最后的w和b
m=starting_m
for i in range(num_iterations):
b,m=step_radient(b,m,np.array(points),learning_rate)
return [b,m]
def run():
points=np.genfromtxt("data.csv",delimiter=",")#开始初始化各种数据和赋值
learning_rate=0.0001
initial_b=0
initial_m=0
num_iterations=1000
print("Starting gradient descent at b={0},m={1},error={2}"
.format(initial_b,initial_m,
compter_error_for_line_given_points(initial_b,initial_m,points))
)
print("Running.....")
[b,m]=gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)
print("After {0} iterations b = {1}, m = {2}, error = {3}".
format(num_iterations, b, m,
compter_error_for_line_given_points(b, m, points))
)
if __name__=='__main__':
run()
运行结果,结束。