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

ColaborativeFiltering() публичный Метод

public ColaborativeFiltering ( int ID ) : List
ID int
Результат List
        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;
        }

Usage Example

 private void UserQuestionRecommendation()
 {
     DataList questionsList = (DataList)this.Master.FindControl("questionsList");
     RecommendationService recommendation = new RecommendationService();
     questionsList.DataSource = recommendation.ColaborativeFiltering(Convert.ToInt32(User.Identity.Name));
     questionsList.DataBind();
 }