展会信息港展会大全

C#实现协同过滤算法的实例代码
来源:互联网   发布日期:2016-01-26 10:18:55   浏览:2992次  

导读:这篇文章介绍了C 实现协同过滤算法的实例代码,有需要的朋友可以参考一下复制代码 代码如下:using System;using System Collections Generic;using System Linq;using System Text;namespace SlopeOne{ ...

这篇文章介绍了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);

}

}

}

}

赞助本站

人工智能实验室

相关热词: 过滤算法 C

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港