sparkmllib 推荐系统实现(学习)

Spark MLlib机器学习 Spark MLlib是Apache Spark的机器学习库,旨在提供简洁、高效、可扩展的机器学习算法。MLlib包括各种常见的机器学习算法,如分类、回归、聚类和协同过滤等。此外,它还提供了一些底层的优化算法和工具,如梯度下降法、数据管道、特征处理和评估指标等。高效性:MLlib中的算法是为分布式计算设计的,可以在大规模数据集上高效运行。可扩展性:MLlib可以轻松扩展到数百个节点,处理TB级别的数据。易用性:MLlib提供了简单易用的API,用户可以快速实现复杂的机器学习任务。 阅读详情

sparkmllib 推荐系统实现

刚刚学习机器学习相关的知识,做一个笔记,方便以后工作中使用。

一.构建训练模型

package com.tanhua.spark.mongo;

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.mllib.recommendation.ALS;
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import scala.Tuple2;

public class MLlibRecommend {

    public MatrixFactorizationModel bestModel(JavaPairRDD<Long, Rating> ratings){
        //统计有用户数量和动态数量以及用户对动态的评分数目
        Long numRatings = ratings.count();
        Long numUsers = ratings.map(v1 -> (v1._2()).user()).distinct().count();
        Long numMovies = ratings.map(v1 -> (v1._2()).product()).distinct().count();
        System.out.println("用户:" + numUsers + "动态:" + numMovies + "评论:" + numRatings);

        //将样本评分表以key值切分成3个部分,分别用于训练 (60%,并加入用户评分), 校验 (20%), and 测试 (20%)
        //该数据在计算过程中要多次应用到,所以cache到内存

        Integer numPartitions = 4; // 分区数
        // 训练集
        JavaRDD<Rating> training = ratings
                .filter(v -> v._1() < 6)
                .values()
                .repartition(numPartitions)
                .cache();

        // 校验集
        JavaRDD<Rating> validation = ratings
                .filter(v -> v._1() >= 6 && v._1() < 8)
                .values()
                .repartition(numPartitions).cache();

        // 测试集
        JavaRDD<Rating> test = ratings
                .filter(v -> v._1() >= 8)
                .values()
                .cache();

        Long numTraining = training.count();
        Long numValidation = validation.count();
        Long numTest = test.count();
        System.out.println("训练集:" + numTraining + " 校验集:" + numValidation + " 测试集:" + numTest);

        //训练不同参数下的模型,并在校验集中验证,获取最佳参数下的模
        int[] ranks = new int[]{10, 11, 12};
//        double[] lambdas = new double[]{0.01, 0.03, 0.1, 0.3, 1, 3};
        double[] lambdas = new double[]{0.01};
//        int[] numIters = new int[]{8, 9, 10, 11, 12, 13, 14, 15};
        int[] numIters = new int[]{8, 9, 10};

        MatrixFactorizationModel bestModel = null;
        double bestValidationRmse = Double.MAX_VALUE;
        int bestRank = 0;
        double bestLambda = -0.01;
        int bestNumIter = 0;

        for (int rank : ranks) {
            for (int numIter : numIters) {
                for (double lambda : lambdas) {
                    MatrixFactorizationModel model = ALS.train(training.rdd(), rank, numIter, lambda);
                    Double validationRmse = computeRmse(model, validation, numValidation);
                    System.out.println("RMSE(校验集) = " + validationRmse + ", rank = " + rank + ", lambda = " + lambda + ", numIter = " + numIter);

                    if (validationRmse < bestValidationRmse) {
                        bestModel = model;
                        bestValidationRmse = validationRmse;
                        bestRank = rank;
                        bestLambda = lambda;
                        bestNumIter = numIter;
                    }
                }
            }
        }



        double testRmse = computeRmse(bestModel, test, numTest);
        System.out.println("测试数据集在 最佳训练模型 rank = " + bestRank + ", lambda = " + bestLambda + ", numIter = " + bestNumIter + ", RMSE = " + testRmse);

        // 计算均值
        Double meanRating = training.union(validation).mapToDouble(v -> v.rating()).mean();

        // 计算标准误差值
        Double baselineRmse = Math.sqrt(test.map(v -> (meanRating - v.rating()) * (meanRating - v.rating())).reduce((v1, v2) -> (v1 + v2) / numTest));

        // 计算准确率提升了多少
        double improvement = (baselineRmse - testRmse) / baselineRmse * 100;

        System.out.println("最佳训练模型的准确率提升了:" + String.format("%.2f", improvement) + "%.");


        // 构建最佳训练模型
        bestModel = ALS.train(ratings.values().rdd(), bestRank, bestNumIter, bestLambda);

        return bestModel;
    }

