Алгоритм стохастического градиентного спуска с использованием pyspark для получения оптимальных параметров

Я хочу реализовать алгоритм в pyspark, чтобы получить функцию стоимости / значение ошибки, используя как стохастический градиентный спуск, так и градиентный спуск. Я реализовал следующий код в Python, используя модуль Numpy:

from numpy import *
from numpy.random import *
import sys

# Gradient descent function
def GDFunc(weight): 
    return sum((x.dot(weight) - y)**2 for x, y in data_points) / len(data_points)

def dGDFunc(weight):
    return sum(2 * (x.dot(weight) - y) * x for x, y in data_points) / len(data_points)

# Stochastic gradient descent function
def SGDFunc(weight, i):
    x, y = data_points[i]
    return (x.dot(weight) - y)**2

def dSGDFunc(weight, i):
    x, y = data_points[i]
    return 2 * (x.dot(weight) - y) * x


# Data generation
true_weights = array([1, 2, 3, 4, 5])
d = len(true_weights)
data_points = []
for _ in range(1000):
    x = randn(d)
    y = x.dot(true_weights) + randn()
    data_points.append((x, y))

# Find gradient descent optimal parameters
def gradientDescent(GDFunc, dGDFunc, d):
    weight = zeros(d)
    alpha = 0.01
    for t in range(100):
        value = GDFunc(weight)
        gradient = dGDFunc(weight)
        print 'iteration %d: weight = %s, GDFunc(weight) = %s' % (t, weight, value)
        weight = weight - alpha * gradient

def stochasticGD(SGDFunc, dSGDFunc, d, n):
    weight = zeros(d)
    numUpdates = 0
    oldValue=0
    for t in range(100):
        for i in range(n):  # Nested Loop to process each sample individually
            value = SGDFunc(weight, i)
            gradient = dSGDFunc(weight, i)
            numUpdates += 1
            alpha = 1.00 / numUpdates  # Decreasing step size
            weight = weight - alpha * gradient
        print 'iteration %d: Cost: %s.  weight = %s' % (t,value, weight)
        if t>5 and value>oldValue:
            print "Found Local Minima"
            sys.exit()
        oldValue=value


gradientDescent(GDFunc, dGDFunc, d)
stochasticGD(SGDFunc, dSGDFunc, d, len(data_points))

Если я увеличу количество итераций в приведенном выше коде, выполнение займет много времени, поэтому я ищу способ реализовать то же самое с помощью pyspark.

Хотя мне известна библиотека pllpark mllib, которая предоставляет класс LinearRegressionWithSGD для обучения модели, мне неясно, как из нее получить оптимальные параметры.

0 ответов

Другие вопросы по тегам