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
}
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
public void AddUserRatings(IDictionary
{
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
{
foreach(var userRatings in Ratings)
{
AddUserRatings(userRatings);
}
}
public IDictionary
{
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.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
foreach (var rating in Predictions)
{
Console.WriteLine(Item + rating.Key + Rating: + rating.Value);
}
}
}
}
同类资源
- SMA4加密算法
SMA4加密算法例子源代码,今天给大家带来了SMA4加密算法。...
- 易语言抖动算法
易语言抖动算法例子源代码,DIY激光雕刻机可以用到,抖动代码部分来源网络。...
- TPLINK登录算法,非JS脚本计算
易语言TPLINK登录算法,非JS脚本计算例子源代码,分享了一份TPLINK的登录源码。...
- 基于SunDay匹配算法修改的寻找字节集
易语言基于SunDay匹配算法修改的寻找字节集例子源代码,越长则更能发挥该算法的作用。...
- KMP匹配算法汇编版
易语言KMP匹配算法汇编版例子源代码,汇编版跟易语言版的速度对比差距非常大。...
- DXTC图片算法加预览工具
易语言DXTC图片算法加预览工具例子源代码,可查看Lithtech引擎下的Dtx缩率图文件。...
- JS加密算法
JS加密算法例子源代码,分享一下JS加密代码,有兴趣的可以自己练习一下。...
- 本地验证码识别算法,数字字母,识别率99%,算法有待优化
本地验证码识别算法,数字字母,识别率99%,算法有待优化例子源代码,识别有3种精确度可选,精确度越高花费时间越长...
- 机器人对话中LCS算法的尝试
机器人对话中LCS算法的尝试例子源代码,科宝机器的目标是做出一个较为完善桌面机器人。...
- 一个post源码,有md5算法
易语言一个post源码,有md5算法例子源代码,里面有md5变异算法。...
- 滑块位置图像算法分析
易语言滑块位置图像算法分析例子源代码,这里只谈图像分析,不谈JS算法。...
- 通用密码编码加密算法
易语言通用密码编码加密算法例子源代码,现在兴趣偶然。...