    /**
     * 校验集预测数据和实际数据之间的均方根误差
     **/
    public  Double computeRmse(MatrixFactorizationModel model, JavaRDD<Rating> data, Long n) {
        // 进行预测
        JavaRDD<Rating> predictions = model.predict(data.mapToPair(v -> new Tuple2<>(v.user(), v.product())));

        JavaRDD<Tuple2<Double, Double>> predictionsAndRatings = predictions
                .mapToPair(v -> new Tuple2<>(new Tuple2<>(v.user(), v.product()), v.rating()))
                .join(data.mapToPair(v -> new Tuple2<>(new Tuple2<>(v.user(), v.product()), v.rating()))).values();

        Double reduce = predictionsAndRatings.map(v -> (v._1 - v._2) * (v._1 - v._2))
                .reduce((v1, v2) -> (v1 + v2) / n);
        //正平方根
        return Math.sqrt(reduce);
    }
}

二.构建数据逻辑(圈子/视频)

	根据自己实际业务进行数据构建,例子如下:
	比如每次点赞发圈点击喜欢,都将保存发送消息到rockermq,
	推荐系统消费消息并说数字整理(根据每个操作进行加减分)保存到mongoDB
	通俗的讲,rocket 是埋点数据,mongoDB是符合构建模型的数据,
	实际工作:根据用户提交的工单,为他推荐一些解决方案的文章。
	现在的想法是,根据工单的标题描述和解决方案的标题,文本进行匹配,进行将解决方案进行评分操作,
	比如 用户1 工单1与解决方案1的匹配度80 给这个解决方案 进行8分,去构建模型

在这里插入图片描述

    /**
     * 发送消息
     *
     * @param type      1-发动态,2-浏览动态, 3-点赞, 4-喜欢, 5-评论,6-取消点赞,7-取消喜欢
     * @param publishId
     */
    private void sendMsg(Integer type, String publishId) {

        try {
            User user = UserThreadLocal.get();

            Publish publish = this.quanZiApi.queryPublishById(publishId);

            Map<String, Object> msg = new HashMap<>();

            msg.put("type", type);
            msg.put("publishId", publishId);
            msg.put("date", System.currentTimeMillis());
            msg.put("userId", user.getId());
            msg.put("pid", publish.getPid());

            this.rocketMQTemplate.convertAndSend("tanhua-quanzi", msg);
        } catch (Exception e) {
            LOGGER.error("圈子消息发送失效! type = " + type + ", publishId = " + publishId, e);
        }
    }
    /**
     * 发送小视频操作相关的消息
     *
     * @param videoId
     * @param type     1-发动态,2-点赞, 3-取消点赞,4-评论
     * @return
     */
    private Boolean sendMsg(String videoId, Integer type) {
        try {
            User user = UserThreadLocal.get();

            Video video = this.videoApi.queryVideoById(videoId);

            //构建消息
            Map<String, Object> msg = new HashMap<>();
            msg.put("userId", user.getId());
            msg.put("date", System.currentTimeMillis());
            msg.put("videoId", videoId);
            msg.put("vid", video.getVid());
            msg.put("type", type);

            this.rocketMQTemplate.convertAndSend("tanhua-video", msg);
        } catch (Exception e) {
            LOGGER.error("发送消息失败! videoId = " + videoId + ", type = " + type, e);
            return false;
        }

        return true;
    }

三.接收消息,记录用户对数据操作并记录保存到mongoDB,

1.圈子的demo

package com.tanhua.recommend.msg;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tanhua.dubbo.server.pojo.Publish;
import com.tanhua.recommend.pojo.RecommendQuanZi;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.io.IOException;

@Component
@RocketMQMessageListener(topic = "tanhua-quanzi",
        consumerGroup = "tanhua-quanzi-consumer")
