Exemple #1
0
        public Form_IBCF()
        {
            InitializeComponent();

            this.comboBox1.Enabled = false;
            obj_AssStrategy        = new cAssStrategy();

            this.comboBox2.Items.Clear();

            for (int i = 15; i < cReadinData.test_usernum[comboBox1.SelectedIndex]; i++)
            {
                this.comboBox2.Items.Add(i);
            }

            dataGridView1.RowHeadersVisible = false;
            // 初始化,最近邻居数量最大为200
            obj_ItemBased_CF = new cItemBased_CF(200);

            for (int i = 1; i <= 1682; i++)
            {
                obj_ItemBased_CF.generateItemNN(i);
            }
            // 读取最近邻项目及相似值文件,避免重复计算
            obj_ItemBased_CF.readFile();

            this.comboBox2.SelectedIndex = 0;
        }
Exemple #2
0
        public Form_SlopeOne()
        {
            InitializeComponent();

            // 默认选择第一个数据集
            this.comboBox1.SelectedIndex = 0;

            // 读取数据,得到训练用户集合以及测试用户集合
            obj_ReadData    = new cReadinData(this.comboBox1.SelectedIndex);
            obj_AssStrategy = new cAssStrategy();
            testUsers       = cReadinData.getTestUser();
            trainUsers      = cReadinData.getBaseUser();

            this.dataGridView1.RowHeadersVisible = false;
            this.dataGridView2.RowHeadersVisible = false;

            for (int i = 0; i < count_Num.Length; i++)
            {
                count_Num[i] = 0;
                stat_Info[i] = 0;
            }

            // 根据选择的数据集,填充用户ID的下拉列表
            for (int i = 0; i < testUsers.Length - 1; i++)
            {
                this.comboBox2.Items.Add(testUsers[i + 1].id);
            }
            // 用户ID默认选择第一个
            this.comboBox2.SelectedIndex = 0;

            obj_SlopeOne = new SlopeOne();

            for (int i = 1; i < trainUsers.Length; i++)
            {
                userRating = new Dictionary <int, float>();

                //count_Num[trainUsers[i].RatingNums/20]++;

                for (int j = 1; j < trainUsers[i].Ratings.Length; j++)
                {
                    if (trainUsers[i].Ratings[j] != 0)
                    {
                        userRating.Add(j, (float)trainUsers[i].Ratings[j]);
                    }
                }

                obj_SlopeOne.AddUserRatings(userRating);
            }

            this.comboBox3.Items.Clear();

            // 填充 连续运行用户数目 下拉列表
            for (int i = 15; i < testUsers.Length; i++)
            {
                comboBox3.Items.Add(i);
            }
            this.comboBox3.SelectedIndex = 0;
        }
Exemple #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            // 记录当前时间
            int      count_predit = 0;
            DateTime dt_1         = DateTime.Now;

            Rec_Items_num = int.Parse(this.textBox9.Text);
            userRating    = new Dictionary <int, float>();

            // 得到用户
            cUser testUser = testUsers[comboBox2.SelectedIndex + 1];

            userid = testUser.id;

            userRating = new Dictionary <int, float>();

            for (int j = 1; j < trainUsers[userid].Ratings.Length; j++)
            {
                if (trainUsers[userid].Ratings[j] != 0)
                {
                    userRating.Add(j, (float)trainUsers[userid].Ratings[j]);
                }
            }
            //    count_predit = trainUsers[userID].Ratings.Length - trainUsers[userID].RatingNums;

            // 得到该用户的预测评分
            IDictionary <int, float> Predictions = obj_SlopeOne.Predict(userRating);

            obj_AssStrategy = obj_SlopeOne.getAssStrategy(userid, Predictions, Rec_Items_num, testUser);

            DateTime dt_2 = DateTime.Now;
            TimeSpan ts   = dt_2.Subtract(dt_1);

            this.textBox4.Text = obj_AssStrategy.MAE.ToString();        // MAE
            this.textBox5.Text = ts.TotalMilliseconds + "ms";           // 时间
            this.textBox6.Text = obj_AssStrategy.Precison.ToString();   // 查准率
            this.textBox8.Text = obj_AssStrategy.Recall.ToString();     // 查全率
            float F = obj_AssStrategy.calculateF_Measure();             // F1指标

            this.textBox7.Text = F.ToString();
            this.textBox2.Text = this.Rec_Items_num.ToString();         // Top-N 推荐数

            this.textBox3.Text = "MAE:" + obj_AssStrategy.MAE + " 查准率:" + obj_AssStrategy.Precison + " 查全率:" +
                                 obj_AssStrategy.Recall + " F值:" + F + " 总耗时:" + ts.TotalMilliseconds + "ms";
            //     this.dataGridView1.Rows.Add(count_dgv++, trainUsers[userIndex].id, this.Rec_Items_num, trainUsers[userIndex].RatingNums, obj_AssStrategy.MAE, obj_AssStrategy.Precison,
            //       obj_AssStrategy.Recall, F, ts.TotalMilliseconds + " ms");
            Application.DoEvents();

            stat_Info[trainUsers[userid].RatingNums / 50] += obj_AssStrategy.MAE;
            count_Num[trainUsers[userid].RatingNums / 50]++;
            // 累加相关数据
            total_MAE       += obj_AssStrategy.MAE;
            total_Precison  += obj_AssStrategy.Precison;
            total_Recall    += obj_AssStrategy.Recall;
            total_F_Measure += F;
            total_Time      += ts.TotalMilliseconds;
        }
        private int Rec_Items_num;    // Top-N 推荐项目数

        public Form_UBCF()
        {
            InitializeComponent();

            dataGridView1.RowHeadersVisible = false;

            this.comboBox2.Items.Clear();
            obj_AssStrategy = new cAssStrategy();

            for (int i = 15; i < cReadinData.test_usernum[comboBox1.SelectedIndex]; i++)
            {
                this.comboBox2.Items.Add(i);
            }
            this.comboBox2.SelectedIndex = 0;
        }
