标题 | C#实现协同过滤算法的实例代码 |
内容 | 这篇文章介绍了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<string, Rating> { 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<string>(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<int> _Items = new HashSet<int>(); // Tracking how many items totally public void AddUserRatings(IDictionary<int, float> 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<IDictionary<int, float>> Ratings) { foreach(var userRatings in Ratings) { AddUserRatings(userRatings); } } public IDictionary<int, float> Predict(IDictionary<int, float> userRatings) { Dictionary<int, float> Predictions = new Dictionary<int, float>(); 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<int, float> userRating = new Dictionary<int, float>(); userRating.Add(1, 5); userRating.Add(2, 4); userRating.Add(3, 4); test.AddUserRatings(userRating); userRating = new Dictionary<int, float>(); userRating.Add(1, 4); userRating.Add(2, 5); userRating.Add(3, 3); userRating.Add(4, 5); test.AddUserRatings(userRating); userRating = new Dictionary<int, float>(); userRating.Add(1, 4); userRating.Add(2, 4); userRating.Add(4, 5); test.AddUserRatings(userRating); userRating = new Dictionary<int, float>(); userRating.Add(1, 5); userRating.Add(3, 4); IDictionary<int, float> Predictions = test.Predict(userRating); foreach (var rating in Predictions) { Console.WriteLine("Item " + rating.Key + " Rating: " + rating.Value); } } } } |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。