【问题标题】:How to create a simple Gradient Descent algorithm如何创建一个简单的梯度下降算法
【发布时间】:2019-08-07 09:07:45
【问题描述】:

我正在研究简单的机器学习算法,从简单的梯度下降开始,但尝试在 python 中实现它时遇到了一些麻烦。

这是我试图重现的示例,我有关于房屋的数据(居住面积(英尺 2)和卧室数量)以及最终价格:

生活区(英尺2):2104

#卧室:3

价格(1000 美元):400

我正在尝试使用梯度下降法进行简单回归,但我的算法不起作用... 该算法的形式不是故意使用向量(我试图逐步理解它)。

i = 1
import sys
derror=sys.maxint
error = 0
step = 0.0001
dthresh = 0.1
import random

theta1 = random.random()
theta2 = random.random()
theta0 = random.random()
while derror>dthresh:
    diff = 400 - theta0 - 2104 * theta1 - 3 * theta2
    theta0 = theta0 + step * diff * 1
    theta1 = theta1 + step * diff * 2104
    theta2 = theta2 + step * diff * 3
    hserror = diff**2/2
    derror = abs(error - hserror)
    error = hserror
    print 'iteration : %d, error : %s' % (i, error)
    i+=1

我理解数学,我正在构建一个预测函数 作为变量(居住面积、卧室数量)和 估计价格。

我正在使用成本函数 ( ) (一分): 这是一个常见的问题,但我更像是一名软件工程师,我一步一步地学习,你能告诉我哪里出了问题吗?

我得到了它与这个代码一起工作:

data = {(2104, 3) : 400, (1600,3) : 330, (2400, 3) : 369, (1416, 2) : 232, (3000, 4) : 540}
for x in range(10):
    i = 1
    import sys
    derror=sys.maxint
    error = 0
    step = 0.00000001
    dthresh = 0.0000000001
    import random

    theta1 = random.random()*100
    theta2 = random.random()*100
    theta0 = random.random()*100
    while derror>dthresh:
        diff = 400 - (theta0 + 2104 * theta1 + 3 * theta2)
        theta0 = theta0 + step * diff * 1
        theta1 = theta1 + step * diff * 2104
        theta2 = theta2 + step * diff * 3
        hserror = diff**2/2
        derror = abs(error - hserror)
        error = hserror
        #print 'iteration : %d, error : %s, derror : %s' % (i, error, derror)
        i+=1
    print ' theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2)
    print ' done : %f' %(theta0 + 2104 * theta1 + 3*theta2)

最终得到这样的答案:

 theta0 : 48.412337, theta1 : 0.094492, theta2 : 50.925579
 done : 400.000043
 theta0 : 0.574007, theta1 : 0.185363, theta2 : 3.140553
 done : 400.000042
 theta0 : 28.588457, theta1 : 0.041746, theta2 : 94.525769
 done : 400.000043
 theta0 : 42.240593, theta1 : 0.096398, theta2 : 51.645989
 done : 400.000043
 theta0 : 98.452431, theta1 : 0.136432, theta2 : 4.831866
 done : 400.000043
 theta0 : 18.022160, theta1 : 0.148059, theta2 : 23.487524
 done : 400.000043
 theta0 : 39.461977, theta1 : 0.097899, theta2 : 51.519412
 done : 400.000042
 theta0 : 40.979868, theta1 : 0.040312, theta2 : 91.401406
 done : 400.000043
 theta0 : 15.466259, theta1 : 0.111276, theta2 : 50.136221
 done : 400.000043
 theta0 : 72.380926, theta1 : 0.013814, theta2 : 99.517853
 done : 400.000043

【问题讨论】:

    标签: python machine-learning


    【解决方案1】:

    第一个问题是,仅使用一条数据运行此程序会给您一个不确定的系统......这意味着它可能有无限数量的解决方案。对于三个变量,您希望至少有 3 个数据点,最好更高。

    其次,使用梯度下降,其中步长是梯度的缩放版本,不能保证收敛,除非在解决方案的小邻域中。您可以通过切换到负梯度方向的固定大小步长(慢)或负梯度方向的线搜索(更快,但稍微复杂一些)来解决这个问题

    所以对于固定步长而不是

    theta0 = theta0 - step * dEdtheta0
    theta1 = theta1 - step * dEdtheta1
    theta2 = theta2 - step * dEdtheta2
    

    你这样做

    n = max( [ dEdtheta1, dEdtheta1, dEdtheta2 ] )    
    theta0 = theta0 - step * dEdtheta0 / n
    theta1 = theta1 - step * dEdtheta1 / n
    theta2 = theta2 - step * dEdtheta2 / n
    

    您的步骤中似乎也有符号错误。

    我也不确定 derror 是否是一个很好的停止标准。 (但众所周知,停止标准很难“正确”)

    我的最后一点是,梯度下降对于参数拟合来说非常慢。您可能想改用共轭梯度或 Levenberg-Marquadt 方法。我怀疑 numpy 或 scipy 包中的 python 已经存在这两种方法(默认情况下它们不是 python 的一部分,但很容易安装)

    【讨论】:

    • 感谢您的精彩回答!我知道这不是解决问题的好方法,我想先尝试实现这个简单的解决方案,然后使用可变步骤并尝试“批量梯度下降”和“随机梯度下降”。
    • 只是为了确定您对 dEdtheta 使用的表达方式是什么?
    • 我会取 d = 400 - theta0 - 2104 * theta1 - 3 * theta2, E=d^2, dEdtheta0 = 2 * d * (-1), dEdtheta1 = 2 * d * ( -2104), dEdtheta2= 2*d*(-3)。这将使原始方程式中的符号正确。但是,如果您查看渐变的大小,与 0.0001 比例因子相比,它们是巨大的,这意味着您最终会从起点开始采用太大的步长。标准化梯度,或以其他方式限制步长,应该可以解决您的问题。
    • 我尝试将步长设置为 0.00000000001,现在错误正在缓慢减少,但 thetas 的最终答案始终为 (0, 0, 0)...
    • 这不应该是在 (0,0,0) 你应该有 diff = 400 的情况,所以所有的 thetas 应该在该步骤结束时增加。 (虽然这可能需要很长的时间——如果你的步长为 1e-9,你只会移动 1e-6 左右——这就是为什么我建议你以某种方式标准化步长)
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2019-06-24
    相关资源
    最近更新 更多