/// <summary> /// Utility method to extract the recommended item from a xml recommendation result /// </summary> /// <param name="nodeList">the xml element containing the recommended items.</param> /// <returns>a collection of recommended item or empty list id sh</returns> internal static IEnumerable <RecommendedItem> ExtractRecommendedItems(XmlNodeList nodeList) { var recoList = new List <RecommendedItem>(); foreach (var node in (nodeList)) { var item = new RecommendedItem(); //cycle through the recommended items foreach (var child in ((XmlElement)node).ChildNodes) { //cycle through properties var nodeName = ((XmlNode)child).LocalName; switch (nodeName) { case "Id": item.Id = ((XmlNode)child).InnerText; break; case "Name": item.Name = ((XmlNode)child).InnerText; break; case "Rating": item.Rating = ((XmlNode)child).InnerText; break; case "Reasoning": item.Reasoning = ((XmlNode)child).InnerText; break; } } recoList.Add(item); } return(recoList); }
public override bool Equals(object o) { if (!(o is GenericRecommendedItem)) { return(false); } RecommendedItem item = (RecommendedItem)o; return((this.itemID == item.getItemID()) && (this.value == item.getValue())); }
public void TestRecommender() { Recommender recommender = buildRecommender(); IList <RecommendedItem> recommended = recommender.Recommend("test1", 1); Assert.IsNotNull(recommended); Assert.AreEqual(1, recommended.Count); RecommendedItem firstRecommended = recommended[0]; Assert.AreEqual(new GenericItem <String>("2"), firstRecommended.Item); Assert.AreEqual(0.3, firstRecommended.Value); }
public void TestBestRating() { Recommender recommender = buildRecommender(); IList <RecommendedItem> recommended = recommender.Recommend("test1", 1); Assert.IsNotNull(recommended); Assert.AreEqual(1, recommended.Count); RecommendedItem firstRecommended = recommended[0]; // item one should be recommended because it has a greater rating/score Assert.AreEqual(new GenericItem <String>("2"), firstRecommended.Item); Assert.AreEqual(0.3, firstRecommended.Value, EPSILON); }
public void TestMostSimilar() { ItemBasedRecommender recommender = buildRecommender(); IList <RecommendedItem> similar = recommender.MostSimilarItems("0", 2); Assert.IsNotNull(similar); Assert.AreEqual(2, similar.Count); RecommendedItem first = similar[0]; RecommendedItem second = similar[1]; Assert.AreEqual("1", first.Item.ID); Assert.AreEqual(1.0, first.Value, EPSILON); Assert.AreEqual("2", second.Item.ID); Assert.AreEqual(0.5, second.Value, EPSILON); }
public static int GetBestReasonItemId(this RecommendedItem item) { if (item.Reasons.Count == 0) { return(-1); } var bestReason = item.Reasons.OrderByDescending(it => it.Value).First(); var bestReasonItemId = 0; if (Int32.TryParse(bestReason.Key, out bestReasonItemId)) { return(bestReasonItemId); } return(-1); }
/** * Defines a natural ordering from most-preferred item (highest value) to least-preferred. * * @param other * @return 1, -1, 0 as this value is less than, greater than or equal to the other's value */ public int CompareTo(RecommendedItem other) { double otherValue = other.Value; if (value < otherValue) { return(1); } else if (value > otherValue) { return(-1); } else { return(0); } }
public void testRecommendedBecause() { ItemBasedRecommender recommender = buildRecommender2(); IList <RecommendedItem> recommendedBecause = recommender.RecommendedBecause("test1", "4", 3); Assert.IsNotNull(recommendedBecause); Assert.AreEqual(3, recommendedBecause.Count); RecommendedItem first = recommendedBecause[0]; RecommendedItem second = recommendedBecause[1]; RecommendedItem third = recommendedBecause[2]; Assert.AreEqual("2", first.Item.ID); Assert.AreEqual(0.99, first.Value, EPSILON); Assert.AreEqual("3", second.Item.ID); Assert.AreEqual(0.4, second.Value, EPSILON); Assert.AreEqual("0", third.Item.ID); Assert.AreEqual(0.2, third.Value, EPSILON); }
public void TestBestRating() { List <User> users = new List <User>(3); users.Add(GetUser("test1", 0.0, 0.3)); users.Add(GetUser("test2", 0.2, 0.3, 0.3)); users.Add(GetUser("test3", 0.4, 0.3, 0.5)); DataModel dataModel = new GenericDataModel(users); Recommender recommender = new SlopeOneRecommender(dataModel); IList <RecommendedItem> recommended = recommender.Recommend("test1", 1); Assert.IsNotNull(recommended); Assert.AreEqual(1, recommended.Count); RecommendedItem firstRecommended = recommended[0]; // item one should be recommended because it has a greater rating/score Assert.AreEqual(new GenericItem <String>("2"), firstRecommended.Item); Assert.AreEqual(0.2400938676203033, firstRecommended.Value, EPSILON); }
public void TestMostSimilarToMultiple() { ItemBasedRecommender recommender = buildRecommender2(); List <Object> itemIDs = new List <Object>(2); itemIDs.Add("0"); itemIDs.Add("1"); IList <RecommendedItem> similar = recommender.MostSimilarItems(itemIDs, 2); Assert.IsNotNull(similar); Assert.AreEqual(2, similar.Count); RecommendedItem first = similar[0]; RecommendedItem second = similar[1]; Assert.AreEqual("2", first.Item.ID); Assert.AreEqual(0.85, first.Value, EPSILON); Assert.AreEqual("3", second.Item.ID); Assert.AreEqual(-0.3, second.Value, EPSILON); }
public void TestBestRating() { List <User> users = new List <User>(4); users.Add(GetUser("test1", 0.1, 0.3)); users.Add(GetUser("test2", 0.2, 0.3, 0.3)); users.Add(GetUser("test3", 0.4, 0.3, 0.5)); users.Add(GetUser("test4", 0.7, 0.3, 0.8)); DataModel dataModel = new GenericDataModel(users); UserCorrelation correlation = new PearsonCorrelation(dataModel); ClusterSimilarity similarity = new FarthestNeighborClusterSimilarity(correlation); Recommender recommender = new TreeClusteringRecommender(dataModel, similarity, 2); IList <RecommendedItem> recommended = recommender.Recommend("test1", 1); Assert.IsNotNull(recommended); Assert.AreEqual(1, recommended.Count); RecommendedItem firstRecommended = recommended[0]; // item one should be recommended because it has a greater rating/score Assert.AreEqual(new GenericItem <String>("2"), firstRecommended.Item); Assert.AreEqual(0.3, firstRecommended.Value, EPSILON); }
/// <summary> /// Utility method to extract the recommended item from a xml recommendation result /// </summary> /// <param name="nodeList">the xml element containing the recommended items.</param> /// <returns>a collection of recommended item or empty list id sh</returns> internal static IEnumerable<RecommendedItem> ExtractRecommendedItems(XmlNodeList nodeList) { var recoList = new List<RecommendedItem>(); foreach (var node in (nodeList)) { var item = new RecommendedItem(); //cycle through the recommended items foreach (var child in ((XmlElement)node).ChildNodes) { //cycle through properties var nodeName = ((XmlNode)child).LocalName; switch (nodeName) { case "Id": item.Id = ((XmlNode)child).InnerText; break; case "Name": item.Name = ((XmlNode)child).InnerText; break; case "Rating": item.Rating = ((XmlNode)child).InnerText; break; case "Reasoning": item.Reasoning = ((XmlNode)child).InnerText; break; } } recoList.Add(item); } return recoList; }
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder, DataModelBuilder dataModelBuilder, DataModel dataModel, IDRescorer rescorer, int at, double relevanceThreshold, double evaluationPercentage) { int num = dataModel.getNumItems(); RunningAverage average = new FullRunningAverage(); RunningAverage average2 = new FullRunningAverage(); RunningAverage average3 = new FullRunningAverage(); RunningAverage average4 = new FullRunningAverage(); int num2 = 0; int num3 = 0; IEnumerator <long> enumerator = dataModel.getUserIDs(); while (enumerator.MoveNext()) { long current = enumerator.Current; if (this.random.nextDouble() < evaluationPercentage) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); PreferenceArray prefs = dataModel.getPreferencesFromUser(current); double num5 = double.IsNaN(relevanceThreshold) ? computeThreshold(prefs) : relevanceThreshold; FastIDSet relevantItemIDs = this.dataSplitter.getRelevantItemsIDs(current, at, num5, dataModel); int num6 = relevantItemIDs.size(); if (num6 > 0) { FastByIDMap <PreferenceArray> trainingUsers = new FastByIDMap <PreferenceArray>(dataModel.getNumUsers()); IEnumerator <long> enumerator2 = dataModel.getUserIDs(); while (enumerator2.MoveNext()) { this.dataSplitter.processOtherUser(current, relevantItemIDs, trainingUsers, enumerator2.Current, dataModel); } DataModel model = (dataModelBuilder == null) ? new GenericDataModel(trainingUsers) : dataModelBuilder.buildDataModel(trainingUsers); try { model.getPreferencesFromUser(current); } catch (NoSuchUserException) { continue; } int num7 = num6 + model.getItemIDsFromUser(current).size(); if (num7 >= (2 * at)) { Recommender recommender = recommenderBuilder.buildRecommender(model); int num8 = 0; List <RecommendedItem> list = recommender.recommend(current, at, rescorer); foreach (RecommendedItem item in list) { if (relevantItemIDs.contains(item.getItemID())) { num8++; } } int count = list.Count; if (count > 0) { average.addDatum(((double)num8) / ((double)count)); } average2.addDatum(((double)num8) / ((double)num6)); if (num6 < num7) { average3.addDatum(((double)(count - num8)) / ((double)(num - num6))); } double num10 = 0.0; double num11 = 0.0; for (int i = 0; i < count; i++) { RecommendedItem item2 = list[i]; double num13 = 1.0 / log2(i + 2.0); if (relevantItemIDs.contains(item2.getItemID())) { num10 += num13; } if (i < num6) { num11 += num13; } } if (num11 > 0.0) { average4.addDatum(num10 / num11); } num2++; if (count > 0) { num3++; } stopwatch.Stop(); log.info("Evaluated with user {} in {}ms", new object[] { current, stopwatch.ElapsedMilliseconds }); log.info("Precision/recall/fall-out/nDCG/reach: {} / {} / {} / {} / {}", new object[] { average.getAverage(), average2.getAverage(), average3.getAverage(), average4.getAverage(), ((double)num3) / ((double)num2) }); } } } } return(new IRStatisticsImpl(average.getAverage(), average2.getAverage(), average3.getAverage(), average4.getAverage(), ((double)num3) / ((double)num2))); }
/** * Defines a natural ordering from most-preferred item (highest value) to least-preferred. * * @param other * @return 1, -1, 0 as this value is less than, greater than or equal to the other's value */ public int CompareTo(RecommendedItem other) { double otherValue = other.Value; if (value < otherValue) { return 1; } else if (value > otherValue) { return -1; } else { return 0; } }