2015-05-06 2 views
3

Я реализую матричную факторизацию, чтобы предсказать рейтинг фильма рецензентом. Набор данных берется из MovieLen (http://grouplens.org/datasets/movielens/). Это хорошо изученная проблема с рекомендациями, поэтому я просто реализую этот метод матричной факторизации для своей цели обучения.Scikit-learn - Stochastic Gradient Descent с пользовательскими функциями расхода и градиента

Я моделирую функцию стоимости как среднеквадратичную ошибку между прогнозируемым рейтингом и фактическим рейтингом в наборе учебных материалов. Я использую функцию scipy.optimize.minimize (я использую сопряженный градиентный спуск), чтобы повлиять на матрицу рейтинга фильмов, но этот инструмент оптимизации слишком медленный даже для всего набора данных с элементами 100K. Я планирую масштабировать свои алгоритмы для набора данных с 20 миллионами элементов.

Я искал решение на основе Python для Stochastic Gradient Descent, но стохастический градиентный спуск, который я нашел на scikit-learn, не позволяет использовать мои пользовательские функции расхода и градиента.

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

В принципе, мне интересно, если есть такие, как API, который похож на это:

optimize.minimize(my_cost_function, 
        my_input_param, 
        jac=my_gradient_function, 
        ...) 

Спасибо! Un

+0

Есть две вещи, на которые вы должны обратить внимание: (1) векторизовать/распараллеливать библиотеки матриц и (2) конвергенцию размера шага градиента. Выделите функцию затрат по сравнению с итерацией, чтобы увидеть, может ли размер шага сделать его быстрее. Вы можете взять слишком много маленьких шагов, чтобы сходиться к решению. – duffymo

+0

Спасибо за ответ. Хорошая точка в размере шага. – unaki

ответ

1

Это так просто (по крайней мере, метод ванили) для реализации, что я не думаю, что вокруг него есть «каркас». Это просто

my_input_param += alpha * my_gradient_function 

Может быть, вы хотите взглянуть на Феано, которая будет делать дифференциацию для вас, хотя. В зависимости от того, что вы хотите сделать, это может быть немного переборщить.

1

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

Как я понимаю, ключ заключается в том, чтобы найти градиент и посмотреть, какой путь приведет вас к локальному минимуму.

С линейной регрессии (y = mx + c) и функцию наименьших квадратов, наша функция затрат (mx + c - y)^2 частная производная от этого по отношению к т является 2m(mX + c - y) Что с более традиционной машинного обучения нотации, где m = theta дает нам theta <- theta - learning_rate * t(X) %*% (X %*% theta - y)/length(y)

Я не знаю этого точно, но я бы предположил, что для линейной регрессии и стоимостной функции sqrt(mx + c - y), что шаг градиента является частной производной по отношению к m, который, я считаю, m/(2*sqrt(mX + c - y))

Если есть какие-либо/все это неправильно, пожалуйста, (кто-нибудь) исправьте меня. Это то, что я пытаюсь выучить, и был бы признателен, если бы я возглавлял совершенно неправильное направление.

Смежные вопросы