SoFunction
Updated on 2025-03-07

C# instance code to implement collaborative filtering algorithm


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: " + );
            }
        }
    }
}