数据推荐系统系列 8种方法之一 User-CF 方式
数据推荐系统系列 8种方法之一 User-CF 方式
zhuyuping 发表于2年前
数据推荐系统系列 8种方法之一 User-CF 方式
  • 发表于 2年前
  • 阅读 778
  • 收藏 11
  • 点赞 1
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: 这是一个系列 数据推荐挖掘 方面 第一章,主要讲8个方面 方法 。1.USER-CF 2.COSIM-CF 3.ITEM-CF 4.RBM /MLP 6.KNNgraph 7.DNN 8.Logistic Regression

       这是一个系列 数据推荐挖掘 方面 第一章,主要讲8个方面 。1.USER-CF 2.COSIM-CF 3.ITEM-CF 4.RBM /MLP  6.KNNgraph 7.DNN 8.Logistic Regression



这一章我们讲一讲数据推荐系统 ,常用的几种方式 ,本系列全部是采用java来写。虽然 我能看懂scala 但是 scala的 sbt 那个工具 真是有够坑爹的。。。一直不喜欢使用scala ,反正 scala jvm上的语言 最后同java一样 编译成字节码class文件的,而且scala写的  能写的 java一样可以使用 使用java一样可以编写出来。

      这是第一个系列UserCF方面 ,UserCF 故名思意 就是通过 用户进行协同过滤 ,也就是说,加入 有  用户 项目 评分的三类数据, 使用用户项目 评分 2列数据 做相识性比较 比如jacard系数  皮尔逊系数 cos 余弦

然后得到该用户 相识的一些用户。然后把这些相识用户喜欢的项目推荐给他,比较适合找到热门的项目,所以 特别适合新闻这些,就是查看很多人很多人都大概喜欢的东西。

     下面 我们来使用它 。spark中自带有ALS方式 用来直接做User-CF推荐

    这里我就找电影数据来做测试。这里只是举个例子,我以前用来分析微博热门 就是用户 词汇 词频 一样的,其实 数据 无非就是 user item1 item....n  ratting

     

     下面我们来使用它

import java.util.List;

import org.apache.commons.lang3.math.NumberUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.mllib.recommendation.ALS;
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import org.apache.spark.rdd.RDD;

public class ALSTestMain {

	
	
	
	  public static void main(String[] args) {
		  System.setProperty("hadoop.home.dir", "C:\\spark\\hadoop-2.6.0");
		  SparkConf conf = new SparkConf().setAppName("ALS").setMaster("local");
		   System.out.println(System.getenv("HADOOP_HOME"));
		  JavaSparkContext context = new JavaSparkContext(conf);
		   JavaRDD<Rating> ratings=context.textFile("c:/u.data").map(new Function<String, Rating>() {

			@Override
			public Rating call(String v1) throws Exception {
				List<String> strs=com.google.common.base.Splitter.on("\t").splitToList(v1);
				//判断长度 就不做了 你们自己加上 返回null filter过滤就行 
				if(strs.size()!=4) return null;
				String uid=strs.get(0);
				String item1=strs.get(1);
				String rating=strs.get(2);
				//.... 这里有多个 我就不一个一个的写了 这里有了一个疑问 ,就是Rating用户product 只有1个 而我们item 却有多个 ,这个后面第二章讲的余弦定理 就很容易直接计算向量余炫,这里因为spark的自带ALS
				//使用它的原因 ,我们智能一个product ,这里 有个方式 就是 讲item1 item2 itemn 清洗一遍,所有的item 变成一个多维向量 LSH hash得到一个数 来代替
				String time=strs.get(3);
				if(!NumberUtils.isNumber(uid)) return null;//排除第一行
				return new Rating(Integer.valueOf(uid), Integer.valueOf(item1),Double.valueOf(rating));
				
			}
		}).filter(new Function<Rating, Boolean>() {
			
			@Override
			public Boolean call(Rating v1) throws Exception {
				
				return v1!=null;
			}
		});
		   //分割部分用来做测试
		  //RDD<Rating>[] splitsdatas = ratings.rdd().randomSplit(new double[]{0.7,0.3}, 123456L);
		  int rank = 10;
	      int numIterations = 10;
	      //取训练数据来做训练 splitsdatas[0] 另外做校验
	      MatrixFactorizationModel model = ALS.train(ratings.rdd(), rank, numIterations, 0.01);
	      //得到模型 model
	      model.save(context.sc(), "c:/als.model");
	      System.out.println("#####################模型ALS保存到als.model中################");
	      //model.load
	      //预测
	      //model.predict(user, product)
	}
	
	
	
	
	
	
	
	
	
}


    这里要说一下mlib 与 ml的区别,ml是机器学习高级的api ,mlib是使用ml包进行边界封装的一个包。使用更方便,但是没有多少类,ml包含所有的类

    这一个ALS 只适合 单项目的情况,多项目情况,要使用我一篇文章写得LSH敏感hash的 得到的integer 。如果要使用多个item  来进行 用户的相识性 判断,下篇文章 就讲一种通用的算法 ,适合 所有的 情况 ,无论是多个item 无论是 什么挖掘 ,不一定是推荐,只要是查找相识性的情况,都可以用到它,比如 图像搜索 就可以用到它。一模一样,这种通用算法 也是我一直使用的。

     运行结果

    

     

 


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 303
博文 35
码字总数 51047
×
zhuyuping
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: