Алгоритм LMS python - PullRequest
       30

Алгоритм LMS python

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

Я пытаюсь реализовать LMS algortihm, я читаю эту статью: http://cs229.stanford.edu/notes/cs229-notes1.pdf Я застрял на этапе обновления тета (стр. 5 в документе). Особенно то, что я пытаюсь сделать, это добавить два числа. Я даю testX, который представляет собой матрицу nx2 и вектор testY, который представляет собой n-мерный вектор. Цель алгоритма LearnTheta состоит в том, чтобы найти такую ​​тэту, чтобы минимизировать функцию стоимости с использованием этой конкретной тэты. В этом случае оптимальная тета равна [1,1], поэтому алгоритм должен заставить тета сходиться к этому вектору. К сожалению, это не так. Буду признателен за любую помощь.

import numpy as np
import math

def hypothesis(x, theta):
    """
      x is training set
      theta is weight parameter
      """
    return np.transpose(np.array(theta)).dot(np.array(x))

def costFunction(theta, x, y):
    """
        x is training set => (j, 2)
        y is a vector of
        theta is weight parameter
        """
    factor = 1 / 2
    sum = 0
    for i in range(0, len(x)):
        sum += math.pow((hypothesis(x[i], theta) - y[i]), 2)
    return factor * sum

def learnThetaSingle(theta, x, y, alpha):
    return theta + alpha * (y - hypothesis(x, theta)) * x

def learnTheta(theta, x, y, alpha):
    f = theta
    for i in range(0, len(x)):
        f = learnThetaSingle(f, x[i], y[i], alpha)
    return f

testX = np.array([[1, 2],
                   [4, 6],
                   [5, 123],
                   [41, -14],
                   [-413, 0],
                   [0, 0],
                   [5, 12],
                   [-3, -14],
                   [1, 1004],
                   [51, 51]])

testY = np.array([3, 10, 128, 27, -413, 0, 17, -17, 1005, 102])
theta = [2, 3]
print(costFunction(theta, testX, testY)) 
# 2147656.0
theta = learnTheta(theta, testX, testY, 0.0001)
print(theta)
#[-29.59330648  68.71968433] , this is far from true

1 Ответ

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

Исправлено, проблема заключалась в том, что старый алгоритм проходил весь набор данных только один раз, но теперь он выполняет итерацию по всему набору данных каждый раз, когда обновляется значение i в тэте из (0, len (theta)). Это будет сложность O (len (theta) * len (набор данных)). Это градиентный спуск (по Эндрю Нг)

...