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

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

private CalculatePearsonCorrelationForArticles ( int article1, int article2 ) : double
article1 int
article2 int
Результат double
        private double CalculatePearsonCorrelationForArticles(int article1, int article2)
        {
            List<ClanciOcjene> sharedArticles = new List<ClanciOcjene>();

            //Pronaći ocjene korisnika koji su ocijenili oba članka
            foreach (var item in articleRecommendation[article1])
            {
                if (articleRecommendation[article2].Where(x => x.KorisnikID == item.KorisnikID).Count() != 0)
                    sharedArticles.Add(item);

            }

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

            //Razmisliti da li izbaciti one zapise gdje je autor dao ocjenu

            //Sumirati sve ocjene za članke
            double article1RatingSum = 0.00f;
            double article2RatingSum = 0.00f;

            foreach (ClanciOcjene item in sharedArticles)
            {
                article1RatingSum += articleRecommendation[article1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;
                article2RatingSum += articleRecommendation[article2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;

            }

            double article1SQ = 0f;
            double article2SQ = 0f;
            foreach (ClanciOcjene item in sharedArticles)
            {
                article1SQ += Math.Pow(articleRecommendation[article1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena, 2);
                article2SQ += Math.Pow(articleRecommendation[article2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena, 2);
            }

            double sum = 0f;
            foreach (ClanciOcjene item in sharedArticles)
            {
                sum += articleRecommendation[article1].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena *
                                articleRecommendation[article2].Where(x => x.KorisnikID == item.KorisnikID).FirstOrDefault().Ocjena;

            }

            double num = sum - (article1RatingSum * article2RatingSum / sharedArticles.Count);

            double density = (double)Math.Sqrt((article1SQ - Math.Pow(article1RatingSum, 2) / sharedArticles.Count) *
                             ((article2SQ - Math.Pow(article2RatingSum, 2) / sharedArticles.Count)));

            if (density == 0)
                return 0;

            return num / density;
        }