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)); }
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); }
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)); }
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)); }