基于社交网络的用户与基于物品的协同过滤推荐算法-java

这是一个课程设计项目,使用Java实现了基于社交网络的用户与基于物品的协同过滤推荐算法。代码虽然没有详细注释,但是易于理解。在处理数据时,将长编号的用户和物品转换为从1开始的编号,推荐完成后还原回原始编号。
完整工程+数据源: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
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值