public class QuanZiMsgConsumer implements RocketMQListener<String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(QuanZiMsgConsumer.class);

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void onMessage(String msg) {
        try {

            JsonNode jsonNode = MAPPER.readTree(msg);
            int type = jsonNode.get("type").asInt();
            String publishId = jsonNode.get("publishId").asText();
            Long date = jsonNode.get("date").asLong();
            Long userId = jsonNode.get("userId").asLong();
            Long pid = jsonNode.get("pid").asLong();

            RecommendQuanZi recommendQuanZi = new RecommendQuanZi();
            recommendQuanZi.setPublishId(pid);
            recommendQuanZi.setDate(date);
            recommendQuanZi.setId(ObjectId.get());
            recommendQuanZi.setUserId(userId);

            //1-发动态,2-浏览动态, 3-点赞, 4-喜欢, 5-评论,6-取消点赞,7-取消喜欢

            switch (type) {
                case 1: {
                    int score = 0;
                    Publish publish = this.mongoTemplate.findById(new ObjectId(publishId), Publish.class);
                    int length = StringUtils.length(publish.getText());

                    if(length > 0 && length <= 50){
                        score = 1;
                    }else if(length > 50 && length <= 100){
                        score = 2;
                    }else{
                        score = 3;
                    }

                    if(!CollectionUtils.isEmpty(publish.getMedias())){
                        score += publish.getMedias().size();
                    }

                    recommendQuanZi.setScore(Double.valueOf(score));

                    break;
                }
                case 2: {
                    recommendQuanZi.setScore(1d);
                    break;
                }
                case 3: {
                    recommendQuanZi.setScore(5d);
                    break;
                }
                case 4: {
                    recommendQuanZi.setScore(8d);
                    break;
                }
                case 5: {
                    recommendQuanZi.setScore(10d);
                    break;
                }
                case 6: {
                    recommendQuanZi.setScore(-5d);
                    break;
                }
                case 7: {
                    recommendQuanZi.setScore(-8d);
                    break;
                }
                default: {
                    recommendQuanZi.setScore(0d);
                    break;
                }

            }

            // 将数据写入到MongoDB
            String collectName = "recommend_quanzi_" + new DateTime().toString("yyyyMMdd");
            this.mongoTemplate.save(recommendQuanZi,collectName );

        } catch (Exception e) {
            LOGGER.error("消息处理失败! msg = " + msg);
        }

    }
}

2.推荐视频的demo

package com.tanhua.recommend.msg;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tanhua.recommend.pojo.RecommendVideo;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(topic = "tanhua-video",
        consumerGroup = "tanhua-video-consumer")
public class VideoMsgConsumer implements RocketMQListener<String> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    private static final Logger LOGGER = LoggerFactory.getLogger(VideoMsgConsumer.class);

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void onMessage(String msg) {
        try {
            JsonNode jsonNode = MAPPER.readTree(msg);

            Long userId = jsonNode.get("userId").asLong();
            Long vid = jsonNode.get("vid").asLong();
            Integer type = jsonNode.get("type").asInt();

            //1-发动态,2-点赞, 3-取消点赞,4-评论
            RecommendVideo recommendVideo = new RecommendVideo();
            recommendVideo.setUserId(userId);
            recommendVideo.setId(ObjectId.get());
            recommendVideo.setDate(System.currentTimeMillis());
            recommendVideo.setVideoId(vid);

            switch (type) {
                case 1: {
                    recommendVideo.setScore(2d);
                    break;
                }
                case 2: {
                    recommendVideo.setScore(5d);
                    break;
                }
                case 3: {
                    recommendVideo.setScore(-5d);
                    break;
                }
                case 4: {
                    recommendVideo.setScore(10d);
                    break;
                }
                default: {
                    recommendVideo.setScore(0d);
                    break;
                }
            }

            String collectionName = "recommend_video_" + new DateTime().toString("yyyyMMdd");
            this.mongoTemplate.save(recommendVideo, collectionName);

        } catch (Exception e) {
            LOGGER.error("处理小视频消息失败~" + msg, e);
        }
    }
}

四.推荐逻辑实现(圈子/视频)

	1.圈子类似陌生人朋友圈,根据mongoDB保存的点击,查看,评论,点赞,发动态等记录的分数,进行数据合并,整理。
package com.tanhua.spark.mongo;

import com.mongodb.spark.MongoSpark;
import com.mongodb.spark.rdd.api.java.JavaMongoRDD;
import org.apache.commons.lang3.StringUtils;
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.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import org.bson.Document;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import scala.Tuple2;

import java.io.InputStream;
import java.util.*;

public class SparkQunaZi {

