创新实训(20)——基于Mohout推荐引擎的推荐算法的实现

前言

之前学习了有关java的Mohout推荐引擎,我们就可以根据它提供的类快速的进行我们的推荐算法的构建了。

导入Mahout依赖

   <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout</artifactId>
            <version>0.11.1</version>
            <type>pom</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.mahout/mahout-core -->
        <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout-core</artifactId>
            <version>0.9</version>
        </dependency>

导入依赖的之后,发现org.apache.mahout包中会有一个子package报错,好像是缺少了什么东西,并且在install的时候还会报错,但是却不影响代码的执行,好像那个package在项目中完全没有用到。
最后加上了<type>pom</type>之后问题解决,好像是依赖不是从maven的中心仓库拉取的,所以出现了这样的问题。

数据源

昨天抽取到的user tag 的浏览数据和user category的浏览数据,存取csv中。
在这里插入图片描述
在这里插入图片描述

基于用户的协同过滤

  /**
     * 基于用户的推荐  通过用户浏览某一分类或标签的文章的数据 形成相似矩阵进行推荐
     * @param userId 为那个用户推荐
     * @param size    推荐几个item
     * @param modelFileName  模型文件名 (是要推荐标签 还是推荐分类)
     * @return
     * @throws IOException
     * @throws TasteException
     */
    public  List<RecommendedItem> userBasedRecommended(int userId,int size,String modelFileName) throws IOException, TasteException
    {
        //构造数据模型
        DataModel dataModel = new FileDataModel(new File(modelFileName));
        //计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。这里基于皮尔逊
        UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
        //计算最近邻域,邻居有两种算法,基于固定数量的邻居和基于相似度的邻居,这里使用基于固定数量的邻居 选择用户数量为
        UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(50, similarity, dataModel);
        //构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于用户的协同过滤推荐
        Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);
        //给用户id为userId的用户 推荐size个标签
        List<RecommendedItem> recommendedItemList = recommender.recommend(userId, size);
        return recommendedItemList;
    }

这里可以传入不同的模型文件的路径,来选择是基于用户-标签还是基于用户-分类构建模型。
这里我使用了皮尔逊系数来计算相似度,并且使用固定数量的邻居,
然后使用GenericUserBasedRecommender类作为推荐器,实现基于物品的协同过滤。
最终给id为userId的用户推荐size个分类或者标签。

基于标签或分类的协同过滤算法

 /**
     *  基于标签的推荐  基于物品的协同过滤算法
     * @param userId  为那个用户推荐
     * @param size   推荐几个item
     * @param modelFileName   模型文件名 (是要推荐标签 还是推荐分类)
     * @return  为id为user_id的用户推荐size个item
     * @throws IOException
     * @throws TasteException
     */
    public  List<RecommendedItem> itemBaseRecommended(int userId,int size ,String modelFileName) throws IOException, TasteException
    {
        //构造数据模型
        DataModel dataModel = new FileDataModel(new File(modelFileName));
        //计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。
        ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);
        //构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐
        GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
        //给用户ID等于userId的用户推荐size个标签
        List<RecommendedItem> recommendedItemList = recommender.recommend(userId, size);
        return recommendedItemList;
    }

这里可以传入不同的模型文件的路径,来选择是基于用户-标签还是基于用户-分类构建模型。
这里我使用了皮尔逊系数来计算相似度
然后使用GenericItemBasedRecommender类作为推荐器,实现基于物品的协同过滤。
最终给id为userId的用户推荐size个分类或者标签。

当用户正在浏览某个分类或者某个标签的文章时,为其推荐对应 标签 或者分类的其他标签 或者分类

    /**
     * 当用户正在浏览某个分类或者某个标签的文章时,为其推荐对应 标签 或者分类的其他标签 或者分类
     * @param userId  为那个用户推荐
     * @param itemId  当前正在浏览的 标签id 或者分类id
     * @param size    推荐多少个
     * @param modelFileName  模型文件名 (是要推荐标签 还是推荐分类)
     * @return
     * @throws IOException
     * @throws TasteException
     */
    public  List<RecommendedItem> itemBaseRecommendedWithItem(int userId,int itemId,int size,String modelFileName) throws IOException, TasteException {
        //构造数据模型
        DataModel dataModel = new FileDataModel(new File(modelFileName));
        //计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。
        ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);
        //构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐
        GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
        //给用户ID等于user_id的用户推荐size个与标签tag_id类似的标签
        List<RecommendedItem> recommendedItemList = recommender.recommendedBecause(userId, itemId, size);
        return recommendedItemList;

    }

这里为浏览某个分类,或者标签的人推荐与标签或者分类相似的标签或者分类

推荐结果

