2014-11-19 3 views
1

Я пытаюсь реализовать градиентный спуск по набору данных. Хотя я все пробовал, я не мог заставить его работать. Итак, я создал тестовый пример. Я пытаюсь использовать свой код на случайных данных и пытаюсь отлаживать.Градиентный спуск со случайным внедрением ввода

Более конкретно, что я делаю, я генерирую случайные векторы между 0-1 и случайными метками для этих векторов. И попробуйте переустановить учебные данные.

Однако, мой вектор веса становится все больше и больше на каждой итерации. И тогда у меня есть бесконечности. Итак, я ничего не узнаю. Вот мой код:

import numpy as np 
import random 

def getRandomVector(n): 
    return np.random.uniform(0,1,n) 

def getVectors(m, n): 
    return [getRandomVector(n) for i in range(n)] 

def getLabels(n): 
    return [random.choice([-1,1]) for i in range(n)] 

def GDLearn(vectors, labels): 
    maxIterations = 100 
    stepSize = 0.01 

    w = np.zeros(len(vectors[0])+1) 
    for i in range(maxIterations): 
     deltaw = np.zeros(len(vectors[0])+1) 
     for i in range(len(vectors)): 
     temp = np.append(vectors[i], -1) 
     deltaw += (labels[i] - np.dot(w, temp)) * temp 
     w = w + (stepSize * (-1 * deltaw)) 
    return w 

vectors = getVectors(100, 30) 
labels = getLabels(100) 

w = GDLearn(vectors, labels) 
print w 

Я использую LMS для функции потерь. Таким образом, во всех итераций, мое обновление заключается в следующем,

enter image description here

где ш^я является весовым Ith и R является размер шага и Е (ш^я) является функцией потерь.

Вот моя функция потери. (LMS)

enter image description here

и вот как я образовавшаяся функцию потерь,

enter image description here,

Теперь мои вопросы:

  1. Должен ли я рассчитывать на хорошие результаты в этот случайный сценарий с использованием Gradient Descent? (Каковы теоретические рамки?)
  2. Если да, то какова моя ошибка в моей реализации?

PS: Я пробовал несколько других параметров maxIterations и stepSize. Все еще не работает. PS2: Это лучший способ задать вопрос здесь. Извините, если вопрос слишком конкретный. Но это сошло с ума. Я действительно хочу изучить проблему.

+0

В вашем коде есть явные ошибки. В ближайшее время я отвечу. – greeness

+0

У меня где-то отсутствовал минус. Проблема решена. В любом случае спасибо – Sait

ответ

0

Ваш код имеет несколько недостатков:

  • В GetVectors() метод, вы фактически не использовать входную переменную m;
  • В методе GDLearn() у вас двойной цикл, но вы используете одну и ту же переменную i как переменные цикла в обеих циклах. (Я предполагаю, что логика по-прежнему правильная, но это запутывает).
  • Ошибка прогноза (labels[i] - np.dot(w, temp)) имеет неправильный знак.
  • Размер шага имеет значение. Если я использую 0.01 в качестве размера шага, стоимость увеличивается на каждой итерации. Изменение его на 0,001 решило проблему.

Вот мой пересмотренный код, основанный на вашем исходном коде.

import numpy as np 
import random 

def getRandomVector(n): 
    return np.random.uniform(0,1,n) 

def getVectors(m, n): 
    return [getRandomVector(n) for i in range(m)] 

def getLabels(n): 
    return [random.choice([-1,1]) for i in range(n)] 

def GDLearn(vectors, labels): 
    maxIterations = 100 
    stepSize = 0.001 

    w = np.zeros(len(vectors[0])+1) 
    for iter in range(maxIterations): 
     cost = 0 
     deltaw = np.zeros(len(vectors[0])+1) 
     for i in range(len(vectors)): 
     temp = np.append(vectors[i], -1) 
     prediction_error = np.dot(w, temp) - labels[i] 
     deltaw += prediction_error * temp 
     cost += prediction_error**2 
     w = w - stepSize * deltaw 
     print 'cost at', iter, '=', cost 
    return w 

vectors = getVectors(100, 30) 
labels = getLabels(100) 

w = GDLearn(vectors, labels) 
print w 

Запуск результат - вы можете увидеть стоимость уменьшается с каждой итерации, но с возвращением уменьшающейся.

cost at 0 = 100.0 
cost at 1 = 99.4114482617 
cost at 2 = 98.8476022685 
cost at 3 = 98.2977744556 
cost at 4 = 97.7612851154 
cost at 5 = 97.2377571222 
cost at 6 = 96.7268325883 
cost at 7 = 96.2281642899 
cost at 8 = 95.7414151147 
cost at 9 = 95.2662577529 
cost at 10 = 94.8023744037 
...... 
cost at 90 = 77.367904046 
cost at 91 = 77.2744249433 
cost at 92 = 77.1823702888 
cost at 93 = 77.0917090883 
cost at 94 = 77.0024111475 
cost at 95 = 76.9144470493 
cost at 96 = 76.8277881325 
cost at 97 = 76.7424064707 
cost at 98 = 76.6582748518 
cost at 99 = 76.5753667579 
[ 0.16232142 -0.2425511 0.35740632 0.22548442 0.03963853 0.19595213 
    0.20080207 -0.3921798 -0.0238925 0.13097533 -0.1148932 -0.10077534 
    0.00307595 -0.30111942 -0.17924479 -0.03838637 -0.23938181 0.1384443 
    0.22929163 -0.0132466 0.03325976 -0.31489526 0.17468025 0.01351012 
-0.25926117 0.09444201 0.07637793 -0.05940019 0.20961315 0.08491858 
    0.07438357] 
Смежные вопросы