Exemple #5
0
        // 运行一次算法
        private void button1_Click(object sender, EventArgs e)
        {
            // 记录当前时间
            DateTime dt_1 = DateTime.Now;

            this.Rec_Items_num = int.Parse(this.textBox13.Text);    // Top-N推荐个数

            this.progressBar1.Maximum = this.comboBox2.SelectedIndex + 15 + 22;
            this.progressBar1.Value   = 0;
            // 读入数据,生成UI矩阵
            this.textBox3.Text = "开始读入数据";
            this.progressBar1.Value++;

            Application.DoEvents();

            cReadinData obj_ReadData = new cReadinData(comboBox1.SelectedIndex);

            this.textBox3.Text = "读入数据完成   训练数据:" + obj_ReadData.sTrainFileName[comboBox1.SelectedIndex]
                                 + "     测试数据:" + obj_ReadData.testfileName[comboBox1.SelectedIndex];
            this.progressBar1.Value++;
            Application.DoEvents();

            int number = int.Parse(textBox2.Text);

            this.neigh_num = number;

            // 相似度算法的选择
            if (this.radioButton1.Checked)
            {
                sim_alg = 1;
            }
            else if (this.radioButton2.Checked)
            {
                sim_alg = 2;
            }
            else if (this.radioButton3.Checked)
            {
                sim_alg = 3;
            }

            // 测试用户数目,最少为15
            testUserNum = this.comboBox2.SelectedIndex + 15;

            this.textBox3.Text = "初始化最大邻居个数";
            // 初始化,最近邻居数量最大为200
            obj_ItemBased_CF = new cItemBased_CF(200);

            this.progressBar1.Value++;
            Application.DoEvents();

            // 初始化相关数据
            for (int i = 1; i <= 1682; i++)
            {
                this.textBox3.Text = "初始 " + i + " 个项目数据";
                if ((i % 100) == 0)
                {
                    this.progressBar1.Value++;
                    Application.DoEvents();
                }

                Application.DoEvents();
                obj_ItemBased_CF.generateItemNN(i);
            }

            this.progressBar1.Value++;
            Application.DoEvents();

            this.textBox3.Text = "读取最近邻居及其相似值文件";
            obj_ItemBased_CF.readFile();

            this.progressBar1.Value++;
            Application.DoEvents();

            // 得到测试用户集合
            cUser[] testUsers = cReadinData.getTestUser();
            this.textBox3.Text = "读取测试用户集合";

            this.progressBar1.Value++;
            Application.DoEvents();

            double MAE, Precison, Recall, F_Measure;
            double total_MAE = 0, total_Precison = 0, total_Recall = 0, total_F_Measure = 0;
            double average_MAE, average_Precison, average_Recall, average_F_Measure;

            // for循环为每个测试用户产生预测评分以及Top-N推荐,并取得算法评价指标
            for (int i = 1; i <= testUserNum; i++)
            {
                obj_AssStrategy = obj_ItemBased_CF.getPredictRating(testUsers[i], this.sim_alg, neigh_num, Rec_Items_num);

                MAE       = obj_AssStrategy.MAE;
                Precison  = obj_AssStrategy.Precison;
                Recall    = obj_AssStrategy.Recall;
                F_Measure = obj_AssStrategy.calculateF_Measure();

                // 累计各项指标的和
                total_MAE       += MAE;
                total_Precison  += Precison;
                total_Recall    += Recall;
                total_F_Measure += F_Measure;

                this.textBox3.Text = "第" + i.ToString() + "个用户 MAE:" + MAE.ToString() + " 查准率:" + Precison
                                     + " 查全率:" + Recall + " F值:" + F_Measure;
                this.progressBar1.Value++;
                Application.DoEvents();
            }

            // 计算各项指标的平均值
            average_MAE       = total_MAE / this.testUserNum;
            average_Precison  = total_Precison / this.testUserNum;
            average_Recall    = total_Recall / this.testUserNum;
            average_F_Measure = total_F_Measure / this.testUserNum;


            DateTime dt_2 = DateTime.Now;
            TimeSpan ts   = dt_2.Subtract(dt_1);

            this.textBox3.Text = "完成 平均MAE:" + average_MAE.ToString() + " 平均查准率:" + average_Precison +
                                 " 平均查全率:" + average_Recall + " 平均F值:" + average_F_Measure + " 总耗时:" + ts.TotalMilliseconds + "ms";
            Application.DoEvents();

            this.textBox4.Text  = average_MAE.ToString();
            this.textBox5.Text  = ts.TotalMilliseconds + "ms";
            this.textBox6.Text  = this.sSimAlg[this.sim_alg - 1];
            this.textBox7.Text  = this.neigh_num.ToString();
            this.textBox9.Text  = average_Precison.ToString();
            this.textBox10.Text = average_Recall.ToString();
            this.textBox11.Text = average_F_Measure.ToString();
            this.textBox12.Text = Rec_Items_num.ToString();

            string log = this.sSimAlg[this.sim_alg - 1] + " 邻居数:" + this.neigh_num.ToString() + " 平均MAE:" +
                         average_MAE.ToString() + " 平均查准率:" + average_Precison + " 平均查全率:" + average_Recall +
                         " 平均F值:" + average_F_Measure + " 总耗时:" + ts.TotalMilliseconds + "ms";

            this.dataGridView1.Rows.Add(count_dgv++, sSimAlg[sim_alg - 1], this.neigh_num, this.Rec_Items_num, average_MAE,
                                        average_Precison, average_Recall, average_F_Measure, (ts.TotalMilliseconds / this.testUserNum) + " ms");
        }
