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; }
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; }
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; }
// 运行一次算法 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"); }
// 开始运行 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(); }