spark mllib ALS电影推荐_spark mllib als 电影推荐-程序员宅基地

技术标签: mllib  spark  ALS  电影推荐  

package zqr.com;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.mllib.recommendation.ALS;
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import scala.Tuple2;

import java.util.*;

public class MovieRecommended {

    public static void main(String args[]){
        // 输入用户id
        System.out.println("输入用户id");
        Scanner scan=new Scanner(System.in);
        String number=scan.nextLine();


        SparkConf conf = new SparkConf().setAppName("movie recommended system").setMaster("local");

        JavaSparkContext sc = new JavaSparkContext(conf); // 其底层实际上就是ScalaSparkContext

        String path = "/usr/local/spark/testdata/ml-latest-small/ratings.csv";

        JavaRDD<String> rating_data = sc.textFile(path);

        // rating_data.collect().forEach(System.out::println);



        JavaRDD<Rating> mapdata = rating_data.map(s -> {
            String[] sarray = s.split(",");
            Rating rt=null;
            if(sarray[0].equals("userId")) {

             rt=null;

            }else if(Double.parseDouble(sarray[2])<5&&Double.parseDouble(sarray[2])>=0&&!sarray[2].isEmpty()){
                rt=new Rating(Integer.parseInt(sarray[0]),
                        Integer.parseInt(sarray[1]),
                        Double.parseDouble(sarray[2]));
            }else{
                rt=null;
            }

            return rt;
        }).filter(k->k!=null);


        //=====================================================================================

        //mapdata.collect().forEach(System.out::println);

        // 隐性因子个数
        int rank = 10;
        //迭代次数
        int numIterations = 10;
        //lambdaALS的正则化参数;
        MatrixFactorizationModel model = ALS.train(JavaRDD.toRDD(mapdata), rank, numIterations, 0.01);

        //System.out.println("model:"+model);

        // 评估评级数据模型
        JavaRDD<Tuple2<Object, Object>> userProducts =
                mapdata.map(r -> new Tuple2<>(r.user(), r.product()));

        JavaPairRDD<Tuple2<Integer, Integer>, Double> predictions = JavaPairRDD.fromJavaRDD(
                model.predict(JavaRDD.toRDD(userProducts)).toJavaRDD()
                        .map(r -> new Tuple2<>(new Tuple2<>(r.user(), r.product()), r.rating()))
        );

        //System.out.println("打印predictions的值");
        //predictions.collect().forEach(System.out::println);
        //Map<String,Map<Double,String>> data=new HashMap<String,Map<Double,String>>();
        Map<String,Double> tow=new TreeMap<String,Double>();
        List list=predictions.collect();
        for(Object x : list){
            String string=x.toString();
            String []arr=string.split("[,()]");
            String uid=arr[2];
            String mid=arr[3];
            double pfen=Double.parseDouble(arr[5]);

            if(uid.equals(number)){

            }
            tow.put(mid,pfen);
            //data.put(uid,tow);
            //System.out.println(uid+"--->"+mid+"---->"+pfen);

        }
           //System.out.println(list);

//           for (Map.Entry<String, Double> entry : tow.entrySet()) {
//           System.out.println(entry.getKey() + ":" + entry.getValue());
//           }


        //转换成list进行排序
        List<Map.Entry<String, Double>> li = new ArrayList<Map.Entry<String,Double>>(tow.entrySet());
       // 排序
        Collections.sort(li, new Comparator<Map.Entry<String, Double>>() {
            //根据value排序
            public int compare(Map.Entry<String, Double> o1,
                               Map.Entry<String, Double> o2) {
                double result = o2.getValue() - o1.getValue();
                if(result > 0)
                    return 1;
                else if(result == 0)
                    return 0;
                else
                    return -1;
            }
        });
        List<String> l=new ArrayList<String>();
        int num=0;
        for (Map.Entry<String, Double> entry : li) {
            System.out.println(entry.getKey() + "      " + entry.getValue());
            l.add(entry.getKey().toString());
            num++;
            if(num==10){
                break;
            }
        }




        String path1 = "/usr/local/spark/testdata/ml-latest-small/movies.csv";

        JavaRDD<String> mviddata = sc.textFile(path1);

        // rating_data.collect().forEach(System.out::println);


            JavaRDD<Map<String,String>> move_pair = mviddata.map(s -> {
                String[] sarray = s.split(",");
                String x=sarray[0].toString();
                String y=sarray[1].toString();
                Map mp=new HashMap<String,String>();
                mp.put(x,y);
                return  mp;
            });


        //move_pair.collect().forEach(System.out::println);
        for(String idx:l) {
            move_pair.foreach(x -> {
             if(x.containsKey(idx)){
                 String value=x.get(idx).toString();
                 System.out.println(value);
             }

            });
        }








//        for (Map.Entry<String, Double> entry : tow.entrySet()) {
//            System.out.println(entry.getKey() + ":" + entry.getValue());
//        }

       // model.save(sc.sc(), "target/movierd/myCollaborativeFilter");
    }



}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32021523/article/details/79765034

智能推荐

通过.netCore运行vue项目的解决方案-程序员宅基地