在这里插入图片描述
可以看到,这种将用户信息提前物化到csv文件中而不是访问数据库,的推荐还是非常快速的。
但是问题就是冷启动,当一个用户刚进入系统时是无法进行推荐的,会返回空值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 电影推荐系统是一种基于用户兴趣和行为数据的算法系统,它利用机器学习和数据挖掘等技术,分析用户的历史观影记录、评分和偏好,为用户推荐最适合他们的电影。 在Python项目实训中,我们可以使用Python编程语言和相关的库和工具,去构建一个电影推荐系统。首先,我们需要收集和整理电影数据集,包括电影的名称、分类、导演、演员、评分等信息。我们可以通过一些公开的电影数据库或者API来获取这些数据。 接下来,我们可以使用Python中的机器学习库(如scikit-learn)或深度学习库(如Tensorflow)来构建一个协同过滤推荐模型。协同过滤是一种常用的方法,它基于用户的行为数据,比如用户的历史观影记录和评分,来计算用户的电影相似性,并且根据其他用户的评分和观影记录,为用户生成个性化的电影推荐。 通过对电影数据进行特征工程和处理,我们可以使用Python的数据处理库(如pandas)来处理和清洗数据。然后,我们可以使用Python的数据可视化库(如matplotlib和seaborn)来对电影数据进行可视化分析,从而更好地理解数据的分布和规律。 最后,我们可以使用Python的Web开发框架(如Django)来构建一个用户交互界面,用户可以输入自己的偏好和历史观影记录,系统将根据这些信息提供个性化的电影推荐结果。 通过Python项目实训,我们可以学习和实践推荐系统的建模和算法。同时,我们也可以学习和应用Python在数据处理、可视化和Web开发等方面的能力,这对于我们日后的职业发展非常有帮助。 ### 回答2: 电影推荐系统是一种利用机器学习和数据分析技术来为用户提供个性化电影推荐的应用程序。Python项目实训中,我们可以通过以下步骤来开发电影推荐系统。 首先,我们需要收集和准备电影数据集。可以从公开数据集或者电影数据库中获取电影信息,如电影名称、类型、导演、演员和用户评分等。将这些数据导入到Python环境中进行分析和处理。 接下来,我们可以使用机器学习技术来建立推荐算法模型。常见的推荐算法包括协同过滤、基于内容的推荐和深度学习等。可以使用Python库如scikit-learn或者Keras来实现这些算法。 在建立推荐模型之后,我们可以利用该模型为用户生成个性化推荐列表。根据用户的历史行为和偏好,系统可以分析相似用户或者相似电影,并推荐用户可能喜欢的电影。可以使用Python的pandas和numpy库来对数据进行处理和计算。 最后,我们还可以通过用户反馈和评价对推荐系统进行评估和优化。根据用户的反馈,可以调整推荐算法的参数或者引入其他技术来提高推荐的准确性和用户满意度。 总结来说,Python项目实训中的电影推荐系统主要包括数据收集、数据处理、推荐算法建模和用户反馈评估等步骤。通过Python的机器学习和数据分析技术,可以开发出一个个性化、准确度高的电影推荐系统。 ### 回答3: 电影推荐系统是基于Python语言进行开发的一个项目实训项目。该系统的主要目的是根据用户的喜好和观影记录,推荐符合用户口味的电影。 在实现该系统时,首先需要收集电影的相关数据。可以使用爬虫技术从互联网上获取电影的信息,比如电影的名称、导演、演员、类型、时长、评分等。获取到的数据可以存储在数据库中,以便后续使用。 接下来,需要设计一个算法来进行电影的推荐。常用的算法有基于内容的推荐算法和协同过滤推荐算法。基于内容的推荐算法是根据电影的特征,比如类型、导演、演员等,来推荐类似的电影给用户。而协同过滤推荐算法是根据用户的观影历史和其他用户的行为数据,找出相似的用户,并将相似用户喜欢的电影推荐给当前用户。 在系统实现过程中,还可以考虑引入机器学习的算法,比如深度学习和自然语言处理等技术,来提升推荐的准确性和个性化程度。 最后,在界面设计方面,可以使用Python的GUI库,比如Tkinter或PyQt等,来实现一个友好的用户界面,使用户能够方便地输入自己的喜好和查看系统推荐的电影。 该项目的实施可以考虑以下步骤:需求分析、数据库设计、数据采集、算法选择与实现、界面设计与实现、系统测试与调试等。 通过这个项目实训,可以提高学生的Python编程能力,了解数据获取和处理的方法,熟悉算法的选择和实现,掌握界面设计和用户交互的技术,培养系统分析和设计的能力,进一步提升学生的综合实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值