C#实现协同过滤算法的实例代码
来源: 阅读:1610 次 日期:2014-09-05 15:36:49
温馨提示: 小编为您整理了“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(IDictionary 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> Ratings)

{

foreach(var userRatings in Ratings)

{

AddUserRatings(userRatings);

}

}

public IDictionary Predict(IDictionary userRatings)

{

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

Dictionary userRating = 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);

IDictionary Predictions = test.Predict(userRating);

foreach (var rating in Predictions)

{

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

}

}

}

}

更多信息请查看IT技术专栏

更多信息请查看 网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们| 联系我们| 人才招聘| 网站声明| 网站帮助| 非正式的简要咨询| 简要咨询须知| 加入群交流| 手机站点| 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00) 版权所有:
云南网警报警专用图标
Baidu
map