

オーバーフローのエラーです。  
GDの中でxを更新しているときにderivで発生していると思われますが解決策がわかりません。よろしくお願いします。

> OverflowError: (34, 'Result too large')
[code]

    # y = x^4 - x^3
    def function(x):
        return x**4 - 2 * (x**3) + 1
    
    # minimum: y = -11/16, x = 3/2
    def deriv(x):
        return 4 * (x**3) - 6 * (x**2)
    
    
    def GD(deriv, init, eta, iter=100):
        '''
        :param deriv: derivative of the function you want to optimize
        :param init: start point, initial value
        :param eta: leaning rate, step size
        :return: history
        '''
        eps = 1e-5
        x = init
        x_history = [init]
        for i in range(iter):
            x_ = x - eta * deriv(x)
            if abs(x - x_) < eps:   # convergence condition
                break
            x = x_
            x_history.append(x)
        return np.array(x_history)
    
    
    etas = [ 0.1, 0.2, 0.4, 0.5]
    '''
    We check the behavior of Gradient Descent compared with the different eta
    '''
    
    for i, eta in enumerate(etas):
        tracks = GD(deriv, 2.0, eta)
    
        plt.subplot(2, 2, (i+1))
    
        plt.title("eta: " + str(eta) + ", iter: " + str(len(tracks)))
    
        x = np.arange(-0.3, 1.0, 0.01)
        y = function(x)
        plt.plot(x, y, linestyle="-", c="black")
        plt.plot(tracks, function(tracks), 'x', c="r")
    
    #plt.tight_layout()
    plt.show()
    
[/code]


CC BY-SA 4.0
2018-11-02T09:57:37.273
49897
2019-07-10T01:01:10.123
question
python
Overflow in python


まず、OverflowErrorは非常に大きい値を取り扱おうとした場合に送出されます。

> 算術演算の結果が表現できない大きな値になった場合に送出されます。  
>  <https://docs.python.jp/3/library/exceptions.html#OverflowError>

解決策ですが、何をしたいのかが質問文からだと不明なので、コードから分かる回答を書きます。

不要なnp（numpyですかね？）を取り除き、 `deriv` 関数のreturn前に `print(x)` を挿入した結果が以下のようになりました。

[code]

    2.0
    1.2
    1.3728000000000002
    1.4686874222592001
    1.4957044497076786
    1.4995483345721634
    1.4999545886920822
    1.4999954563946214
    2.0
    0.3999999999999999
    0.5407999999999998
    0.7652256661503998
    1.109435299670023
    1.4940155127489982
    1.5047018074535845
    1.4961854140988777
    1.5030167905684966
    1.497564703119691
    1.5019340154484542
    1.4984438048562072
    1.5012391469460173
    1.4990049957566633
    1.5007936281024734
    1.499363585488775
    1.5005081597589578
    1.49959285234464
    1.5003253203321703
    1.4997394897067555
    1.5002082453712682
    1.4998332996170376
    1.5001332936164338
    1.4998933224637065
    1.5000853147177737
    1.4999317307566415
    1.5000546042092862
    1.4999563094765538
    1.500034947837555
    1.4999720387986786
    1.5000223670846855
    1.4999821051315547
    1.500014315126218
    1.4999885474072088
    1.5000091617594458
    1.4999926703909918
    1.5000058635582716
    1.4999953090708673
    2.0
    -1.2000000000000002
    5.020800000000003
    -136.9853594222595
    4157744.941243001
    -1.1499881294113451e+20
    2.4333246462810442e+60
    -2.30526123625319e+181
    
[/code]

この辺りから、GDのforループ内で扱っているxの値がループの途中から非常に大きくなっていることが原因と分かります。


CC BY-SA 4.0
2018-11-02T10:07:41.633
49901
2018-11-02T10:07:41.633
29826
49897
answer