Я продолжаю получать OverflowError в Python 3, используя numpy, но только в функции (за исключением того же кода это нормально) - PullRequest
0 голосов
/ 21 сентября 2019

Я - начинающий студент, изучающий данные, и меня попросили кодировать линейную регрессию с нуля, включая градиентный спуск, следуя инструкциям учителя (например, какие функции реализовать) и используя numpy.

В целом все работало нормально, но при использовании функции градиента () я продолжаю получать сообщение об ошибке переполнения до функции градиента (), когда суммирую все элементы вектора для вычисления градиента относительно оценки.Странно то, что сама функция градиента () работает довольно хорошо сама по себе, но переполняется функцией градиента ().

Я попытался округлить промежуточные результаты, чтобы не переполнить то, что было переполнено, я пыталсяизолировать каждый результат.Я использую 3.7.3 на MacOs 10.14.6 с jupyter.

Вот мой код:

import numpy as np
import random

def predict(x,th):
    if x.shape[1] != th.shape[0]:
        return "ERROR : The number of covariable columns is not equal to number of lines in parameter matrix !"
    else :
        return (x@th)

def error(x,th,y):
    return (y-predict(x,th))

def gradient(x,th,y):
    grad = np.full(th.shape[0],1)
    for i in range(grad.shape[0]):
        err = error(x,th,y).transpose()
        temp = x[:,i]*err 
        grad[i] = temp.sum()
    return grad

def gradient_descent(x,th,y,a = 0.01):
    i = 0
    while i<2000:
        dif = a*gradient(x,th,y)
        th = th - dif
        i += 1
        if dif.all()<0.5:
            break
    return th

th = np.full(13,1).reshape(13,1) #just for testing purposes

predict(x_train, th)
error(x_train, th, y_train).shape
cost_fun(x_train, th, y_train)
gradient_descent(x_train, th, y_train)

И ошибка, которая идет с ним:

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-414-5e608e709a9e> in <module>
      4 error(x_train, th, y_train).shape
      5 cost_fun(x_train, th, y_train)
----> 6 gradient_descent(x_train, th, y_train)
      7 
      8 

<ipython-input-413-57df3054d402> in gradient_descent(x, th, y, a)
     25     i = 0
     26     while i<2000:
---> 27         dif = a*gradient(x,th,y)
     28         th = th - dif
     29         i += 1

<ipython-input-413-57df3054d402> in gradient(x, th, y)
     19         err = error(x,th,y)[i]
     20         temp = x[i,:]*err
---> 21         grad[i] = round(temp.sum(), ndigits=10)
     22     return grad
     23 

OverflowError: Python int too large to convert to C long

Когда я запускаю gradient(x_train,th,y_train), я получаю это:

array([ -98761915, -398968695, -1128435471, -1089578372, -7619613, -54698832, -620945173, -6731108064, -378298899, -932523483, -40174412843, -1826831673, 34647602295])

Градиент_десцент () должен возвращать вектор оптимизированных параметров.Что может быть не так?!

1 Ответ

0 голосов
/ 21 сентября 2019

Привет, просто проследите свою ошибку, печатая номер цикла и значения th и dif каждый раз перед тем, как выполнить оператор dif = a * Градиент (x, th, y), а затем проверьте последние значения после того, как вы столкнулись с ошибкой.Я не x_train и y_train, поэтому я не могу запустить код.если возможно, поделитесь ссылкой на часть данных, чтобы я мог посмотреть.

...