Ejemplo n.º 1
0
  void learning() {
    int data_sz = samples.size();
    int data_dim = samples[0].size();
    theta = random_double_list(data_dim);
    vector<int> idx;
    for(int i = 0; i < data_sz; ++i) {
      idx.push_back(i);
    }
    
    double coff2 = 2. * beta * alpha;
    // training loop
    for(int rd = 0; rd < rounds; ++rd) {
      random_shuffle(idx.begin(), idx.end());
      vector<double> delta(data_dim, 0);
      for(auto id : idx) {
        double opt1 = alpha * (labels[id] - lr_hypothesis(samples[id]));
        for(int i = 0; i < data_dim; ++i) {
          double t = opt1 * samples[id][i] - coff2 * theta[i];
          delta[i] += t;
        }
      } // traverse 

      for(int i = 0; i < data_dim; ++i) {
        theta[i] += delta[i];
      }
      if(debug) {
        loss_error.push_back(calc_loss());
      }
      std::cout << "round " << rd << " finished." << std::endl;
    } // training loop 

  }
Ejemplo n.º 2
0
  void learning() {
    std::vector<double> delta_p(k), delta_q(k);
    for(auto & kv : usr_dct) {
      p[kv.second] = random_double_list(k, 0.1);
      usr_bias[kv.second] = 0.1 * random_double();
    }
    for(auto & kv : item_dct) {
      q[kv.second] = random_double_list(k, 0.1);
      item_bias[kv.second] = 0.1 * random_double();
    }
    std::cout << "init done" << std::endl;

    auto learning_lambda = [&] (const std::string & uid,
                                const std::string & iid,
                                double rating) {
      double e = rating - estimate(uid, iid);
      // compute delta
      for(int i = 0; i < k; ++i) {
        delta_p[i] = alpha * (2 * e * q[iid][i] - beta * p[uid][i]);
        delta_q[i] = alpha * (2 * e * p[uid][i] - beta * q[iid][i]);
      }
      // update with delta
      for(int i = 0; i < k; ++i) {
        p[uid][i] += delta_p[i];
        q[iid][i] += delta_q[i];
      }
      // update bias
      usr_bias[uid] += alpha * (2 * e - beta * usr_bias[uid]);
      item_bias[iid] += alpha * (2 * e - beta * item_bias[iid]);
    };

    // learning
    for(int rd = 0; rd < rounds; ++rd) {
      std::cout << "rd:" << rd << " started" << std::endl;
      rating_graph.traverse(learning_lambda);
    } // end for
  }