手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#实现协同过滤算法的实例代码
C#实现协同过滤算法的实例代码
摘要:复制代码代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;...

复制代码 代码如下:

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#实现协同过滤算法的实例代码】相关文章:

C# 游戏外挂实现核心代码

C# 大小写转换(金额)实例代码

C#实现路由器断开连接,更改公网ip的实例代码

Treeview动态添加用户控件传值和取值的实例代码

gridview 显示图片的实例代码

C#实现大数字运算的实例代码

C#中实现网段扫描的代码

c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码

C#版ftp方法实现类的代码

c#简单读取文本的实例方法

精品推荐
分类导航