private Similarity ComputeSimilarity(NamedVector <NamedValue> vector1, NamedVector <NamedValue> vector2,
                                             Dictionary <string, double> averages)
        {
            var sharedUsers = vector1.Values.Join(vector2.Values,
                                                  nv => nv.Name,
                                                  nv => nv.Name,
                                                  (first, second) =>
                                                  new
            {
                Item1       = first.Value,
                Item2       = second.Value,
                UserAverage = averages[first.Name]
            })
                              .ToList();

            var numerator = sharedUsers.Sum(user => (user.Item1 - user.UserAverage) * (user.Item2 - user.UserAverage));

            var root1 = sharedUsers.Sum(user => (user.Item1 - user.UserAverage).Square()).SquareRoot();
            var root2 = sharedUsers.Sum(user => (user.Item2 - user.UserAverage).Square()).SquareRoot();

            var denominator = root1 * root2;

            var result = numerator / denominator;

            return(new Similarity(vector1.Name, vector2.Name, result));
        }
Exemplo n.º 2
0
        public Correlation ComputeCorrelation(NamedVector <NamedValue> vector1, NamedVector <NamedValue> vector2)
        {
            var jointValues = vector1.Values.Join(vector2.Values, nv => nv.Name, nv => nv.Name,
                                                  (f, s) => new { X = f.Value, Y = s.Value }).ToList();

            // calculating numerator

            var dotProduct    = jointValues.Sum(p => p.X * p.Y);
            var productOfSums = jointValues.Sum(p => p.X) * jointValues.Sum(p => p.Y);

            var numerator = dotProduct - (productOfSums / jointValues.Count);

            // calculating denominator

            var squareOfSumX = jointValues.Sum(p => p.X).Square();
            var magnitudeX   = jointValues.Sum(p => p.X.Square());
            var squareRoot1  = (magnitudeX - squareOfSumX / jointValues.Count).SquareRoot();

            var squareOfSumY = jointValues.Sum(p => p.Y).Square();
            var magnitudeY   = jointValues.Sum(p => p.Y.Square());
            var sqaureRoot2  = (magnitudeY - squareOfSumY / jointValues.Count).SquareRoot();

            var denominator = squareRoot1 * sqaureRoot2;

            // calculating result
            var result = numerator / denominator;

            return(new Similarity(vector1.Name, vector2.Name, result));
        }
        public Correlation ComputeCorrelation(NamedVector<NamedValue> vector1, NamedVector<NamedValue> vector2)
        {
            var jointValues = vector1.Values.Join(vector2.Values, nv => nv.Name, nv => nv.Name,
                                                  (f, s) => new { X = f.Value, Y = s.Value }).ToList();

            var sum = jointValues.Sum(p => (p.X - p.X).ToAbsolute().ToPowerOf(_exponent));

            var result = sum.RootOfDegree(_exponent);

            return new Distance(vector1.Name, vector2.Name, result);
        }
        public Correlation ComputeCorrelation(NamedVector<NamedValue> vector1, NamedVector<NamedValue> vector2)
        {
            var jointValues = vector1.Values.Join(vector2.Values, nv => nv.Name, nv => nv.Name,
                                                  (f, s) => new { X = f.Value, Y = s.Value }).ToList();

            var sum = jointValues.Sum(p => (p.X - p.X).ToAbsolute().ToPowerOf(_exponent));

            var result = sum.RootOfDegree(_exponent);

            return new Distance(vector1.Name, vector2.Name, result);
        }
        public Correlation ComputeCorrelation(NamedVector<NamedValue> vector1, NamedVector<NamedValue> vector2)
        {
            var jointValues = vector1.Values.Join(vector2.Values, nv => nv.Name, nv => nv.Name,
                                                  (f, s) => new {X = f.Value, Y = s.Value}).ToList();

            var dotProduct = jointValues.Sum(p => p.X * p.Y);

            var magnitudeX = jointValues.Sum(p => p.X.Square());
            var magnitudeY = jointValues.Sum(p => p.Y.Square());
            var denominator = magnitudeX.SquareRoot() * magnitudeY.SquareRoot();

            var result = dotProduct/denominator;

            return new Similarity(vector1.Name, vector2.Name, result);
        }
Exemplo n.º 6
0
        public Correlation ComputeCorrelation(NamedVector <NamedValue> vector1, NamedVector <NamedValue> vector2)
        {
            var jointValues = vector1.Values.Join(vector2.Values, nv => nv.Name, nv => nv.Name,
                                                  (f, s) => new { X = f.Value, Y = s.Value }).ToList();

            var dotProduct = jointValues.Sum(p => p.X * p.Y);

            var magnitudeX  = jointValues.Sum(p => p.X.Square());
            var magnitudeY  = jointValues.Sum(p => p.Y.Square());
            var denominator = magnitudeX.SquareRoot() * magnitudeY.SquareRoot();

            var result = dotProduct / denominator;

            return(new Similarity(vector1.Name, vector2.Name, result));
        }
Exemplo n.º 7
0
        private Tuple <string, string, double> ComputeDeviations(NamedVector <NamedValue> vector1, NamedVector <NamedValue> vector2)
        {
            var sharedUsers = vector1.Values.Join(vector2.Values,
                                                  nv => nv.Name,
                                                  nv => nv.Name,
                                                  (first, second) =>
                                                  new
            {
                First  = first.Value,
                Second = second.Value
            })
                              .ToList();

            var deviation = sharedUsers.Sum(obj => (obj.First - obj.Second) / sharedUsers.Count);

            return(Tuple.Create(vector1.Name, vector2.Name, deviation));
        }