public List<Pitanja> ColaborativeFiltering(int ID)
{
//sva pitanja za korisnika
List<PitanjaOcjene> OcijenjenaPitanja = Connection.dm.PitanjaOcjene.Where(x => x.KorisnikID == ID).OrderBy(x => x.PitanjeID).ToList();
//sva pitanja koja su ocijenjena
List<int> SvaPitanja = Connection.dm.PitanjaOcjene.OrderBy(x => x.PitanjeID).Select(x => x.PitanjeID).Distinct().ToList();
//sva pitanja koja korisnik nije ocijenio
List<int> SvaPitanjaKojaKorisnikNijeOcijenio = new List<int>();
List<Pitanja> ListaPreporucenihPitanja = new List<Pitanja>();
foreach (var i in SvaPitanja) // uzimam sva pitanja koje korisnik nije ocijenio
{
int brojac = 0;
foreach (var j in OcijenjenaPitanja)
{
if (i == j.PitanjeID)
brojac++;
}
if (brojac == 0)
{
SvaPitanjaKojaKorisnikNijeOcijenio.Add(i); // lista tih neocijenjenih pitanja
}
}
List<int> SviKorisniciKojiSuOcijenili = new List<int>(); // lista korisnika koji su ocijenili pitanja koja logovani korisnik nije
foreach (var i in SvaPitanjaKojaKorisnikNijeOcijenio)
{
SviKorisniciKojiSuOcijenili.AddRange(Connection.dm.PitanjaOcjene.Where(x => x.PitanjeID == i).Select(x => x.KorisnikID).ToList());
}
foreach (var i in SviKorisniciKojiSuOcijenili) // kroz sve korisnike radi se provjera
{
List<PitanjaOcjene> ListaSamoIstihPitanja = new List<PitanjaOcjene>();
foreach (var item in OcijenjenaPitanja) // ubacujem u listu samo ona pitanja koja logovani korisnik ima radi preporuke
{
PitanjaOcjene p = Connection.dm.PitanjaOcjene.Where(x => x.PitanjeID == item.PitanjeID && x.KorisnikID == i).SingleOrDefault();
if (p != null)
{
ListaSamoIstihPitanja.Add(p);
}
}
if (ListaSamoIstihPitanja.Count == OcijenjenaPitanja.Count) // poredim samo ista pitanja od korisnika
{
int sumaOcjenaLogovanog = 0;
int sumaOcjenaDrugogKorisnika = 0;
foreach (var LS in OcijenjenaPitanja) //LS logovani kor, samo da se izračuna suma ocjena
{
int a = LS.PitanjeID;
sumaOcjenaLogovanog += LS.Ocjena;
}
foreach (var LD in ListaSamoIstihPitanja) //lista drugi korisnik
{
int a = LD.PitanjeID;
sumaOcjenaDrugogKorisnika += LD.Ocjena;
}
double Ra = (double)sumaOcjenaLogovanog / (double)OcijenjenaPitanja.Count; // prosjek ocjena za logovanog
double Rb = (double)sumaOcjenaDrugogKorisnika / (double)ListaSamoIstihPitanja.Count; // prosjek ocjena za logovanog
double Brojnik = 0;
double Nazivnik = 0;
for (int e = 0; e < OcijenjenaPitanja.Count; e++) //// prolazim kroz sve zajednicke elemente i racunam Pearson Correlation
{
double A = (OcijenjenaPitanja[e].Ocjena - Ra);
double B = (ListaSamoIstihPitanja[e].Ocjena - Rb);
Brojnik += A * B;
double C = Math.Pow(A, 2);
double D = Math.Pow(B, 2);
Nazivnik += Math.Sqrt(C + D);
}
double similar = Brojnik / Nazivnik; // ovo je slicnost
if (similar > 0.2) /// threshold
{
//preporucuje korisnika koji je slican
List<PitanjaOcjene> SvaPitanjaKorisnikaPoSlicnosti = Connection.dm.PitanjaOcjene.Where(x => x.KorisnikID == i).ToList();
foreach (var item in SvaPitanjaKorisnikaPoSlicnosti) // uzimam sva pitanja koje korisnik nije ocijenio
{
int brojac = 0;
foreach (var j in OcijenjenaPitanja)
{
if (item.PitanjeID == j.PitanjeID)
brojac++;
}
if (brojac == 0)
{
Pitanja p = new Pitanja();
p = Connection.dm.Pitanja.Where(x => x.PitanjeID == item.PitanjeID).SingleOrDefault();
ListaPreporucenihPitanja.Add(p);
}
}
}
}
}
return ListaPreporucenihPitanja;
}