logo资料库

C#实现协同过滤算法的实例代码.pdf

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
C#实现协同过滤算法的实例代码 实现协同过滤算法的实例代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SlopeOne { public class Rating { public float Value { get; set; } public int Freq { get; set; } public float AverageValue { get { return Value / Freq; } } } public class RatingDifferenceCollection : Dictionary { private string GetKey(int Item1Id, int Item2Id) { return (Item1Id < Item2Id) ? Item1Id + “/” + Item2Id : Item2Id + “/” + Item1Id ; } public bool Contains(int Item1Id, int Item2Id) { return this.Keys.Contains(GetKey(Item1Id, Item2Id)); } public Rating this[int Item1Id, int Item2Id] { get { return this[this.GetKey(Item1Id, Item2Id)]; } set { this[this.GetKey(Item1Id, Item2Id)] = value; } } } public class SlopeOne { public RatingDifferenceCollection _DiffMarix = new RatingDifferenceCollection(); // The dictionary to keep the diff matrix public HashSet _Items = new HashSet(); // Tracking how many items totally public void AddUserRatings(IDictionary userRatings) { foreach (var item1 in userRatings) { int item1Id = item1.Key; float item1Rating = item1.Value; _Items.Add(item1.Key); foreach (var item2 in userRatings) { if (item2.Key <= item1Id) continue; // Eliminate redundancy int item2Id = item2.Key; float item2Rating = item2.Value; Rating ratingDiff; if (_DiffMarix.Contains(item1Id, item2Id)) { ratingDiff = _DiffMarix[item1Id, item2Id]; } else { ratingDiff = new Rating(); _DiffMarix[item1Id, item2Id] = ratingDiff; } ratingDiff.Value += item1Rating – item2Rating; ratingDiff.Freq += 1; } }
} // Input ratings of all users public void AddUerRatings(IList> Ratings) { foreach(var userRatings in Ratings) { AddUserRatings(userRatings); } } public IDictionary Predict(IDictionary userRatings) { Dictionary Predictions = new Dictionary(); foreach (var itemId in this._Items) { if (userRatings.Keys.Contains(itemId)) continue; // User has rated this item, just skip it Rating itemRating = new Rating(); foreach (var userRating in userRatings) { if (userRating.Key == itemId) continue; int inputItemId = userRating.Key; if (_DiffMarix.Contains(itemId, inputItemId)) { Rating diff = _DiffMarix[itemId, inputItemId]; itemRating.Value += diff.Freq * (userRating.Value + diff.AverageValue * ((itemId < inputItemId) ? 1 : -1)); itemRating.Freq += diff.Freq; } } Predictions.Add(itemId, itemRating.AverageValue); } return Predictions; } public static void Test() { SlopeOne test = new SlopeOne(); Dictionary userRating = new Dictionary(); userRating.Add(1, 5); userRating.Add(2, 4); userRating.Add(3, 4); test.AddUserRatings(userRating); userRating = new Dictionary(); userRating.Add(1, 4); userRating.Add(2, 5); userRating.Add(3, 3); userRating.Add(4, 5); test.AddUserRatings(userRating); userRating = new Dictionary(); userRating.Add(1, 4); userRating.Add(2, 4); userRating.Add(4, 5); test.AddUserRatings(userRating); userRating = new Dictionary(); userRating.Add(1, 5); userRating.Add(3, 4); IDictionary Predictions = test.Predict(userRating); foreach (var rating in Predictions) { Console.WriteLine(“Item ” + rating.Key + ” Rating: ” + rating.Value); } } } } 您可能感兴趣的文章:C#实现过滤sql特殊字符的方法集合C#敏感词过滤实现方法C#实现过滤html标签并保留a标签的方法C#检 您可能感兴趣的文章 测是否有危险字符的SQL字符串过滤方法C# 撒列实现关键字过滤的实例c#中过滤html的正则表达式C#中文件名或文件路径非 法字符判断方法C#实现简单过滤非法字符实例
分享到:
收藏