FITKMS_business.Util.RecommendationService.CalculatePearsonCorrelationForQuestions C# (CSharp) Метод

CalculatePearsonCorrelationForQuestions() приватный Метод

private CalculatePearsonCorrelationForQuestions ( int question1, int question2 ) : double
question1 int
question2 int
Результат double
        private double CalculatePearsonCorrelationForQuestions(int question1, int question2)
        {
            List<PitanjaOcjene> sharedQuestions = new List<PitanjaOcjene>();

            //Pronaći ocjene korisnika koji su ocijenili i jedno i drugo pitanje
            foreach (var item in questionRecommendation[question1])
            {
                if (questionRecommendation[question2].Where(x => x.KorisnikID == item.KorisnikID).Count() != 0)
                    sharedQuestions.Add(item);

            }

            if (sharedQuestions.Count == 0)
                return 0;

            //Sumirati sve ocjene za pitanja
            double question1RatingSum = 0.00f;
            double question2RatingSum = 0.00f;

            foreach (PitanjaOcjene item in sharedQuestions)
            {
                question1RatingSum += questionRecommendation[question1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;
                question2RatingSum += questionRecommendation[question2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;

            }

            double question1SQ = 0f;
            double question2SQ = 0f;
            foreach (PitanjaOcjene item in sharedQuestions)
            {
                question1SQ += Math.Pow(questionRecommendation[question1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena, 2);
                question2SQ += Math.Pow(questionRecommendation[question2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena, 2);
            }

            double sum = 0f;
            foreach (PitanjaOcjene item in sharedQuestions)
            {
                sum += questionRecommendation[question1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena *
                                questionRecommendation[question2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;

            }

            double num = sum - (question1RatingSum * question2RatingSum / sharedQuestions.Count);

            double density = (double)Math.Sqrt((question1SQ - Math.Pow(question1RatingSum, 2) / sharedQuestions.Count) *
                             ((question2SQ - Math.Pow(question2RatingSum, 2) / sharedQuestions.Count)));

            if (density == 0)
                return 0;

            return num / density;
        }