Exemple #6
0
        // 开始运行
        private void button5_Click(object sender, EventArgs e)
        {
            int          test_num = this.comboBox1.SelectedIndex + 15; // 测试用户数量
            int          N        = int.Parse(this.textBox11.Text);    // 推荐数目
            cUser        curTestUser;                                  // 当前测试用户
            cAssStrategy obj_AssStrategy = new cAssStrategy();         // 评价准则与指标

            this.textBox7.Text = "测试用户数:" + test_num.ToString()
                                 + "  Top-N 推荐数:" + N;
            this.progressBar1.Maximum = (test_num - 1) * 3;;          // 进度条最大值
            this.progressBar1.Value   = 0;

            //////////////////////////////////////////////////////////////////////////
            double   total_N = 0, total_Precison = 0, total_Recall = 0, total_F = 0, total_Time = 0;
            double   Precison, Recall, F_Measure, Time;
            DateTime dt_1, dt_2;
            TimeSpan ts;
            int      real_RecNum = N;

            // 对测试集中的用户开始产生推荐
            int userid;

            for (int i = 0; i < test_num - 1; i++)
            {
                curTestUser = testUsers[i + 1];
                userid      = curTestUser.id;

                dt_1 = DateTime.Now;                    // 获取当前时间
                // 得到ID为userid的用户所支持的关联规则集合
                supp_AssRules[userid] = cApriori.getSupport_AssRules(userid);
                this.textBox7.Text    = "第 " + (i + 1) + " 个用户所支持的关联规则生成.";
                this.progressBar1.Value++;
                Application.DoEvents();

                // 得到推荐电影列表
                recItems[userid] = cApriori.getRecItems(supp_AssRules[userid], userid);


                real_RecNum        = (recItems[userid].Length > N ? N : recItems[userid].Length);
                this.textBox7.Text = "第 " + (i + 1) + " 个用户的推荐列表生成.";
                this.progressBar1.Value++;
                Application.DoEvents();

                // 评价准则与指标的计算
                obj_AssStrategy = cApriori.getAssStrategy(curTestUser, N);

                dt_2 = DateTime.Now;
                ts   = dt_2.Subtract(dt_1);                            // 时间间隔
                Time = ts.TotalMilliseconds;

                Precison  = obj_AssStrategy.Precison;
                Recall    = obj_AssStrategy.Recall;
                F_Measure = obj_AssStrategy.calculateF_Measure();

                //     this.label22.Text = userid.ToString();                 // 用户ID

                //    this.label35.Text = real_RecNum.ToString();        // 实际推荐数目
                total_N += real_RecNum;

                this.label20.Text = Precison.ToString();     // 查准率
                total_Precison   += Precison;

                this.label23.Text = Recall.ToString();       // 查全率
                total_Recall     += Recall;

                this.label24.Text = F_Measure.ToString();  // F值
                total_F          += F_Measure;

                this.label37.Text = Time + " ms";           // 算法运行时间
                total_Time       += Time;

                this.textBox7.Text = "完成第 " + (i + 1) + " 个用户的结果分析.";
                this.progressBar1.Value++;
                Application.DoEvents();
            }
            // 计算平均值
            int    num              = test_num - 1;
            double average_N        = ((double)total_N / (double)num);
            double average_Precison = (double)((double)total_Precison / num);
            double average_Recall   = (double)((double)total_Recall / num);
            double average_F        = (double)((double)total_F / num);
            double average_Time     = (double)total_Time / num;

            this.label29.Text = average_N.ToString();
            this.label30.Text = average_Precison.ToString();
            this.label31.Text = average_Recall.ToString();
            this.label32.Text = average_F.ToString();
            this.label33.Text = average_Time.ToString() + " ms";
            Application.DoEvents();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            DateTime dt_1 = DateTime.Now;

            this.Rec_Items_num = int.Parse(this.textBox13.Text);    // Top-N推荐个数

            this.progressBar1.Maximum = (this.comboBox2.SelectedIndex + 15) * 10 + 5;
            this.progressBar1.Value   = 0;
            // 读入数据,生成UI矩阵
            this.textBox3.Text = "开始读入数据";
            this.progressBar1.Value++;

            Application.DoEvents();

            cReadinData obj_ReadData = new cReadinData(comboBox1.SelectedIndex);

            this.textBox3.Text = "读入数据完成   训练数据:" + obj_ReadData.sTrainFileName[comboBox1.SelectedIndex]
                                 + "     测试数据:" + obj_ReadData.testfileName[comboBox1.SelectedIndex];
            this.progressBar1.Value += 2;

            Application.DoEvents();

            // 读取最近邻居个数
            int number = int.Parse(textBox2.Text);

            this.neigh_num = number;

            // 相似度算法的选择
            if (this.radioButton1.Checked)
            {
                sim_alg = 1;
            }
            else if (this.radioButton2.Checked)
            {
                sim_alg = 2;
            }
            else if (this.radioButton3.Checked)
            {
                sim_alg = 3;
            }

            // 测试用户数目,最少为15
            testUserNum = this.comboBox2.SelectedIndex + 15;

            cUserBased_CF obj_UserBased_CF = new cUserBased_CF(this.neigh_num);

            cUser[] testUsers = cReadinData.getTestUser();

            this.textBox3.Text = "初始化完成 相似度算法:" + sim_alg.ToString() +
                                 " 最近邻居个数:" + this.neigh_num.ToString() + " 测试用户数:" + testUserNum.ToString();
            this.progressBar1.Value += 2;
            Application.DoEvents();

            double MAE_1, Precison, Recall, F_Measure;
            double total_MAE = 0, total_Precison = 0, total_Recall = 0, total_F_Measure = 0;
            double average_MAE, average_Precison, average_Recall, average_F_Measure;


            for (int i = 1; i <= this.testUserNum; i++)
            {
                this.progressBar1.Value += 5;
                obj_AssStrategy          = obj_UserBased_CF.getPredictRating(testUsers[i], this.sim_alg, Rec_Items_num);

                // 取得各项算法评价指标
                MAE_1     = obj_AssStrategy.MAE;
                Precison  = obj_AssStrategy.Precison;
                Recall    = obj_AssStrategy.Recall;
                F_Measure = obj_AssStrategy.calculateF_Measure();

                // 累计各项指标的和
                total_MAE       += MAE_1;
                total_Precison  += Precison;
                total_Recall    += Recall;
                total_F_Measure += F_Measure;

                this.textBox3.Text = "第 " + i.ToString() + " 个用户计算完成.";

                this.progressBar1.Value += 5;
                Application.DoEvents();
            }
            // 计算各个评价准则的平均值
            average_MAE       = total_MAE / this.testUserNum;
            average_Precison  = total_Precison / this.testUserNum;
            average_Recall    = total_Recall / this.testUserNum;
            average_F_Measure = total_F_Measure / this.testUserNum;

            DateTime dt_2 = DateTime.Now;
            TimeSpan ts   = dt_2.Subtract(dt_1);

            this.textBox3.Text = "所有用户计算完成   总耗时:" + ts.TotalMilliseconds + " ms";
            Application.DoEvents();

            this.textBox4.Text  = average_MAE.ToString();
            this.textBox5.Text  = ts.TotalMilliseconds + " ms";
            this.textBox6.Text  = this.sSimAlg[this.sim_alg - 1];
            this.textBox7.Text  = this.neigh_num.ToString();
            this.textBox9.Text  = average_Precison.ToString();
            this.textBox10.Text = average_Recall.ToString();
            this.textBox11.Text = average_F_Measure.ToString();
            this.textBox12.Text = "20";

            this.dataGridView1.Rows.Add(count_dgv++, sSimAlg[sim_alg - 1], this.neigh_num, this.Rec_Items_num, average_MAE,
                                        average_Precison, average_Recall, average_F_Measure, (ts.TotalMilliseconds / this.testUserNum) + " ms");
        }
        // 对当前用户产生Top-N推荐
        private void button2_Click(object sender, EventArgs e)
        {
            // 得到ID为userid的用户所支持的关联规则集合
            supp_AssRules[userid] = cApriori.getSupport_AssRules(userid);
            // 得到推荐电影列表
            recItems[userid] = cApriori.getRecItems(supp_AssRules[userid], userid);
            int n = int.Parse(this.textBox3.Text);       // 得到推荐数目

            // 所要求的推荐数目大于所能推荐的
            if (n >= recItems[userid].Length)
            {
                n = recItems[userid].Length - 1;
            }
            this.dataGridView3.Rows.Clear();
            int itemid;

            // 填充推荐列表
            string sGenres;

            for (int i = 1; i <= n; i++)
            {
                itemid = recItems[userid][i].recItems_id;


                sGenres = "";
                for (int count_gen = 0; count_gen < objs_movieInfo[itemid].genres.Length; count_gen++)
                {
                    // 形成影片类型字符串
                    if (objs_movieInfo[itemid].genres[count_gen] != "")
                    {
                        sGenres += objs_movieInfo[itemid].genres[count_gen] + " /";
                    }
                }
                if (sGenres != "")
                {
                    sGenres = sGenres.Substring(0, sGenres.Length - 1);
                }

                this.dataGridView3.Rows.Add(i, recItems[userid][i].rec_Degree, objs_movieInfo[itemid].name,
                                            objs_movieInfo[itemid].ReleaseDate, sGenres);
            }

            // 结果分析
            // 得到测试用户在测试集中的索引
            int   testIndex       = this.comboBox1.SelectedIndex + 1;
            cUser currentTestUser = this.testUsers[testIndex];

            this.label_test_total.Text   = currentTestUser.RatingNums.ToString();
            this.label_test_love.Text    = currentTestUser.love_items_num.ToString();
            this.label_test_dislove.Text = (currentTestUser.RatingNums - currentTestUser.love_items_num).ToString();

            // 评价准则与指标
            cAssStrategy obj_AssStrategy = cApriori.getAssStrategy(currentTestUser, n);

            this.label_Prec.Text    = obj_AssStrategy.Precison.ToString();
            this.label_Reca.Text    = obj_AssStrategy.Recall.ToString();
            this.label_F_value.Text = obj_AssStrategy.calculateF_Measure().ToString();

            // 推荐项目在测试集中的信息
            ArrayList loveItems     = cApriori.TestUserLoveItems_id;
            ArrayList dratItems     = cApriori.TestUserDratItems_id;
            ArrayList unRatingItems = cApriori.TestUserUnRatingItems_id;

            string sLoveIDs = "", sDratIDs = "", sUnRatingIDs = "";

            // 喜欢的推荐项目ID
            foreach (int value in loveItems)
            {
                sLoveIDs += value + " | ";
            }
            // 不喜欢的推荐项目ID
            foreach (int value in dratItems)
            {
                sDratIDs += value + " | ";
            }
            // 未评价的推荐项目ID
            foreach (int value in unRatingItems)
            {
                sUnRatingIDs += value + " | ";
            }

            this.label_loveid.Text      = sLoveIDs.ToString();
            this.label_disloveid.Text   = sDratIDs.ToString();
            this.label_unrating_id.Text = sUnRatingIDs.ToString();
        }