源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-12-26 06:41 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#实现协同过滤算法的实例代码
[u]复制代码[/u] 代码如下:
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);             }         }     } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部