class_docstr: Social recommendation using Probabilistic Matrix Factorization.
  
  Parameters
  ----------
  k: int, optional, default: 5
      The dimension of the latent factors.
  
  max_iter: int, optional, default: 100
      Maximum number of iterations or the number of epochs for SGD.
  
  learning_rate: float, optional, default: 0.001
      The learning rate for SGD_RMSProp.
  
  gamma: float, optional, default: 0.9
      The weight for previous/current gradient in RMSProp.
  
  lambda_c: float, optional, default: 10
      The parameter balancing the information from the user-item rating matrix and the user social network.
  
  lambda_reg: float, optional, default: 0.001
      The regularization parameter.
      
  weight_link: boolean, optional, default: True
      When true the social network links are weighted according to eq. (4) in the original paper.
  
  name: string, optional, default: 'SoRec'
      The name of the recommender model.
  
  trainable: boolean, optional, default: True
      When False, the model is not trained and Cornac assumes that the model already
      pre-trained (U, V and Z are not None).
  
  verbose: boolean, optional, default: False
      When True, some running logs are displayed.
  
  init_params: dictionary, optional, default: None
      List of initial parameters, e.g., init_params = {'U':U, 'V':V, 'Z':Z}.
  
      U: a ndarray of shape (n_users, k)
          Containing the user latent factors.
          
      V: a ndarray of shape (n_items, k)
          Containing the item latent factors.
          
      Z: a ndarray of shape (n_users, k)
          Containing the social network latent factors.
  
  seed: int, optional, default: None
      Random seed for parameters initialization.
  
  References
  ----------
  * H. Ma, H. Yang, M. R. Lyu, and I. King. SoRec:Social recommendation using probabilistic matrix factorization.      CIKM ’08, pages 931–940, Napa Valley, USA, 2008.
docstr: Fit the model to observations.
  
  Parameters
  ----------
  train_set: :obj:`cornac.data.Dataset`, required
      User-Item preference data as well as additional modalities.
  
  val_set: :obj:`cornac.data.Dataset`, optional, default: None
      User-Item preference data for model selection purposes (e.g., early stopping).
  
  Returns
  -------
  self : object
docstr_tok: ["Fit","the","model","to","observations",".","Parameters","--","--","--","--","--","train_set",":",":","obj",":","`","cornac.data.Dataset","`",",","required","User-Item","preference","data","as","well","as","additional","modalities",".","val_set",":",":","obj",":","`","cornac.data.Dataset","`",",","optional",",","default",":","None","User-Item","preference","data","for","model","selection","purposes","(","e.g.",",","early","stopping",")",".","Returns","--","--","--","-","self",":","object"]
code: def fit(self, train_set, val_set=None):
      """Fit the model to observations.
  
      Parameters
      ----------
      train_set: :obj:`cornac.data.Dataset`, required
          User-Item preference data as well as additional modalities.
  
      val_set: :obj:`cornac.data.Dataset`, optional, default: None
          User-Item preference data for model selection purposes (e.g., early stopping).
  
      Returns
      -------
      self : object
      """
      Recommender.fit(self, train_set, val_set)
  
      import math
      from cornac.models.sorec import sorec
  
      if self.trainable:
          # user-item interactions
          (rat_uid, rat_iid, rat_val) = train_set.uir_tuple
  
          # user social network
          train_user_indices = set(train_set.uir_tuple[0])
          (
              net_uid,
              net_jid,
              net_val,
          ) = train_set.user_graph.get_train_triplet(
              train_user_indices, train_user_indices
          )
  
          if self.weight_link:
              degree = train_set.user_graph.get_node_degree(
                  train_user_indices, train_user_indices
              )
              weighted_net_val = []
              for u, j, val in zip(net_uid, net_jid, net_val):
                  u_out = degree[int(u)][1]
                  j_in = degree[int(j)][0]
                  val_weighted = math.sqrt(j_in / (j_in + u_out)) * val
                  weighted_net_val.append(val_weighted)
              net_val = weighted_net_val
  
          if [self.min_rating, self.max_rating] != [0, 1]:
              if self.min_rating == self.max_rating:
                  rat_val = scale(
                      rat_val, 0.0, 1.0, 0.0, self.max_rating
                  )
              else:
                  rat_val = scale(
                      rat_val,
                      0.0,
                      1.0,
                      self.min_rating,
                      self.max_rating,
                  )
  
          rat_val = np.array(rat_val, dtype="float32")
          rat_uid = np.array(rat_uid, dtype="int32")
          rat_iid = np.array(rat_iid, dtype="int32")
  
          net_val = np.array(net_val, dtype="float32")
          net_uid = np.array(net_uid, dtype="int32")
          net_jid = np.array(net_jid, dtype="int32")
  
          if self.verbose:
              print("Learning...")
  
          res = sorec.sorec(
              rat_uid,
              rat_iid,
              rat_val,
              net_uid,
              net_jid,
              net_val,
              k=self.k,
              n_users=train_set.num_users,
              n_items=train_set.num_items,
              n_ratings=len(rat_val),
              n_edges=len(net_val),
              n_epochs=self.max_iter,
              lambda_c=self.lambda_c,
              lambda_reg=self.lambda_reg,
              learning_rate=self.learning_rate,
              gamma=self.gamma,
              init_params={"U": self.U, "V": self.V, "Z": self.Z},
              verbose=self.verbose,
              seed=self.seed,
          )
  
          self.U = np.asarray(res["U"])
          self.V = np.asarray(res["V"])
          self.Z = np.asarray(res["Z"])
  
          if self.verbose:
              print("Learning completed")
  
      elif self.verbose:
          print("%s is trained already (trainable = False)" % self.name)
  
      return self
  
file_path: cornac/cornac/models/sorec/recom_sorec.py
imports: import numpy
  import scipy
  from ..recommender import Recommender
  from ..recommender import ANNMixin, MEASURE_DOT
  from ...utils.common import sigmoid
  from ...utils.common import scale
  from ...exception import ScoreException
label_desc: Use image node_id 2 for calling the SoRec obj's underlying member method code with example usage: obj.fit(train_set, val_set) and returns: self