尝试实施梯度下降

时间:2020-05-10 15:26:10

标签: python machine-learning linear-regression gradient-descent

我对ML和python完全陌生,请阅读线性回归并尝试实现梯度下降

首先,有人可以让我知道我在做什么错吗?

输入数据-

    x = np.array([1,2,3,4,5,6])
    y = (2*x + 5) + np.random.normal(0, 1, len(x))
    curve = pd.DataFrame(np.column_stack([x,y]), columns = ['x', 'y'])

梯度下降代码-

    learningRate = 0.1
    m = 0
    c = 0
    n = len(x)
    j = [0]*300
    j[1] = sum((curve.y - (m*curve.x + c))**2)/n
    iter = 1
    err = 1
    while(err > 10**-3):
        Dc = (m*curve.x +c) - curve.y
        Dm = ((m*curve.x + c) - curve.y)*curve.x
        m = m - 0.1 * sum(Dm)/n
        c = c - 0.1 * sum(Dc)/n
        iter = iter +1
        j[iter] = sum((curve.y - (m*curve.x + c))**2)/n
        err = abs(j[iter] - j[iter -1])
        print('error :',err)
    print('iter : ', iter)
    print('m : ', m)
    print('c : ', c)

它为我提供了正确的结果,因为以下误差项不断减少,并随估计 m和c的值:

error : 97.29992615029744
error : 34.92089545773186
error : 12.579806110060302
error : 4.5766394765497145
error : 1.7080644275745156
error : 0.6783105614574572
error : 0.307139765746657
error : 0.17189857726871516
error : 0.12122915945728607
error : 0.10092634553882229
error : 0.09157601971420037
error : 0.08622305155313681
error : 0.08237404842923546
error : 0.07913349054978847
error : 0.07617816054863757
error : 0.07338987727769242
error : 0.07072397231883842
error : 0.06816218746680436
error : 0.06569580397224817
error : 0.0633195980665846
error : 0.061029673548781194
error : 0.0588226828738998
error : 0.0566955455716478
error : 0.05464534485749262
error : 0.05266928814789651
error : 0.05076469054898958
error : 0.04892896665787916
error : 0.04715962542349139
error : 0.04545426618265713
error : 0.043810575193886425
error : 0.042226322423362106
error : 0.04069935849262318
error : 0.0392276117528354
error : 0.037809085470765336
error : 0.03644185511853815
error : 0.03512406576218341
error : 0.033853929544860106
error : 0.032629723261214494
error : 0.03144978601945159
error : 0.030312516988004745
error : 0.029216373223642567
error : 0.028159867578168907
error : 0.02714156668077994
error : 0.026160088993397057
error : 0.025214102936330196
error : 0.02430232508170649
error : 0.023423518412224897
error : 0.022576490642901792
error : 0.021760092603465342
error : 0.020973216679284867
error : 0.020214795308643785
error : 0.019483799534385726
error : 0.0187792376078999
error : 0.01810015364362627
error : 0.017445626322180052
error : 0.016814767640402017
error : 0.016206721706588878
error : 0.015620663579299254
error : 0.01505579814815139
error : 0.014511359055082274
error : 0.013986607654631555
error : 0.013480832011810495
error : 0.012993345936206158
error : 0.012523488051036091
error : 0.012070620895839435
error : 0.011634130061635828
error : 0.011213423357342878
error : 0.01080793000635838
error : 0.010417099872163771
error : 0.01004040271197626
error : 0.009677327457328522
error : 0.009327381520729094
error : 0.008990090127349415
error : 0.008664995670889075
error : 0.008351657092750653
error : 0.008049649283635052
error : 0.007758562506807065
error : 0.007478001842195603
error : 0.007207586650595843
error : 0.006946950057259871
error : 0.00669573845415905
error : 0.006453611020228234
error : 0.006220239258977411
error : 0.005995306552818436
error : 0.005778507733510185
error : 0.005569548668120872
error : 0.005368145859991458
error : 0.005174026064101778
error : 0.004986925916362628
error : 0.004806591576302477
error : 0.004632778382688496
error : 0.004465250521578756
error : 0.004303780706404803
error : 0.0041481498695978836
error : 0.003998146865395347
error : 0.00385356818335314
error : 0.003714217672262876
error : 0.0035799062740193843
error : 0.0034504517671292145
error : 0.0033256785194886174
error : 0.0032054172500981526
error : 0.0030895047994004
error : 0.002977783907922804
error : 0.002870103002917457
error : 0.0027663159927209247
error : 0.0026662820685543487
error : 0.002569865513485592
error : 0.002476935518296086
error : 0.002387366004018787
error : 0.0023010354508823383
error : 0.002217826733440287
error : 0.0021376269616657506
error : 0.002060327327805034
error : 0.0019858229587441656
error : 0.0019140127737211632
error : 0.0018447993472126
error : 0.0017780887767346876
error : 0.0017137905554454047
error : 0.0016518174493684867
error : 0.0015920853790276634
error : 0.0015345133053750182
error : 0.0014790231198629211
error : 0.0014255395384494829
error : 0.0013739899994744675
error : 0.0013243045652084895
error : 0.0012764158269753523
error : 0.0012302588136838821
error : 0.0011857709036990904
error : 0.001142891739868812
error : 0.0011015631476423149
error : 0.0010617290561396597
error : 0.0010233354220909874
error : 0.0009863301565038451
iter :  134
m :  2.0833620160267663
c :  4.610637626188058

但是当我将输入作为(仅增加数组中的一个元素)

x = np.array([1,2,3,4,5,6,7])
y = (2*x + 5) + np.random.normal(0, 1, len(x))
curve = pd.DataFrame(np.column_stack([x,y]), columns = ['x', 'y'])

结果如下:(为什么我的错误在这种情况下持续增加)

error : 29.09815015431613
error : 34.01872638453614
error : 39.76520568567241
error : 46.47644714481737
error : 54.31464731003979
error : 63.46926275846772
error : 74.16159195797525
error : 86.65012723507334
error : 101.23680628672548
error : 118.27431442939576
error : 138.17461419084918
error : 161.41890853364032
error : 188.56927867181366
error : 220.28227794256668
error : 257.32481050201727
error : 300.5926788730269
error : 351.13224891948175
error : 410.16575621676475
error : 479.12086585577663

请让我知道我在做什么错?

尝试实现梯度下降,但是如果我使用更长的输入向量意味着更多的例子,那么我错误项将继续增加而不是减少

1 个答案:

答案 0 :(得分:1)

您在这里有两个问题。 首先,您定义了学习率,但没有使用它

    m = m - learningRate * sum(Dm)/n
    c = c - learningRate* sum(Dc)/n

第二,您的学习率很高。选择一个值,例如0.01

如果将打印对帐单更改为 print('error:{} m:{} c:{}'。format(err,m,c))

您可以看到学习到的参数正在振荡

error : 4.627422172738745 m: 6.2021421523611355 c: 1.3127611648190132
error : 5.407226002504083 m: -0.5251044659276074 c: 0.013389352211670591
error : 6.318019832044391 m: 6.721890877404075 c: 1.53485336818056