    public static void main(String[] args) throws Exception {

        //加载外部的配置文件,app.properties
        InputStream inputStream = SparkQunaZi.class.getClassLoader().getResourceAsStream("app.properties");
        Properties properties = new Properties();
        properties.load(inputStream);

        //构建Spark配置
        SparkConf sparkConf = new SparkConf()
                .setAppName("SparkQunaZi")
                .setMaster("local[*]")
                .set("spark.mongodb.input.uri", properties.getProperty("spark.mongodb.input.uri"));

        //构建Spark上下文
        JavaSparkContext jsc = new JavaSparkContext(sparkConf);

        //加载MongoDB中的数据
        JavaMongoRDD<Document> rdd = MongoSpark.load(jsc);

        //打印测试数据
//        rdd.foreach(document -> System.out.println(document.toJson()));

        //在数据中会存在,同一个用户对不同的动态(相同动态)进行操作,需要合并操作
         //reduceByKey 是根据key 将分数加和
        JavaRDD<Document> values = rdd.mapToPair(document -> {
            Long userId = document.getLong("userId");
            Long publishId = document.getLong("publishId");
            return new Tuple2<>(userId + "_" + publishId, document);
        }).reduceByKey((v1, v2) -> {
            double newScore = v1.getDouble("score") + v2.getDouble("score");
            v1.put("score", newScore);
            return v1;
        }).values();

        //用户列表
        List<Long> userIdList = rdd.map(v1 -> v1.getLong("userId")).distinct().collect();

        //数据的打印,测试
//        values.foreach(document -> System.out.println(document.toJson()));

        JavaPairRDD<Long, Rating> ratings = values.mapToPair(document -> {
            Long date = document.getLong("date");
            int userId = document.getLong("userId").intValue();
            int publishId = document.getLong("publishId").intValue();
            Double score = document.getDouble("score");
            Rating rating = new Rating(userId, publishId, score);
            return new Tuple2<>(date % 10, rating);
        });

        MLlibRecommend mLlibRecommend = new MLlibRecommend();
        MatrixFactorizationModel bestModel = mLlibRecommend.bestModel(ratings);

        //连接redis,做存储
        String redisNodesStr = properties.getProperty("redis.cluster.nodes");
        String[] redisNodesStrs = StringUtils.split(redisNodesStr, ',');
        Set<HostAndPort> nodes = new HashSet<>();
        for (String nodesStr : redisNodesStrs) {
            String[] ss = StringUtils.split(nodesStr, ':');
            nodes.add(new HostAndPort(ss[0], Integer.valueOf(ss[1])));
        }
        JedisCluster jedisCluster = new JedisCluster(nodes);

        for (Long userId : userIdList) {
            Rating[] recommendProducts = bestModel.recommendProducts(userId.intValue(), 20);

            List<Integer> products = new ArrayList<>();

            for (Rating product : recommendProducts) {
                products.add(product.product());
            }

            String key = "QUANZI_PUBLISH_RECOMMEND_" + userId;
            jedisCluster.set(key, StringUtils.join(products, ','));
        }

        //关闭
        jedisCluster.close();
        jsc.close();


    }

}

2.视频推荐,根据mongoDB保存的点击,查看,评论,点赞,发动态等记录的分数,进行数据合并,整理
package com.tanhua.spark.mongo;

import com.mongodb.spark.MongoSpark;
import com.mongodb.spark.rdd.api.java.JavaMongoRDD;
import org.apache.commons.lang3.StringUtils;
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.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import org.bson.Document;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import scala.Tuple2;

import java.io.InputStream;
import java.util.*;

public class SparkVideo {

