void Process::calLen()//计算模长 { cout << "开始计算模长....." << endl; for (int i = 0;i < user_item.size();i++) { map<float, int> m = user_item[i]; float sum = 0; for (auto it = m.begin();it != m.end();it++) { sum += it->second * it->second; } user_item_len.push_back(sqrt(sum)); } cout << "模长计算完成....." << endl; } void Process::predict() { ofstream outfile; outfile.open("predict.txt"); if (!outfile.is_open()) { cout << "打开文件失败....." << endl; } for (int i = 0;i < user_sim.size();i++) { array<float, UserSize> userItem = user_sim[i];//用户i的相似度表 int userId = i;//取得用户ID map<float, int> m = test[i];//取得成绩和电影ID float itemId; float score; outfile << userId << endl; for (auto it = m.begin();it != m.end();it++) { itemId = it->first; map<float, int> pred; //存储预测信息 for (int j = 0;j < UserSize;j++) { if (i == j || userItem[j] == 0) { continue; } else if (user_item[j].count(itemId) != 0) { score = user_item[j][itemId]; cout << "Sim"<<userItem[j] << "score:" << score << endl; } else { score = 0; } pred.insert(pair<float, int>(userItem[j], score)); } for (auto it1 = pred.rbegin();it1 != pred.rend();it1++) { if (it1->second != 0) { outfile << itemId << " " << it1->first << " " << it->second << " " << it1->second << endl; break; } } } } }
时间: 2024-04-18 16:31:55 浏览: 117
高等热力学复习-LI.pdf
这段代码中包含了两个函数。第一个函数是用来计算模长的,它会遍历每个用户项的map,计算每个用户项值的平方并累加到sum中,最后将平方和的平方根存储到user_item_len数组中。
第二个函数是用来进行预测的。首先打开一个名为"predict.txt"的文件,并检查是否成功打开。然后遍历每个用户的相似度表。对于每个用户,取出其相似度表和对应的成绩和电影ID的map。然后遍历成绩和电影ID的map,对于每个成绩和电影ID,创建一个用于存储预测信息的map。接下来,对于每个相似度表中的用户,如果该用户为当前用户或者其相似度为0,则跳过该用户。否则,如果该用户的用户项中存在与当前电影ID相同的键,将该用户项中对应电影的成绩赋值给score,并输出相似度和成绩。如果该用户项中不存在与当前电影ID相同的键,则将score设为0。最后,将用户的相似度和对应的score插入到预测信息的map中。接着,从预测信息map的末尾开始遍历,找到第一个score不为0的键值对,将电影ID、当前用户的相似度、成绩和预测的score写入到文件"predict.txt"中。完成所有用户的预测后,关闭文件。
阅读全文