还在找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

  {

  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(IDictionaryuserRatings)

  {

  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(IListRatings)

  {

  foreach(var userRatings in Ratings)

  {

  AddUserRatings(userRatings);

  }

  }

  public IDictionaryPredict(IDictionaryuserRatings)

  {

  DictionaryPredictions = 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();

  DictionaryuserRating = 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);

  IDictionaryPredictions = test.Predict(userRating);

  foreach (var rating in Predictions)

  {

  Console.WriteLine("Item " + rating.Key + " Rating: " + rating.Value);

  }

  }

  }

  }

1.《协同过滤算法 C#实现协同过滤算法的实例代码》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《协同过滤算法 C#实现协同过滤算法的实例代码》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/76872.html