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 }
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 }