25 #ifndef ALS_VERTEX_PROGRAM_HPP
26 #define ALS_VERTEX_PROGRAM_HPP
40 #include <Eigen/Dense>
47 typedef Eigen::VectorXd vec_type;
48 typedef Eigen::MatrixXd mat_type;
146 return (edge.
data().obs - pred) * (edge.
data().obs - pred);
216 XtX(X.size(), X.size()),
Xy(X.size()) {
217 XtX.triangularView<Eigen::Upper>() = X * X.transpose();
232 if(other.
Xy.size() == 0) {
233 ASSERT_EQ(other.
XtX.rows(), 0);
234 ASSERT_EQ(other.
XtX.cols(), 0);
237 ASSERT_EQ(
XtX.rows(), 0);
238 ASSERT_EQ(
XtX.cols(), 0);
241 XtX.triangularView<Eigen::Upper>() += other.
XtX;
257 graphlab::messages::sum_priority>,
262 static double LAMBDA;
263 static size_t MAX_UPDATES;
268 return graphlab::ALL_EDGES;
274 if(edge.
data().
role == edge_data::TRAIN) {
277 }
else return gather_type();
282 const gather_type& sum) {
288 mat_type XtX = sum.XtX;
289 vec_type Xy = sum.Xy;
291 for(
int i = 0; i < XtX.rows(); ++i) XtX(i,i) += LAMBDA;
293 const vec_type old_factor = vdata.
factor;
294 vdata.
factor = XtX.selfadjointView<Eigen::Upper>().ldlt().solve(Xy);
296 vdata.
residual = (vdata.
factor - old_factor).cwiseAbs().sum() / XtX.rows();
303 return graphlab::ALL_EDGES;
339 double train_error, validation_error;
340 size_t ntrain, nvalidation;
342 train_error(0), validation_error(0), ntrain(0), nvalidation(0) { }
344 train_error += other.train_error;
345 validation_error += other.validation_error;
346 ntrain += other.ntrain;
347 nvalidation += other.nvalidation;
352 if(edge.
data().role == edge_data::TRAIN) {
354 }
else if(edge.
data().role == edge_data::VALIDATE) {
360 ASSERT_GT(agg.ntrain, 0);
361 agg.train_error = std::sqrt(agg.train_error / agg.ntrain);
363 if(agg.nvalidation > 0) {
364 const double validation_error =
365 std::sqrt(agg.validation_error / agg.nvalidation);
366 context.
cout() <<
"\t" << validation_error;
368 context.
cout() << std::endl;
376 std::string save_vertex(
const vertex_type& vertex)
const {
380 std::stringstream strm;
381 const double prediction =
385 << prediction <<
'\n';