Я - начинающий студент, изучающий данные, и меня попросили кодировать линейную регрессию с нуля, включая градиентный спуск, следуя инструкциям учителя (например, какие функции реализовать) и используя 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])
Градиент_десцент () должен возвращать вектор оптимизированных параметров.Что может быть не так?!