数据集: Epinion dataset
数据网址:http://www.datatang.com/datares/go.aspx?dataid=602020
The dataset contains: 49,290 users who rated a total of 139,738 different items at least once,
writing 664,824 reviews. 487,181 issued trust statements.
Sorec.py
import math
import numpy as np
from numpy.random import RandomState
from scipy.sparse import csr_matrix
from scipy.sparse import coo_matrix
from matplotlib import pyplot as plt
import time
import copy
def fx(x):
return (x - 1) / 4
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# The derivative of sigmoid
def sigmoid_(x):
val = sigmoid(x)
return val*(1-val)
class MF:
def __init__(self, R, Validate, C, lr = 0.01,momentum=0.8,
lambda_c=10, lambda_u=0.001, lambda_v=0.001, lambda_z=0.001, latent_size=10,iters=1000,seed=None):
"""
:param R: train set of ratings_data
:param Validate: validate set of ratings_data
:param C: trust matrix of users
:param lr: learning rate
:param momentum:
:param lambda_c:
:param lambda_u:
:param lambda_v:
:param lambda_z:
:param latent_size:
:param iters: iteration
:param seed:
"""
self.R = R
self.Validate= Validate
self.C = C
self.lambda_c = lambda_c
self.lambda_u = lambda_u
self.lambda_z = lambda_z
self.lambda_v = lambda_v
self.latent_size = latent_size
self.random_state = RandomState(seed)
self.iters = iters
self.lr = lr
self.U = np.mat(self.random_state.rand(latent_size, np.size(R, 0)))
self.V = np.mat(self.random_state.rand(latent_size, np.size(R, 1)))
self.Z = np.mat(self.random_state.rand(latent_size, np.size(C, 1)))
self.momentum = momentum
# the MAE for train set
def train_loss(self, UVdata):
loss = (np.fabs(4 * sigmoid(UVdata) + 1 - self.R.data)).sum()
loss /= self.R.shape[0]
return loss
# the MAE for validate_set
def val