/** * {@inheritDoc} */ public double Evaluate(RecommenderBuilder recommenderBuilder, DataModel dataModel, double trainingPercentage, double evaluationPercentage) { if (recommenderBuilder == null) { throw new ArgumentNullException("recommenderBuilder is null"); } if (dataModel == null) { throw new ArgumentNullException("dataModel is null"); } if (double.IsNaN(trainingPercentage) || trainingPercentage <= 0.0 || trainingPercentage >= 1.0) { throw new ArgumentException("Invalid trainingPercentage: " + trainingPercentage); } if (double.IsNaN(evaluationPercentage) || evaluationPercentage <= 0.0 || evaluationPercentage > 1.0) { throw new ArgumentException("Invalid evaluationPercentage: " + evaluationPercentage); } log.Info("Beginning evaluation using " + trainingPercentage + " of " + dataModel); int numUsers = dataModel.GetNumUsers(); ICollection<User> trainingUsers = new List<User>(1 + (int) (trainingPercentage * (double) numUsers)); IDictionary<User, ICollection<Preference>> testUserPrefs = new Dictionary<User, ICollection<Preference>>(1 + (int) ((1.0 - trainingPercentage) * (double) numUsers)); foreach (User user in dataModel.GetUsers()) { if (random.NextDouble() < evaluationPercentage) { ICollection<Preference> trainingPrefs = new List<Preference>(); ICollection<Preference> testPrefs = new List<Preference>(); Preference[] prefs = user.GetPreferencesAsArray(); foreach (Preference pref in prefs) { Item itemCopy = new GenericItem<String>(pref.Item.ID.ToString()); Preference newPref = new GenericPreference(null, itemCopy, pref.Value); if (random.NextDouble() < trainingPercentage) { trainingPrefs.Add(newPref); } else { testPrefs.Add(newPref); } } if (log.IsDebugEnabled) { log.Debug("Training against " + trainingPrefs.Count + " preferences"); log.Debug("Evaluating accuracy of " + testPrefs.Count + " preferences"); } if (trainingPrefs.Count > 0) { User trainingUser = new GenericUser<String>(user.ID.ToString(), trainingPrefs); trainingUsers.Add(trainingUser); if (testPrefs.Count > 0) { testUserPrefs.Add(trainingUser, testPrefs); } } } } DataModel trainingModel = new GenericDataModel(trainingUsers); Recommender recommender = recommenderBuilder.BuildRecommender(trainingModel); double result = GetEvaluation(testUserPrefs, recommender); log.Info("Evaluation result: " + result); return result; }
public Preference[] GetPreferencesAsArray() { Preference[] sortedPrefs = delegateUser.GetPreferencesAsArray(); Array.Sort(sortedPrefs, ByValuePreferenceComparer.Instance); for (int i = 0; i < sortedPrefs.Length; i++) { sortedPrefs[i] = new GenericPreference(this, sortedPrefs[i].Item, (double) (i + 1)); } Array.Sort(sortedPrefs, ByItemPreferenceComparer.Instance); return sortedPrefs; }
public void testNoCorrelation2() { Preference pref1 = new GenericPreference(null, new GenericItem<String>("1"), 1.0); GenericUser<String> user1 = new GenericUser<String>("test1", ScalarToList<Preference>(pref1)); Preference pref2 = new GenericPreference(null, new GenericItem<String>("2"), 1.0); GenericUser<String> user2 = new GenericUser<String>("test2", ScalarToList<Preference>(pref2)); DataModel dataModel = GetDataModel(user1, user2); double correlation = new PearsonCorrelation(dataModel).GetUserCorrelation(user1, user2); Assert.IsTrue(Double.IsNaN(correlation)); }
public IEnumerable<Preference> GetPreferences() { // todo: cache this Preference[] source = delegateUser.GetPreferencesAsArray(); int length = source.Length; Preference[] sortedPrefs = new Preference[length]; Array.Copy(source, sortedPrefs, length); for (int i = 0; i < length; i++) { Item item = sortedPrefs[i].Item; sortedPrefs[i] = new GenericPreference(this, item, (double) (i + 1)); } Array.Sort<Preference>(sortedPrefs, ByValuePreferenceComparer.Instance); return sortedPrefs; }