using System;
using ;
using ;
using ;
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 <string>(GetKey(Item1Id, Item2Id));
}
public Rating this[int Item1Id, int Item2Id]
{
get {
return this[(Item1Id, Item2Id)];
}
set { this[(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 = ;
float item1Rating = ;
_Items.Add();
foreach (var item2 in userRatings)
{
if ( <= item1Id) continue; // Eliminate redundancy
int item2Id = ;
float item2Rating = ;
Rating ratingDiff;
if (_DiffMarix.Contains(item1Id, item2Id))
{
ratingDiff = _DiffMarix[item1Id, item2Id];
}
else
{
ratingDiff = new Rating();
_DiffMarix[item1Id, item2Id] = ratingDiff;
}
+= item1Rating - item2Rating;
+= 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 ((itemId)) continue; // User has rated this item, just skip it
Rating itemRating = new Rating();
foreach (var userRating in userRatings)
{
if ( == itemId) continue;
int inputItemId = ;
if (_DiffMarix.Contains(itemId, inputItemId))
{
Rating diff = _DiffMarix[itemId, inputItemId];
+= * ( + * ((itemId < inputItemId) ? 1 : -1));
+= ;
}
}
(itemId, );
}
return Predictions;
}
public static void Test()
{
SlopeOne test = new SlopeOne();
Dictionary<int, float> userRating = new Dictionary<int, float>();
(1, 5);
(2, 4);
(3, 4);
(userRating);
userRating = new Dictionary<int, float>();
(1, 4);
(2, 5);
(3, 3);
(4, 5);
(userRating);
userRating = new Dictionary<int, float>();
(1, 4);
(2, 4);
(4, 5);
(userRating);
userRating = new Dictionary<int, float>();
(1, 5);
(3, 4);
IDictionary<int, float> Predictions = (userRating);
foreach (var rating in Predictions)
{
("Item " + + " Rating: " + );
}
}
}
}