package org.shanbo.feluca.cf.common; import org.shanbo.feluca.data2.DataEntry; import org.shanbo.feluca.data2.RandomAccessData; import org.shanbo.feluca.data2.Vector; import org.shanbo.feluca.data2.DataStatistic; import org.shanbo.feluca.paddle.common.Utilities; public class Evaluation { /** * testing RMSE using history * @param test * @param model * @return * @throws Exception */ public static double runRMSE(RandomAccessData train, DataEntry test, Recommender model) throws Exception{ double error = 0; int dbsize = Utilities.getIntFromProperties(test.getDataStatistic(), DataStatistic.TOTAL_FEATURES); System.out.println(dbsize); int cc = 0; test.reOpen(); for(Vector v = test.getNextVector(); v != null ; v = test.getNextVector()){ UserRatings ur = new UserRatings(v); int[] toPredicts = new int[ur.getItemNum()]; // draw itemid apart for(int i = 0 ; i < ur.getItemNum(); i++){ toPredicts[i] = ur.getRatingByIndex(i).itemId; } UserRatings history = new UserRatings(train.getVectorById(ur.getUid())); // predict in batch mode float[] predicts = model.predict(history, toPredicts); if (predicts == null) dbsize -= ur.getItemNum(); else{ for(int i = 0 ; i < ur.getItemNum(); i++ ){ RatingInfo ri = ur.getRatingByIndex(i); error += Math.pow((ri.rating - predicts[i]), 2); } } cc += 1; if (cc % 2000 == 0){ System.out.print("."); } } test.close(); train.close(); return Math.sqrt(error / dbsize); } /** * without cf history * @param test * @param model * @return * @throws Exception */ public static double runRMSE(DataEntry test, Recommender model) throws Exception{ double error = 0; int dbsize = Utilities.getIntFromProperties(test.getDataStatistic(), DataStatistic.TOTAL_FEATURES); System.out.println(dbsize); int cc = 0; test.reOpen(); for(Vector v = test.getNextVector(); v != null ; v = test.getNextVector()){ UserRatings ur = new UserRatings(v); int[] toPredicts = new int[ur.getItemNum()]; // draw itemid apart for(int i = 0 ; i < ur.getItemNum(); i++){ toPredicts[i] = ur.getRatingByIndex(i).itemId; } // predict in batch mode float[] predicts = model.predict(ur, toPredicts); if (predicts == null) dbsize -= ur.getItemNum(); else{ for(int i = 0 ; i < ur.getItemNum(); i++ ){ RatingInfo ri = ur.getRatingByIndex(i); error += Math.pow((ri.rating - predicts[i]), 2); } } cc += 1; if (cc % 2000 == 0){ System.out.print("."); } } test.close(); return Math.sqrt(error / dbsize); } }