Exemplo n.º 1
0
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            float sumNum = 0.0f,
                  sumX   = 0.0f,
                  sumY   = 0.0f;

            var artistIndices = first.ArtistIndices.Union(second.ArtistIndices).ToList();

            foreach (var artistIndex in artistIndices)
            {
                var rX = 1.0f;
                if (first.RatingsByArtistIndexLookupTable.ContainsKey(artistIndex))
                {
                    rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value;
                }

                var rY = 1.0f;
                if (second.RatingsByArtistIndexLookupTable.ContainsKey(artistIndex))
                {
                    rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value;
                }

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            return(sumNum / (float)(Math.Sqrt(sumX) * Math.Sqrt(sumY)));
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            float sumNum = 0.0f,
                  sumX = 0.0f,
                  sumY = 0.0f;

            var artistIndices = first.ArtistIndices.Union(second.ArtistIndices).ToList();

            foreach (var artistIndex in artistIndices)
            {
                var rX = 1.0f;
                if (first.RatingsByArtistIndexLookupTable.ContainsKey(artistIndex))
                    rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value;

                var rY = 1.0f;
                if (second.RatingsByArtistIndexLookupTable.ContainsKey(artistIndex))
                    rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value;

                sumNum += rX * rY;
                sumX += rX * rX;
                sumY += rY * rY;
            }

            return sumNum / (float)(Math.Sqrt(sumX) * Math.Sqrt(sumY));
        }
        public List <SimilarUser <ISimpleKnnUser> > CalculateKNearestNeighbours(ISimpleKnnUser user, IEnumerable <ISimpleKnnUser> users, int nearestNeighboursCount)
        {
            var neighbours = new List <SimilarUser <ISimpleKnnUser> >();

            foreach (var neighbour in users)
            {
                if (neighbour == user)
                {
                    continue;
                }

                var s = CalculateSimilarity(user, neighbour);
                if (s <= 0.0)
                {
                    continue;
                }

                neighbours.Add(new SimilarUser <ISimpleKnnUser>(neighbour, s));

                neighbours.Sort();
                while (neighbours.Count > nearestNeighboursCount)
                {
                    neighbours.RemoveAt(neighbours.Count - 1);
                }
            }

            return(neighbours);
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            float sumNum = 0.0f,
                  sumX   = 0.0f,
                  sumY   = 0.0f;

            var artistIndices = first.ArtistIndices.IntersectSorted(second.ArtistIndices).ToList();

            if (artistIndices.Count <= 0)
            {
                return(0.0f);
            }

            foreach (var artistIndex in artistIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value;

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            var mass = artistIndices.Count * 2.0f / (first.Ratings.Count + second.Ratings.Count);

            return(sumNum / (float)(Math.Sqrt(sumX) * Math.Sqrt(sumY)) * (mass));
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            var artistIndices = first.ArtistIndices.IntersectSorted(second.ArtistIndices).ToList();

            var rXavg = first.Ratings.Average(r => r.Value);
            var rYavg = second.Ratings.Average(r => r.Value);

            float sumNum = 0.0f,
                  sumX   = 0.0f,
                  sumY   = 0.0f;

            foreach (var artistIndex in artistIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            var firstIndices = first.ArtistIndices.Except(artistIndices).ToList();

            foreach (var artistIndex in firstIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = 1.0f - rYavg;

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            var secondIndices = second.ArtistIndices.Except(artistIndices).ToList();

            foreach (var artistIndex in secondIndices)
            {
                var rX = 1.0f - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            return(Math.Abs(sumNum / (float)(Math.Sqrt(sumX) * Math.Sqrt(sumY))));
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            var artistIndices = first.ArtistIndices.IntersectSorted(second.ArtistIndices).ToList();

            var rXavg = first.Ratings.Average(r => r.Value);
            var rYavg = second.Ratings.Average(r => r.Value);

            float sumNum = 0.0f,
                  sumX = 0.0f,
                  sumY = 0.0f;

            foreach (var artistIndex in artistIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX += rX * rX;
                sumY += rY * rY;
            }

            var firstIndices = first.ArtistIndices.Except(artistIndices).ToList();
            foreach (var artistIndex in firstIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = 1.0f - rYavg;

                sumNum += rX * rY;
                sumX += rX * rX;
                sumY += rY * rY;
            }

            var secondIndices = second.ArtistIndices.Except(artistIndices).ToList();
            foreach (var artistIndex in secondIndices)
            {
                var rX = 1.0f - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX += rX * rX;
                sumY += rY * rY;
            }

            return Math.Abs(sumNum / (float)(Math.Sqrt(sumX) * Math.Sqrt(sumY)));
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            float sumNum = 0.0f,
                  sumX   = 0.0f,
                  sumY   = 0.0f;

            var artistIndices = first.ArtistIndices.IntersectSorted(second.ArtistIndices).ToList();

            if (artistIndices.Count <= 0)
            {
                return(0.0f);
            }

            var rXavg = 0.0f;
            var rYavg = 0.0f;

            foreach (var artistIndex in artistIndices)
            {
                rXavg += first.RatingsByArtistIndexLookupTable[artistIndex].Value;
                rYavg += second.RatingsByArtistIndexLookupTable[artistIndex].Value;
            }
            rXavg /= artistIndices.Count;
            rYavg /= artistIndices.Count;

            foreach (var artistIndex in artistIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX   += rX * rX;
                sumY   += rY * rY;
            }

            var mass = artistIndices.Count * 2.0f / (first.Ratings.Count + second.Ratings.Count);
            var r    = sumNum / (float)(Math.Sqrt(sumX * sumY)) * (mass);

            if (float.IsNaN(r))
            {
                return(0.0f);
            }

            return(Math.Abs(r));
        }
        public List<SimilarUser<ISimpleKnnUser>> CalculateKNearestNeighbours(ISimpleKnnUser user, IEnumerable<ISimpleKnnUser> users, int nearestNeighboursCount)
        {
            var neighbours = new List<SimilarUser<ISimpleKnnUser>>();
            foreach (var neighbour in users)
            {
                if (neighbour == user)
                    continue;

                var s = CalculateSimilarity(user, neighbour);
                if (s <= 0.0)
                    continue;

                neighbours.Add(new SimilarUser<ISimpleKnnUser>(neighbour, s));

                neighbours.Sort();
                while (neighbours.Count > nearestNeighboursCount)
                    neighbours.RemoveAt(neighbours.Count - 1);
            }

            return neighbours;
        }
        public float GetSimilarity(ISimpleKnnUser first, ISimpleKnnUser second)
        {
            float sumNum = 0.0f,
                  sumX = 0.0f,
                  sumY = 0.0f;

            var artistIndices = first.ArtistIndices.IntersectSorted(second.ArtistIndices).ToList();
            if (artistIndices.Count <= 0)
                return 0.0f;

            var rXavg = 0.0f;
            var rYavg = 0.0f;
            foreach (var artistIndex in artistIndices)
            {
                rXavg += first.RatingsByArtistIndexLookupTable[artistIndex].Value;
                rYavg += second.RatingsByArtistIndexLookupTable[artistIndex].Value;
            }
            rXavg /= artistIndices.Count;
            rYavg /= artistIndices.Count;

            foreach (var artistIndex in artistIndices)
            {
                var rX = first.RatingsByArtistIndexLookupTable[artistIndex].Value - rXavg;
                var rY = second.RatingsByArtistIndexLookupTable[artistIndex].Value - rYavg;

                sumNum += rX * rY;
                sumX += rX * rX;
                sumY += rY * rY;
            }

            var mass = artistIndices.Count * 2.0f / (first.Ratings.Count + second.Ratings.Count);
            var r = sumNum / (float)(Math.Sqrt(sumX * sumY)) * (mass);

            if (float.IsNaN(r))
                return 0.0f;

            return Math.Abs(r);
        }
 public override float CalculateSimilarity(ISimpleKnnUser user, ISimpleKnnUser neighbour)
 {
     return(base.CalculateSimilarity(user, neighbour) * ContentSimilarityEstimator.GetSimilarity(user, neighbour));
 }
 public override float CalculateSimilarity(ISimpleKnnUser user, ISimpleKnnUser neighbour)
 {
     return base.CalculateSimilarity(user, neighbour) * ContentSimilarityEstimator.GetSimilarity(user, neighbour);
 }
 public virtual float CalculateSimilarity(ISimpleKnnUser user, ISimpleKnnUser neighbour)
 {
     var s = SimilarityEstimator.GetSimilarity(user, neighbour);
     return s;
 }
        public virtual float CalculateSimilarity(ISimpleKnnUser user, ISimpleKnnUser neighbour)
        {
            var s = SimilarityEstimator.GetSimilarity(user, neighbour);

            return(s);
        }