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