这是一个系列 数据推荐挖掘 方面 第一章,主要讲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); JavaRDDratings=context.textFile("c:/u.data").map(new Function () { @Override public Rating call(String v1) throws Exception { List 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 () { @Override public Boolean call(Rating v1) throws Exception { return v1!=null; } }); //分割部分用来做测试 //RDD [] 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 无论是 什么挖掘 ,不一定是推荐,只要是查找相识性的情况,都可以用到它,比如 图像搜索 就可以用到它。一模一样,这种通用算法 也是我一直使用的。
运行结果