    public static void main(String[] args) throws Exception{

        //读取外部的配置文件
        InputStream inputStream = SparkVideo.class.getClassLoader().getResourceAsStream("app.properties");
        Properties properties = new Properties();
        properties.load(inputStream);

        //构建Spark配置
        SparkConf sparkConf = new SparkConf()
                .setAppName("SparkVideo")
                .setMaster("local[*]")
                .set("spark.mongodb.input.uri", properties.getProperty("spark.video.mongodb.input.uri"));

        //构建Spark上下文
        JavaSparkContext jsc = new JavaSparkContext(sparkConf);

        //加载MongoDB中的数据
        JavaMongoRDD<Document> rdd = MongoSpark.load(jsc);

//        rdd.foreach(document -> System.out.println(document.toJson()));

        //在数据中有同一个用户对不同的小视频进行评价,需要进行合并操作
        //reduceByKey 是根据key 将分数加和
        JavaRDD<Document> values = rdd.mapToPair(document -> {
            Integer user = document.getLong("userId").intValue();
            Integer product = document.getLong("videoId").intValue();
            return new Tuple2<>(user + "_" + product, document);
        }).reduceByKey((v1, v2) -> {
            Double score = v1.getDouble("score") + v2.getDouble("score");
            v1.put("score", score);
            return v1;
        }).values();

        //得到数据中的用户id集合
        List<Long> userIdList = rdd.map(v1 -> v1.getLong("userId")).distinct().collect();

//        values.foreach(document -> System.out.println(document.toJson()));

        //按照日期对10进行取模作为key,Rating对象作为value,获取到数据用于后续的数据处理
        JavaPairRDD<Long, Rating> ratings = values.mapToPair(document -> {
            Integer user = document.getLong("userId").intValue();
            Integer product = document.getLong("videoId").intValue();
            Double score = document.getDouble("score");
            Long date = document.getLong("date");
            Rating rating = new Rating(user, product, score);
            return new Tuple2<>(date % 10, rating);
        });

        //通过MLlib模型进行推荐,获取到最优的推荐模型
        MLlibRecommend mLlibRecommend = new MLlibRecommend();
        MatrixFactorizationModel bestModel = mLlibRecommend.bestModel(ratings);

        //构建Redis环境
        String redisClusterNodes = properties.getProperty("redis.cluster.nodes");
        String[] redisNodes = redisClusterNodes.split(",");
        Set<HostAndPort> nodes = new HashSet<>();
        for (String redisNode : redisNodes) {
            String[] hostAndPorts = redisNode.split(":");
            nodes.add(new HostAndPort(hostAndPorts[0], Integer.valueOf(hostAndPorts[1])));
        }
        JedisCluster jedisCluster = new JedisCluster(nodes);

        //分别对每一个用户进行推荐,推荐20个小视频信息
        for (Long userId : userIdList) {
            Rating[] recommendProducts = bestModel.recommendProducts(userId.intValue(), 20);

            List<Integer> products = new ArrayList<>();
            for (Rating rating : recommendProducts) {
                products.add(rating.product());
            }

            //存储到redis
            String key = "QUANZI_VIDEO_RECOMMEND_" + userId;
            jedisCluster.set(key, StringUtils.join(products, ','));
        }

        //关闭连接
        jedisCluster.close();
        jedisCluster.close();

    }
}

SparkMLlib---基于余弦相似度的用户相似计算 package mllib import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkContext, SparkConf} import scala.collection.mutable.Map /** * Created by 汪本成 on 2016/8/4. */ object UserSimilar 阅读详情

相关推荐

推荐系统(Recommender System)笔记 04:推荐系统工程实现

推荐系统(Recommender System)04:推荐系统工程实现推荐系统的数据流批处理大数据架构(Batch Processing)流计算大数据架构 (Streaming Processing)Lambda 架构Kappa 架构大数据平台与推荐系统的结合推荐模型的离线训练Spark MLlibParameter ServerTensorFlow推荐模型的上线部署预存 推荐/Embedding 结果自研模型线上服务平台训练 Embedding + 轻量级线上模型利用 PMML 转换并部署模型Tensor

MYJace的博客 1715

Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS   1、线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多重共线性情况下运行良好。   数学上,ElasticNet被定义为L1和L2正则化项的凸组合: 通过适当设置α,ElasticNet包含L1和L2正则化作为特殊情况。例如,如果用...

weixin_34216196的博客 507

spark(57) -- SparkMllib -- SparkMllib的算法的分类和应用场景

1. 机器学习系统设计及架构 2. SparkMllib算法对机器学习建模各过程的支持 3. SparkMllib分类算法比较及应用场景详解 4. SparkMllib回归算法比较及应用场景详解 5. SparkMllib聚类算法比较及应用场景详解 6. SparkMllib关联算法比较及应用场景详解 7. SparkMllib推荐算法比较及应用场景详解

erainm 1192

视频教程-Spark Mllib 机器学习实践课程-大数据

Spark Mllib 机器学习实践课程 专注提供优质教学内容 ...

weixin_30821271的博客 821

spark(56) -- SparkMllib -- SparkMllib的功能和应用场景

1. SparkMllib简介及功能介绍 2. SparkML版本变迁 3. SparkMllib架构详解 4. 基于RDD的API与基于DataFrame的API区别和应用 5. SparkMllib的环境搭建与IDEA环境配置 6. RDD、DataSet、Dataframe区别及转化过程

