完整工程+数据源:https://github.com/scnuxiaotao/recom_sys
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
public class itemcf {
/*
*
* 主函数~
*
*/
/*public static void main(String[] args) throws IOException {
_Run();
}*/
/*
*
* 基于物品的实现~
*
*/
static int usersum = 20836; //用户数
static int itemsum = 200; //物品总数
static int N = 3; //推荐个数
static int[][] train; //训练集合user item rate矩阵
static int[][] test;//测试集合user item rate矩阵
static double[][] trainuseritem; //训练集合user item 兴趣程度 矩阵
static int[][] recommend; //为每个用户推荐N个物品
static simi [][]simiItem; //排序后的相似性矩阵
static double [][]itemsim; //未排序的相似性矩阵
static String road = "data/6 总评论情感分析结果/酒店-评论(已转化).txt"; //数据路径,格式为用户编号::物品编号::评分
static String road2 = "data/10 推荐/(已转化)天河酒店ID.txt";
static String road3 = "data/10 推荐/物品推荐.txt";
public static String road4 = "data/10 推荐/(已转化)用户ID.txt";
public static class simi
{
double value; //相似值
int num; //相似物品号
};
public static void _Run() throws IOException {
get_user_hotel_num();
System.out.println("usersum: "+usersum);
System.out.println("itemsum: "+itemsum);
train = new int[itemsum][usersum]; train[0][0] = 0; //训练集合user item rate矩阵
test = new int[itemsum][usersum]; test[0][0] = 0; //测试集合user item rate矩阵
trainuseritem =
new double[usersum][itemsum]; trainuseritem[0][0] = 0.0; //训练集合user item 兴趣程度 矩阵
recommend = new int[usersum][N]; recommend[0][0] = 0; //为每个用户推荐N个物品
simiItem = new simi[itemsum][itemsum]; //排序后的相似性矩阵
itemsim = new double[itemsum][itemsum]; //未排序的相似性矩阵
int i,j,k = 8; //去用户的k个最近邻居(相似度最高)来计算推荐物品
for(i = 0 ;i < itemsum;++i)
for(j = 0 ;j < itemsum;++j) simiItem[i][j] = new simi();
System.out.println("1.训练集");
SplitData(8,1);
//输出初始化的矩阵
/*for (i=0;i<10;i++)
{
System.out.println("Item"+i+": ");
for (j=0;j<5;j++)
{
System.out.print(train[i][j]+" ");
}
System.out.println();
}*/
System.out.println("2.计算物品之间相似性,得到相似性矩阵");
for (i=0;i<itemsum;i++)
{
for (j=0;j<itemsum;j++)
{
itemsim[i][j] = Simility(train[i],train[j]);
if(i == j) itemsim[i][j] = 0; //此处有bug,已修改
}
}
//输出物品相似性矩阵
/*for (i=0;i<5;i++)
{
System.out.println("Item"+": ");
for (j=0;j<100;j++)
{
System.out.print(itemsim[i][j]+" ");
}
System.out.println();
}*/
System.out.println("3.物品相似度由高到低排序");
sort();
//输出排序后的物品相似性矩阵
/*for(i=0;i<5;i++)
{
System.out.println("Item"+i+": ");
for(j=0;j<10;j++)
{
System.out.print(simiItem[i][j].num+","+simiItem[i][j].value+" ");
}
System.out.println();
}*/
System.out.println("4.得到用户对物品兴趣程度的矩阵");
for(i=0;i<usersum;i++)
{
for(j=0;j<itemsum;j++)
{
if(train[j][i]==0) //如果用户i对物品j没有过行为,才计算i对j的预测兴趣程度
//trainuseritem[i][j]=
getUserLikeItem(i,j,k);
}
}
//输出用户对物品兴趣的矩阵
/*for (i=0;i<5;i++)
{
System.out.println("User_ins"+i+": ");
for (j=0;j<10;j++)
{
System.out.print(trainuseritem[i][j]+" ");
}
System.out.println();
}*/
System.out.println("5.通过物品兴趣程度,推荐前N

这是一个课程设计项目,使用Java实现了基于社交网络的用户与基于物品的协同过滤推荐算法。代码虽然没有详细注释,但是易于理解。在处理数据时,将长编号的用户和物品转换为从1开始的编号,推荐完成后还原回原始编号。

2884

被折叠的 条评论
为什么被折叠?



