Рекомендательная система на основе алгоритма матричной факторизации
Рекомендуемая система
Система рекомендаций может рекомендовать пользователям разные вещи в соответствии с их предпочтениями.
Рекомендуемый тип системы:
- Ручная настройка рекомендуемого контента
- Сортируйте товары на основе их продаж, экспозиции и т. д. и рекомендуйте их пользователям.
- В соответствии с различными алгоритмами объединяйте данные разных размеров, чтобы разумно рекомендовать товары.
Простая модель рекомендательной системы
Предполагать:
U — множество всех пользователей
P - это совокупность всех предметов
R – предпочтения пользователя в отношении элемента.
Модель Модель(R) = U * P
Ядро алгоритма:
Предпочтение пользователя другим элементам прогнозируется на основе пользовательского рейтинга различных элементов. Здесь не учитываются атрибуты пользователей и товаров, такие как: возраст пользователя, пол, образование, работа и т. д., цена товара, категория, внешний вид и т. д.
По пользовательской оценке элемента может быть установлена матрица рекомендуемых значений, а затем можно предсказать предпочтения пользователя, работая с матрицей, которая представляет собой алгоритм декомпозиции матрицы!
разложение матрицы:
Разложите матрицу рекомендованных значений R на матрицу U и матрицу P так, чтобы элементы в новой матрице R*, полученной произведением U и P, были очень близки к значениям известных элементов в R, тогда R * соответствует неизвестному элементу в R Значение элемента является предсказанным значением.
Матрица рекомендуемых значений:
Краткая история времени | Тридцать лет Ванли | Великая Империя Цинь | Мечта о красных особняках | Краткая история математики | |
---|---|---|---|---|---|
Сяо Мин | 1 | 4 | 1 | ||
маленький король | 2 | 2 | 4 | ||
Сяо Ли | 4 | 1 | 4 | ||
Сяо Чжан | 5 | 1 | 4 |
Ключевые вопросы матрицы рекомендуемых значений:
- Получение начального значения, сбор данных
- Прогнозирование неизвестных данных на основе известных данных из матрицы рекомендаций
- Создать систему оценки для проверки эффективности системы рекомендаций
Сбор данных
Как правило, можно использовать метод веб-краулера, например, для оценки данных вы можете сканировать данные на Douban Reading или собирать информацию о пользователях, скрывая точки на веб-сайтах, которые вы можете контролировать.
Прогнозировать неизвестные данные
Основные проблемы:
-
Когда количество пользователей и элементов относительно велико, рекомендуемая матрица обычно представляет собой разреженную матрицу (в матрице, если количество элементов со значением 0 намного больше, чем количество ненулевых элементов, а распределение ненулевых элементов неравномерно, матрица называется разреженной матрицей), что указывает на то, что большинство пользователей могут не выражать предпочтения по большинству элементов.
-
Проблема холодного старта — это проблема, с которой должна столкнуться каждая рекомендательная система.
Пример матричной факторизации:
который:
Сравнивая матрицу самого левого элемента с самой правой матрицей предсказания, значение элемента в матрице предсказания в позиции отсутствующего значения в исходной матрице является предсказанным значением.
также может получить
То есть данные о предпочтениях элемента в позиции ij могут быть представлены вектором портрета i-го пользователя и вектором портрета j-го элемента.
Используйте графическое представление следующим образом:
Математическое значение k — это ранг матричной декомпозиции, а бизнес-значение — это k влияющих факторов, влияющих на оценку элемента пользователем. В настоящее время мы не можем напрямую знать значение k. Во время обучения модели выполняется перекрестная проверка. обычно принято для нахождения оптимального значения k.
Мы можем использовать «сумму дисперсии» в качестве функции потерь.
Здесь через известные {} вычислить «дисперсию суммы», чтобы сделать ее минимальной, то есть чем ближе прогнозируемое значение к истинному значению. Полученные значения U и P — то, что нам нужно.
Градиент функции потерь
Исключайте ошибки индивидуально
При выводе ошибки L по U и P соответственно можно получить
Теперь, когда мы знаем градиент (производную) функции потерь, мы можем использовать градиентный спуск, чтобы найти значения U и P.
Градиентный спуск
Случайным образом выберите начальную точку и продолжайте обучение в направлении отрицательного градиента, пока градиент функции потерь не станет все ближе и ближе к нулю, после чего можно будет получить оптимальное решение.
Ввести регуляризацию
Чтобы предотвратить переоснащение, добавьте параметр регуляризации в функцию потерь.
λ>0
Таким образом, когда и U, и P гарантированно будут относительно малы, когда значение U или P резко изменится, скалярное произведение U и P сильно не изменится.
Окончательная функция потерь:
+
Градиент конечной функции потерь:
Используйте градиентный спуск, чтобы найти оптимальное решение
Установите скорость градиентного спуска γ (скорость обучения) и значения k, инициализируйте U и P случайным образом и повторяйте обучение, пока ошибка не будет удовлетворена.
Оценка рекомендательных систем
- Самое простое - обучить модель с помощью обучающего набора и протестировать модель с помощью тестового набора.Если производительность модели на тестовом наборе соответствует нашим ожиданиям, модель можно развернуть в Интернете. Как правило, среднее абсолютное отклонение используется для проверки качества прогнозируемого значения модели.
n: общее количество рекомендуемых значений в тестовом наборе
: рекомендательное значение реального пользователя u для элемента p
: прогнозируемая рекомендательная ценность пользователя u для элемента p
- Онлайн A/B-тестирование
Боевой проект
Формат набора данных следующий:
1 1119 9.000000
1 167 8.000000
1 6265 8.000000
1 1440 9.000000
1 1427 9.000000
1 5404 8.000000
1 259 7.000000
1 4156 8.000000
2 419 9.000000
2 415 10.000000
2 2834 9.000000
2 228 10.000000
2 107 10.000000
2 440 9.000000
2 44 10.000000
2 455 10.000000
Первый столбец — идентификатор пользователя, второй столбец — идентификатор элемента, а третий столбец — соответствующий балл (1–10).
Общий код основан на неожиданной библиотеке, которую можно установить первой.
pip install scikit-surprise
Импортируйте связанные библиотеки и наборы данных ниже
import numpy as np
import surprise
from surprise import BaselineOnly
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import cross_validate
from surprise.model_selection import train_test_split
reader = Reader(line_format='user item rating', sep='\t', rating_scale=(1, 10))
data = Dataset.load_from_file('book_ratings.dat.txt', reader=reader)
# 将数据随机分为训练和测试数据集
trainset, testset = train_test_split(data, test_size=.25)
По формуле определим функцию алгоритма
class MatrixFactorization(surprise.AlgoBase):
def __init__(self, lr, n_epochs, n_factors, lmd):
self.lr = lr # 梯度下降法的学习速率
self.n_epochs = n_epochs # 梯度下降法的迭代次数
self.n_factors = n_factors # 分解的矩阵的秩,即影响用户打分的隐藏因子
self.lmd = lmd # 正则化参数
def fit(self, trainset):
print("Fitting data...")
# 随机初始化 u 和 p 矩阵
u = np.random.normal(0, .1, (trainset.n_users, self.n_factors)) # 均值为0,方差为0.1,(行数,列数)
p = np.random.normal(0, .1, (trainset.n_items, self.n_factors))
# 梯度下降法
for _ in range(self.n_epochs):
print("Round:", _)
for i, j, r_ij in trainset.all_ratings():
# 这里就是套用上面得到的公式
# u_old[i] = u[i]
err = r_ij - np.dot(u[i], p[j])
u[i] -= -self.lr * err * p[j] + self.lr * self.lmd * u[i]
p[j] -= -self.lr * err * u[i] + self.lr * self.lmd * p[j]
self.u, self.p = u, p
self.trainset = trainset
print("End fitting!")
def estimate(self, i, j):
if self.trainset.knows_user(i) and self.trainset.knows_item(j):
return np.dot(self.u[i], self.p[j])
else:
return self.trainset.global_mean # 返回平均值
Наконец, переобучайтесь, предскажите, оцените
algo = MatrixFactorization(0.005, 60, 3, 0.2)
algo.fit(trainset)
predictions = algo.test(testset)
accuracy.mae(predictions)
Вы можете настроить скорость обучения, количество итераций, количество скрытых факторов и параметры регуляризации для обучения различных моделей и оценки результатов для получения удовлетворительной модели.