package librec.undefined; import librec.data.DenseMatrix; import librec.data.MatrixEntry; import librec.data.SparseMatrix; import librec.intf.SocialRecommender; public class TrustPredictor extends SocialRecommender { public static void update(){ LibRec.rateMatrix = socialMatrix; } public TrustPredictor(SparseMatrix trainMatrix, SparseMatrix testMatrix, int fold) { super(trainMatrix, testMatrix, fold); } @Override protected void initModel() { P = new DenseMatrix(numUsers, numFactors); Q = new DenseMatrix(numUsers, numFactors); P.init(0.01); Q.init(0.01); } @Override protected void buildModel() { for (int iter = 1; iter <= numIters; iter++) { loss = 0; errs = 0; for (MatrixEntry me : trainMatrix) { int u = me.row(); // user int j = me.column(); // item double ruj = me.get(); if (ruj <= 0.0) continue; double pred = predict(u, j, false); double euj = ruj - pred; errs += euj * euj; loss += euj * euj; // update factors for (int f = 0; f < numFactors; f++) { double puf = P.get(u, f); double qjf = Q.get(j, f); double delta_u = euj * qjf - regU * puf; double delta_j = euj * puf - regI * qjf; P.add(u, f, lRate * delta_u); Q.add(j, f, lRate * delta_j); loss += regU * puf * puf + regI * qjf * qjf; } } errs *= 0.5; loss *= 0.5; if (isConverged(iter)) break; }// end of training } }