/**
		 * {@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;
		}
Пример #2
0
 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;
 }
Пример #3
0
 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));
 }
Пример #4
0
			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;
			}