推薦システム:matrix_factorization

推薦システムについて調べる機会があったので、 Pythonにて実装してみた。

設計の思想はsklearnの実装に合わせて記載。

import numpy as np
class matrix_factorization():
    ''' init '''
    def __init__(self, k=2, iter=10000, step_size=0.0001):
        self.k = k
        self.iter = iter
        self.step_size = step_size
        return

    ''' fit '''
    def fit(self, x):
        m,n = x.shape
        User = np.matrix(np.random.rand(m, self.k))
        Item = np.matrix(np.random.rand(self.k, n))
        mask = x>0
        for step in np.arange(self.iter):
            error = x - User @ Item
            grad = 2 * np.multiply(error,mask)
            User = User + self.step_size * grad@Item.T
            Item = Item + self.step_size * User.T@grad
        self.x = User@Item

    ''' predict '''
    def predict(self, x):
        mask = (x==0)
        return np.multiply(self.x, mask)

x = np.array([
        [5, 1, 0, 1],
        [4, 0, 0, 1],
        [1, 2, 0, 5],
        [1, 0, 4, 4],
        [1, 1, 5, 0],
        ]
    )

mf = matrix_factorization()
mf.fit(x)
pred_y = mf.predict(x)
print(pred_y)