文章浏览阅读730次。背景最近有个特殊的需求需要通过.netCore来启动vue项目,而不是通过npm run dev 来启动。这里不写dotnetCore的壳子是怎么写的,我们只需要可以利用.netCore把项目启动起来就可以。用起来就跟用vue-cli一样。(废话,我就是用vue-cli 2创建的项目)用vue-cli3的朋友们需要稍加修改。事前准备.netCore 2.1vue-cli 2.9.6..._vue.netcore-master怎么使用viewgrid.vue页面

Velocity模板引擎-收集整理-程序员宅基地

文章浏览阅读216次。前述:基于Java的网站开发,很多人都采用JSP作为前端网页制作的技术,尤其是在国。这种技术通常会存在一些问题,可以通过简单地分析网站开发过程来看看这些问题。通常网站开发采用以下两种方式:◆ 网站功能确定后,由美工设计网页的UI(界面)部分,然后由程序员在其上加入代码显示逻辑(比如循环、判断显示数据结果)。这就是通常的JSP页面制作,当然这部分可以由美工完成模板,然后由JSP工程师以它为原型创建..._velocity模板引擎

linux下nodejs安装步骤简化版-程序员宅基地

文章浏览阅读1.2k次。安装依赖nodejs下载地址 https://nodejs.org/en/本文安装版本 node-v10.16.0-linux-x64.tar.xz解压:# xz -d node-v10.16.0-linux-x64.tar.xz# tar -xvf node-v10.16.0-linux-x64.tar建立软链:# ln -s /nodejs/node-v10.16.0-l...

pycharm 离线安装插件-程序员宅基地

文章浏览阅读2.2k次。插件离线下载地址:http://plugins.jetbrains.com/1、下载插件:http://plugins.jetbrains.com/2、安装插件:settings -> plugins -> install plugin from disk,然后重启IDEA即可。

高精度处理BigDecimal<Java算法>_防止js计算出现0.8999999999999-程序员宅基地

文章浏览阅读126次。Java数据类型的陷阱public class test{ public static void main(String[] args){ System.out.printfln(2.0-1.1); }}上述代码的结果是多少呢?按理讲应该是0.9,但实际上结果并不是那样,运行结果等于0.8999999999999,这时候怎么处理这个问题?我们需要使用到高精度处理函数BigDecimal,处理结果如下:import java.math.BigDecimal;public class t_防止js计算出现0.8999999999999

PyQt5入门(七)常用控件_pyqt5控件-程序员宅基地

文章浏览阅读5k次,点赞12次,收藏31次。按钮控件(QpushButton)QAbstractButton(所有按钮控件的父类)QPushButton(普通按钮)AToolButton(工具条按钮)QRadioButton(单选框按钮)QCheckBox(复选框按钮)代码:import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *class QPushButtonDemo(QDialo._pyqt5控件

随便推点

2021-07-28_海洋水深数据下载-程序员宅基地

文章浏览阅读983次。MIKE学习笔记一、提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言岸线及水深数据有多种获取方法,以我的理解而言,其实主要包括两类。第一类是通过各种全球岸线及水深数据库资源来获取,也就是本文所介绍内容,但这种方_海洋水深数据下载

C语言-第8课 - 注释符号-程序员宅基地

文章浏览阅读217次。第8课- 注释符号C语言中的符号符号名称符号名称符号名称符号名称,逗号(左圆括号^xor(异或)\反斜杠.圆点)右圆..._在c程序中注释部分放在一对什么符号中间

倾角传感器或者加速度计出来的数据跳动怎么处理_加速度感应器测试一直在动-程序员宅基地

文章浏览阅读1.2k次。我用的是SCA6T_加速度感应器测试一直在动

python中定义私有变量的方法是,Python中的私有变量和方法-程序员宅基地

文章浏览阅读51次。Which should I use _foo (an underscore) or __bar (double underscore) for private members and methods in Python?解决方案Please note that there is no such thing as "private method" in Python. Double undersc..._python 私有变量 __dict__

postfix疯狂外发垃圾邮件之分析与解决_postfix/clearup-程序员宅基地

文章浏览阅读5.2k次。postfix疯狂外发垃圾邮件之分析与解决本周二上班有人反应公司邮箱无法外发邮件,后来登录到服务器查看原因,不看不知道,一看吓一跳,服务器日志疯狂滚动!一看全是被其它邮件服务器拒绝的信息!由于这台服务器以前不是我管,连配置文件都find了好久,最终从十多个main.cf中找到了真正的配置文件...... 下面开始分析问题与解决问题!分析localhost# find_postfix/clearup

Unity之移动设备之IOS调整输入框位置_unity ios重写输入框-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏3次。1,需求:当玩家点击输入框的,会弹出虚拟键盘,如果我们的输入框靠下,那么便会被挡住,这个时候如果想要调整输入框位置。2,思路:这边上移移动的是所有UI的父物体(偷懒了),如果想要移动较小的物体,则可以自行代码调整,就需要判断一下当前输入框所在位置,会不会被虚拟键盘挡住,如果会,则需要上移,上移高度应该上移多少。3,实现:3.1 实现的辅佐工具:1,DOTween插件;2,事件管理器(自行封装)。3.2 虚拟键盘各类信息using UnityEngine;using UnityEngine.Eve_unity ios重写输入框