Рекомендательная система на основе алгоритма матричной факторизации

искусственный интеллект Python алгоритм
Рекомендательная система на основе алгоритма матричной факторизации

Рекомендательная система на основе алгоритма матричной факторизации

Рекомендуемая система

Система рекомендаций может рекомендовать пользователям разные вещи в соответствии с их предпочтениями.

Рекомендуемый тип системы:

  1. Ручная настройка рекомендуемого контента
  2. Сортируйте товары на основе их продаж, экспозиции и т. д. и рекомендуйте их пользователям.
  3. В соответствии с различными алгоритмами объединяйте данные разных размеров, чтобы разумно рекомендовать товары.

Простая модель рекомендательной системы

Предполагать:

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

Ключевые вопросы матрицы рекомендуемых значений:

  1. Получение начального значения, сбор данных
  2. Прогнозирование неизвестных данных на основе известных данных из матрицы рекомендаций
  3. Создать систему оценки для проверки эффективности системы рекомендаций

Сбор данных

Как правило, можно использовать метод веб-краулера, например, для оценки данных вы можете сканировать данные на Douban Reading или собирать информацию о пользователях, скрывая точки на веб-сайтах, которые вы можете контролировать.

Прогнозировать неизвестные данные

Основные проблемы:

  • Когда количество пользователей и элементов относительно велико, рекомендуемая матрица обычно представляет собой разреженную матрицу (в матрице, если количество элементов со значением 0 намного больше, чем количество ненулевых элементов, а распределение ненулевых элементов неравномерно, матрица называется разреженной матрицей), что указывает на то, что большинство пользователей могут не выражать предпочтения по большинству элементов.

  • Проблема холодного старта — это проблема, с которой должна столкнуться каждая рекомендательная система.

Пример матричной факторизации:

\begin{pmatrix}         1 & 3 & 5 & 4 \\           & 2  &  & 4 \\            3 & 4 & 3 & &  \\         \end{pmatrix}           \approx          \begin{pmatrix}         -0.77 & -1.84 \\          -0.2 & -1.85 \\            -1.98 & -0.54 \\         \end{pmatrix}         \begin{pmatrix}         -1.46 & -1.67 & -0.88 & -0.32 \\          0.04 & -0.89 & -2.3 & -2.04 &  \\         \end{pmatrix}  =          \begin{pmatrix}         1.06 & 2.93 & 4.9 & 4 \\         0.21 & 1.97 & 4.41 & 3.84 \\            2.88 & 3.79 & 2.98 & 1.73 &  \\         \end{pmatrix}

который:R \approx U * P^T = R^*

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

также может получить

R_{ij} \approx U_i * P_j = R^*_{ij}

То есть данные о предпочтениях элемента в позиции ij могут быть представлены вектором портрета i-го пользователя и вектором портрета j-го элемента.

Используйте графическое представление следующим образом:

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

Мы можем использовать «сумму дисперсии» в качестве функции потерь.

min_{U,P}\sum_{i,j}1/2(R_{ij}-U_i \cdot P_j)^2

Здесь через известные {{(i,j),r_{ij}}} вычислить «дисперсию суммы», чтобы сделать ее минимальной, то есть чем ближе прогнозируемое значение к истинному значению. Полученные значения U и P — то, что нам нужно.

Градиент функции потерь

Исключайте ошибки индивидуально

L_{ij} = 1/2(R_{ij} - U_i \cdot P_j)^2

При выводе ошибки L по U и P соответственно можно получить

\frac{\partial L_{ij}}{\partial U_i} = \frac{\partial 1/2(R_{ij} - U_i \cdot P_j)^2}{\partial U_i} = -P_j(R_{ij} - U_i \cdot P_j)

\frac{\partial L_{ij}}{\partial P_j} = \frac{\partial 1/2(R_{ij} - U_i \cdot P_j)^2}{\partial P_j} = -U_i(R_{ij} - U_i \cdot P_j)

Теперь, когда мы знаем градиент (производную) функции потерь, мы можем использовать градиентный спуск, чтобы найти значения U и P.

Градиентный спуск

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

Ввести регуляризацию

Чтобы предотвратить переоснащение, добавьте параметр регуляризации в функцию потерь.

λ[\sum_{i=1}^m|U_i|^2 + \sum_{i=1}^n|P_i|^2]

λ>0

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

Окончательная функция потерь:

min_{U,P}\sum_{i,j}1/2(R_{ij}-U_i \cdot P_j)^2 + λ[\sum_{i=1}^m|U_i|^2 + \sum_{i=1}^n|P_i|^2]

Градиент конечной функции потерь:

\frac{\partial L_{ij}}{\partial U_i} = \frac{\partial 1/2(R_{ij} - U_i \cdot P_j)^2}{\partial U_i} = -P_j(R_{ij} - U_i \cdot P_j) + λU_i

\frac{\partial L_{ij}}{\partial P_j} = \frac{\partial 1/2(R_{ij} - U_i \cdot P_j)^2}{\partial P_j} = -U_i(R_{ij} - U_i \cdot P_j) + λP_j

Используйте градиентный спуск, чтобы найти оптимальное решение

Установите скорость градиентного спуска γ (скорость обучения) и значения k, инициализируйте U и P случайным образом и повторяйте обучение, пока ошибка не будет удовлетворена.

U_i = U_i - γ\frac{\partial L_{ij}}{\partial U_i}

P_j = P_j - γ\frac{\partial L_{ij}}{\partial P_j}

Оценка рекомендательных систем

  • Самое простое - обучить модель с помощью обучающего набора и протестировать модель с помощью тестового набора.Если производительность модели на тестовом наборе соответствует нашим ожиданиям, модель можно развернуть в Интернете. Как правило, среднее абсолютное отклонение используется для проверки качества прогнозируемого значения модели.M_d = 1/n\sum|r_{up} - r^*_{up}|

n: общее количество рекомендуемых значений в тестовом наборе

r_{up}: рекомендательное значение реального пользователя u для элемента p

r^*_{up}: прогнозируемая рекомендательная ценность пользователя 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)

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