Пакетный градиент Descend дает странные результаты - PullRequest
0 голосов
/ 06 сентября 2018

Я сделал алгоритм прогнозирования, используя данные с этого сайта: http://archive.ics.uci.edu/ml/datasets/Concrete+Slump+Test

Ярлык для набора данных: http://archive.ics.uci.edu/ml/machine-learning-databases/concrete/slump/slump_test.data

Вот код:

import numpy as np

class Gradient:
def __init__(self,dataIn,dataOut): #constructor
    self.dataIn=dataIn
    self.dataOut=dataOut
def constructCoeffMatrix(self): #we have 7 features for each data row so we have to initialize 7+1(free) coefficient which will later be learnt
    l=np.random.rand(8,1)
    l=np.array(l)
    return l
def constructInputMatrix(self): #data initialy given as bidimensional list
    input=self.dataIn
    #standardization
    for i in range(len(input)):
        for j in range(len(input[i])):
            input[i][j]=input[i][j]/1000
    for i in range(len(input)):#our vectors are in the form of (1,x) (1 for the free scalar coeff)
        input[i] = [1] + input[i]
    Matrix=np.array(input)
    return Matrix
def constructOutMatrix(self):
    out=self.dataOut
    Matrix=np.array(out)
    #standardization
    return np.multiply(Matrix,1.0/1000)
#gradient function
def gradientDescent(self,x, y, theta, alpha, num_iters): #BGD , the cost function is 1/2m sum_1,m (y_hat-y)^2
    """
      Performs gradient descent to learn theta
   """
    m = y.size  # number of training examples
    for i in range(num_iters):
        y_hat = np.dot(x, theta)
        theta = theta - alpha * (1.0 / m) * np.dot(x.T, y_hat - y)
    return theta
def run_gradient(self):
    maxiter=1000
    input=self.constructInputMatrix()
    out=self.constructOutMatrix()
    coef=self.constructCoeffMatrix()
    learning_rate=0.05
    return self.gradientDescent(input,out,coef,learning_rate,maxiter)
def model(self,input):
    input[0]=[1]+input[0]
    input=np.array(input)
    res = input.dot(self.run_gradient())
    return res

Как видите, для каждого примера есть 7 входных функций и 3 выходных числа. В моем коде я взял для простоты только один выходной столбец, поэтому в основном dataOut - это список n на 1 (представляющий спад, поток или силу).

Я надеюсь, что это легко понять, я добавил комментарии, объясняющие каждую функцию, дело в том, что ... результаты тестов полностью мусорные, в целом они просто слишком велики, если я ожидаю, что число между (0,100 ), прогнозируемое значение будет более 500, я даже получил отрицательные результаты, что смешно.

enter image description here

Я пытался не использовать стандартизацию, но ошибка будет переходить от милиона к -миллиону к миллиарду к -биллиону, а затем к + -инф и "нан", поэтому каждое предсказание будет "нан". Деление всего на 1000, по крайней мере, дает меньше, чем миллионы ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...