erainm 1644

基于spark的图书推荐系统

推荐系统是一种信息过滤系统,能够自动预测用户对特定产品或服务的偏好,并向其提供个性化的推荐。它通常基于用户的历史行为、个人喜好、兴趣和偏好等,通过数据挖掘和机器学习算法,在大数据的支持下生成个性化的推荐内容,从而提高用户购买率和满意度。推荐系统广泛应用于电子商务、社交媒体、新闻资讯、音乐、电影等领域。推荐系统的作用是根据用户的历史行为和偏好,为用户推荐个性化的内容,以满足用户的需求和兴趣。 在推荐系统架构中,离线计算部分主要使用 Hadoop、Spark、Hive 等大数据处理技术,将海量历史数据进行离线处

qq_52770248的博客 2497

电影推荐系统 python简书_Spark实时离线电影推荐系统

1 项目介绍2 涉及的技术3 推荐流程图4 收获5 问题1 项目介绍使用Spark框架实现电影推荐系统;运用数据挖掘的算法产生模型,为用户精准推荐喜好的电影;分别通过离线和实时两种方式实现电影推荐系统;2 涉及技术Spark:基于内存的分布式计算框架Hadoop:分布式离线计算框架Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可...

weixin_39533795的博客 342

基于Spark MLlib ALS的音乐推荐系统.zip

本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!! 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!! 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!

基于 Spark MLlib 的推荐系统实现

基于 Spark MLlib 的推荐系统实现 本文解析了使用Spark MLlib构建推荐系统的关键技术与优化方法。首先介绍了Spark MLlib的核心框架演进,重点对比了RDD和DataFrame两种API的特性及其在2025年的最新发展(如深度学习集成、AutoML支持)。其次深入剖析了协同过滤算法原理及前沿趋势(如神经网络协同过滤、图神经网络)。最后提供了优化的Java代码实现,通过分布式操作避免性能瓶颈。全文从框架、算法到实践三个维度,为构建高效推荐系统提供了全面指导。

m0_73889530的博客 992

基于Spark ML实现的豆瓣电影推荐系统.zip

本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!! 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!! 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过助教老师审定过的,应该能够满足学习、使用需求,如果有需要的话可以放心下载使用。有任何问题也可以随时私信博主,博主会第一时间给您解答!!!

UG二次开发避坑指南:如何正确配置Python环境让NXOpen脚本跑起来?

本文详细介绍了UG/NX二次开发中Python环境配置的全流程与NXOpen脚本调试技巧,帮助开发者避开常见陷阱。从NXOpen架构解析到Python解释器版本匹配,再到环境变量设置与路径问题处理,提供了一套经过验证的配置方案,确保脚本顺利运行。

weixin_33859135的博客 447

数据处理:SparkMLlib的推荐系统

1.背景介绍 在本文中,我们将深入探讨Spark MLlib库中的推荐系统。推荐系统是一种常见的数据处理任务,它旨在根据用户的历史行为、喜好或其他信息为用户推荐相关的物品。Spark MLlib是一个用于大规模机器学习的库,它提供了一系列的算法和工具,可以用于构建高效的推荐系统。 1. 背景介绍 推荐系统是一种广泛应用于电商、社交网络、新闻推送等领域的技术,它旨在根据用户的历史行为、喜好或其...

AI天才研究院 1100

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1143

电商推荐系统论文:基于Spark机器学习的电商推荐系统的设计与实现,大数据电商推荐系统毕设论文,Spring MLlib电商推荐系统

毕 业 设 计(论 文) 题 目: 基于Spark机器学习的电商推荐系统的设计与实现 这是我去年本科毕业时做的毕业设计论文,全文三万多字,知网查重对重复率1%,由于本科论文不会被发表到知网上,再加上我已毕业近一年,现在将论文发表到优快云。如有需要做毕设论文可引用本文对内容,先到先得(内容纯原创,少有重复)。 由于作者对水平有限,文章中难免有错误对内容或作者对相关技术有错误对见解,望读者予以谅解,谢谢! 接上篇文章:电商推荐系统(下):实时推荐服务、实时框架、实时推荐算法、获取用户的K次...

qq_43265673的博客 2万+

Flutter版本升级踩坑实录:从3.27到3.35,我们是如何修复Impeller引擎导致的花屏问题的?

