C语言

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

时间:2024-06-19 03:47:09 C语言 我要投稿
  • 相关推荐

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

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

  }

  }

  }

  }

【C#实现协同过滤算法的实例代码】相关文章:

C#数据结构之循环链表的实例代码12-04

C语言插入排序算法及实例代码12-05

C语言选择排序算法及实例代码11-25

C语言实现归并排序算法实例04-01

Java实现在不同线程中运行的代码实例详解11-20

C语言中实现“17进制”转“10进制”代码(实例)03-02

C语言快速排序实例代码06-04

让网站变灰的css代码实例12-02

java中通用的线程池实例代码08-27