Как инициализировать стоимость и массив итераций в классе градиентного спуска - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь реализовать класс для функции градиентного спуска для многомерной линейной регрессии. Я хочу построить функцию стоимости в зависимости от количества итераций.

Я пытаюсь записать каждое значение итерации в массиве итераций и значение функции стоимости для каждой итерации в массиве затрат. Однако, когда я запускаю код, я получаю сообщение об ошибке, в котором говорится, что у моего класса Gradient Descent нет costArray или iterationArray, хотя я уже инициализировал оба в своем классе init .

class GradientDescent():
    def __init__(self, learningRate=0.1, tolerance=0.02, iterations=500):
        self._learningRate = learningRate
        self._tolerance = tolerance
        self._iterations = iterations
        self._thetas = None
        self._iterationArray = []
        self._costArray = []    

    def fit(self, xs, ys):
        num_examples, num_features = np.shape(xs)
        self._thetas = np.ones(num_features)
        xs_transposed = xs.transpose()
        for i in range(self._iterations):
            self._iterationArray.append(i)
            diffs = np.dot(xs,self._thetas) - ys
            cost = np.sum(diffs**2) / (2*num_examples)
            self._costArray.append(cost)            
            gradient = np.dot(xs_transposed, diffs) / num_examples
            self._thetas = self._thetas-self._learningRate*gradient

            if cost < self._tolerance:
                return self._thetas

        return self._thetas

, когда я пытаюсь построить график зависимости стоимости от итераций с помощью следующей команды, используя 'gd' в качестве объекта градиентного спуска:

plt.plot(gd.iterationArray,gd.costArray)

Я получаю следующую ошибку:

AttributeError: 'GradientDescent' object has no attribute 'iterationArray'

Что-то не так с моей инициализацией? Или есть более простой способ, чтобы я мог записать итерации и стоимость, чтобы я мог построить это?

1 Ответ

0 голосов
/ 30 октября 2019

Попробуйте это plt.plot(gd._iterationArray,gd._costArray). Вы пропустили подчеркивание (_). Это должно быть gd._iterationArray, а не gd.iterationArray.

. Вы не хотите, чтобы отдельный список сохранял ваши итерации, потому что вы уже знаете это. Таким образом, вы можете попробовать что-то вроде этого. plt.plot(list(range(iterations)), gd._costArray)

...