// global svd P Q private void buildGlobalModel() throws Exception { for (int iter = 1; iter <= numIters; iter++) { for (MatrixEntry me : trainMatrix) { int u = me.row(); // user int i = me.column(); // item double rui = me.get(); double pui = DenseMatrix.rowMult(P, u, Q, i); double eui = rui - pui; // update factors for (int f = 0; f < numFactors; f++) { double puf = P.get(u, f), qif = Q.get(i, f); P.add(u, f, lRate * (eui * qif - regU * puf)); Q.add(i, f, lRate * (eui * puf - regI * qif)); } } } // end of training }
@Override protected double predict(int u, int j) { return globalMean + DenseMatrix.rowMult(P, u, Q, j); }