本文详细记录了团队在Flutter版本升级过程中遇到的Impeller引擎导致的花屏问题及解决方案。从问题诊断到最终升级至稳定版3.35,文章分享了排查步骤、升级策略和性能对比数据,为开发者提供了实用的参考经验。

weixin_26854555的博客 502

基于深度学习的图像去雨(Opencv,Pytorch,Cnn)

最近做了一个图像去雨项目,使用的语言为Python,深度学习框架为Pytorch。去雨效果不错,具体请看效果视频!图像去雨(GAN,Opencv,Pytorch)

Czqqwer的博客 2611

《Spark MLlib 机器学习》第四章至十三章代码

《Spark MLlib 机器学习》第四章 至 第十三章代码,已经上传至网盘代码和数据地址网盘:http://pan.baidu.com/s/1c1J8ZN6

Spark MLlib 机器学习 7635

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

计算机组成原理(第三版)唐朔飞-第九章控制单元的功能-课后习题

weixin_45735391的博客 4万+

SparkMLlib—协同过滤推荐算法,电影推荐系统,物品喜好推荐

MLlib——协同过滤推荐算法一、协同过滤1.1 显示vs隐式fankui1.2 实例介绍1.2.1 数据说明评分数据说明(ratings.data)用户信息(users.dat)电影信息(movies.dat)程序代码 相关内容原文地址: 博客园:Lemon_Qin:MLlib-协同过滤 博客园:大数据和AI躺过的坑:Spark MLlib协同过滤算法 一、协同过滤 协同过滤(Collabo...

爱是与世界平行 3266

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1267

5、AIX系统硬件管理与故障诊断全解析

本文全面解析了AIX系统的硬件管理与故障诊断方法,涵盖系统管理服务(SMS)的使用、设备兼容性配置、设备配置数据库结构、常用命令如cfgmgr、lsattr、smitty devices的操作详解,并深入介绍了错误日志管理机制,包括errdemon、errpt、errlogger等命令的应用。通过实际案例分析和流程图展示,帮助系统管理员掌握从问题怀疑到诊断执行再到日志清理的完整流程,同时提供注意事项与最佳实践,助力AIX系统的稳定运行与高效维护。

y2z3a4b5c的博客 62

SparkMLlib库与模型推荐工具

1.背景介绍 1. 背景介绍 Apache Spark是一个开源的大规模数据处理框架,它提供了一个易用的编程模型,使得数据科学家和工程师可以快速地处理和分析大量数据。Spark MLlib是Spark框架的一个组件,它提供了一系列的机器学习算法和工具,以便于快速构建和部署机器学习模型。 模型推荐是一种常见的机器学习任务,它涉及到根据用户的历史行为和特征,为用户推荐相关的物品或服务。在现实生活...

AI天才研究院 534

Python-编写点云处理软件(二)点云软件ui制作之仿CC界面

至本篇结束,我们已经能够获得一个有点模子的界面了,但是具体的功能还没有编写,后续的文章将逐渐完善功能。

weixin_43894929的博客 3953

推荐系统的算法基础

推荐系统的算法基础1.数学基础1.1 线性代数1.2 概率与统计1.3 损失函数1.4 优化方法1.5 评价方法2.推荐系统介绍3.推荐算法工具3.1 Sklearn3.1.1 SKlearn介绍3.1.1 SKlearn建模流程3.2 Spark MLlib3.3 Tensorflow3.4 Notebook介绍 1.数学基础 1.1 线性代数 向量点积 点积的定义: A⋅B=∑i=1naibi A·B= \displaystyle \sum_{i=1}^n a_ib_i A⋅B=i=1∑n​ai​b

Rocket,Qian的博客 988

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SparkMLlib的模型部署:实现SparkMLlib的模型部署和应用

1.背景介绍 1. 背景介绍 Apache Spark是一个开源的大规模数据处理框架,它可以处理批量数据和流式数据。Spark MLlib是Spark的一个子项目,用于机器学习和数据挖掘。MLlib提供了许多常用的机器学习算法,如梯度下降、随机梯度下降、支持向量机、决策树等。 模型部署是机器学习项目的关键环节,它涉及将训练好的模型部署到生产环境中,以实现预测和推理。在大数据场景下,Spark...

AI天才研究院 582

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Spring Boot 实现万能文件在线预览
下一篇: 常用基础知识
Trank-Lw
博客等级 码龄9年 103粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值