当前位置:   article > 正文

梯度下降法的学习笔记_y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]

y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]

人学习笔记
碎碎念:
线性关系:y=kx+b这种形式。
非线性的:有 平方的形式,三角函数的形式等等,总之,自变量和因变量之间不是一次的关系。解此类方程往往很难得到精确解,经常需要求近似解问题。相应的求近似解的方法也逐渐得到大家的重视。

梯度不准确的说就是方向,即点移动的方向(最容易找到最高点),但他其实是一个向量(通过对每一个参数求偏导得到)。
求解损失函数的最大值或者最小值 运用梯度上升法或者是梯度下降法。
如果函数有多个极值点(极大值或者极小值),那么求得的结果是局部最优解;当只有一个极大值或者极小值的时候求得的是全局最优解。
找到一个参数向量就将其带入平方损失函数中看一下前后两次的损失函数是不是符合标准,符合标注就说明找到了;不符合标准就要重新寻找参数。存照参数的标准是什么:就是是
1.找目标函数就是找参数向量,就是找损失平方函数的最小值,怎样快速找到使其达到最小值的参数向量(这个参数向量和上一个参数向量是一个参数向量)?损失平方函数关于参数的偏导的负数就是下降最快的方向,在每个数据点沿着偏导向量的方向走就可以找到最小值。
2.关于如何判断找到了损失平方函数的最小值?就是两次损失平方函数的差值符合我们设定的阈值。
3.最小化一个损失函数
4. 是否对于每一个测试点都有一个参数向量

这个是我当初看的第一个代码
#每个样本点有 3 个分量 (x0,x1,x2) 
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]   
# y[i] 样本点对应的输出   
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]   
#迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代   
epsilon = 0.0001   
#学习率
alpha = 0.01  
diff = [0, 0] 
max_itor = 1000   
error1 = 0   
error0 = 0  
cnt = 0  
m = len(x)   
#初始化参数   
theta0 = 0   
theta1 = 0  
theta2 = 0   

while True:   
    cnt += 1
	# 参数迭代计算       
	for i in range(m):           
    	#拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]           
    	#计算残差
    	diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]   
    	# 梯度 = diff[0] * x[i][j]           
    	theta0 -= alpha * diff[0] * x[i][0]
    	theta1 -= alpha * diff[0] * x[i][1]   
    	theta2 -= alpha * diff[0] * x[i][2]   
    	# 计算损失函数      
    error1 = 0  
	for lp in range(len(x)):  
    	error1 += (y[lp]-(theta0 + 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, error1 : %f' % (theta0, theta1, theta2, error1) )   
print('Done: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2))
print('迭代次数: %d' % cnt) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

其中有一些代码不是很理解

# 参数迭代计算       
for i in range(m):           
    #拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]           
    #计算残差
    diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]   
    # 梯度 = diff[0] * x[i][j]           
    theta0 -= alpha * diff[0] * x[i][0]
    theta1 -= alpha * diff[0] * x[i][1]   
    theta2 -= alpha * diff[0] * x[i][2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

经过上碎碎念般的思考,我已经等了梯度下降法的流程,但这段代码写成这样字是为了干嘛?

为解决上面的问题需要究一点公式:
这个式子是参数更新公式:
在这里插入图片描述
式子最后是 J(θ) 对所有θi求偏导。

J(θ)是损失函数 (损失平方函数),下面是如何求导?,以及求导结果

在这里插入图片描述

上图中的这部分就是残差:
在这里插入图片描述
就是对所有的数据点xi乘以残差,再求和

综合一下得出这个式子 :
这是θi 里面的i=1的时候的情况
在这里插入图片描述
将所有的样本点带入 求和 再用当前的θ相减,就得到了更新后的θ1,
但是 代码的计算流程不是这样子的,他是 将先将一个样本点带入求出一个’梯度’,然后再用当前θ去减,在一个循环中带入了 所有的样本点。

for i in range(m):
    #拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
    #计算残差
    diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]
    # 梯度 = diff[0] * x[i][j]
    theta0 -= alpha * diff[0] * x[i][0]
    theta1 -= alpha * diff[0] * x[i][1]
    theta2 -= alpha * diff[0] * x[i][2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

哼哧哼哧,这不就是将理论上的一步就成功的操作,变成了 分步实现的操作嘛!!!我也是败了。

不过! 这个式子 是 我感觉最重要的,嗯。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/104063
推荐阅读
相关标签
  

闽ICP备14008679号