переполнение квадратной функции при расчете градиентного спуска - PullRequest
1 голос
/ 24 мая 2019

я написал линейную регрессию (в одной переменной) вместе с градиентным спуском, она работает нормально для меньшего набора данных, но для больших наборов данных выдает ошибку как:

OverflowError: (34, 'Numerical result out of range') 

код, указывающий на ошибку в следующей части:

def gradient_des ( theta0, theta1, x, y):
    result = 0;
    sumed = 0;
    if len(x) == len(y):
        for i in range(len(x)):
            sumed = sumed + ( line(theta0,theta1,x[i]) - y[i])**2 #error shown in this line.
        result = sumed / (2 * len(x))
        return result
    else:
        printf("x and y are of inequal length")

# in general cases for x and y, which were generated for testing purposes below
x = []
for i in range(10):
    x = x + [i]
print(x)
#x = [1,2,3,4,5,6]
y = [ 0 for _  in range(len(x))]
for i in range(len(y)):
    y[i] = random.randint(-100,100)
print(y)
# y = [13,10,8.75,4,5.5,2]

почему происходит это переполнение,

после этого в коде, изменяя коэффициент обучения (то есть альфа,), иногда код выполняется для альфа = 0,1, но не для альфа = 1 [для меньшего известного набора данных]

def linear_reg (x,y):
    if len(x) == len(y):
        theta0 = random.randint(-10,10)
        theta1 = random.randint(-10,10)
        alpha = 0.1 # problem in how to decide the the factor to be smal or large

        while gradient_des(theta0,theta1,x,y) != 0 : # probably error in this converging condition
            temp0 = theta0 - alpha * summed_lin(theta0,theta1,x,y)
            temp1 = theta1 - alpha * summed_lin_weighted(theta0,theta1,x,y)
            # print(temp0)
            # print(temp1)
            if theta0 != temp0 and theta1 != temp1:
                theta0 = temp0
                theta1 = temp1
            else:
                break;
        return [theta0,theta1]
    else:
        printf("x and y are of inequal length")

для значения alpha = 1, это дает ту же ошибку, что и выше не должна ли регрессия быть независимой от альфа (для меньших значений)

полный код здесь: https://github.com/Transwert/General_purposes/blob/master/linreg.py

...