Loading... 这里我们使用SpringBoot项目,首先,需要在你的 Java 项目中添加 Apache Mahout 的依赖。如果项目是一个 Maven 项目,你可以在你的 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.mahout</groupId> <artifactId>mahout-core</artifactId> <version>0.13.0</version> </dependency> ``` <div class="tab-container post_tab box-shadow-wrap-lg"> <ul class="nav no-padder b-b scroll-hide" role="tablist"> <li class='nav-item active' role="presentation"><a class='nav-link active' style="" data-toggle="tab" aria-controls='tabs-d7a22c254f175c1c3da470af77d75091440' role="tab" data-target='#tabs-d7a22c254f175c1c3da470af77d75091440'>导入外部文件方式</a></li><li class='nav-item ' role="presentation"><a class='nav-link ' style="" data-toggle="tab" aria-controls='tabs-9833ab5b69818f6ca6b2c16d26a18950671' role="tab" data-target='#tabs-9833ab5b69818f6ca6b2c16d26a18950671'>查询数据库方式</a></li> </ul> <div class="tab-content no-border"> <div role="tabpanel" id='tabs-d7a22c254f175c1c3da470af77d75091440' class="tab-pane fade active in"> 假设我们有如下的用户评价数据(CSV格式): ``` 用户ID,零食ID,评价分数 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,104,5.0 2,105,2.0 3,107,4.5 3,108,4.0 3,109,4.0 ``` 在你的项目中,你需要先将这些数据导入到一个`DataModel`对象中: ```java DataModel model = new FileDataModel(new File("path/to/your/data.csv")); ``` 然后,你可以使用皮尔逊相关系数作为相似度度量: ```java UserSimilarity similarity = new PearsonCorrelationSimilarity(model); ``` 接下来,你可以选择每个用户的3个最近邻居: ```java UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, model); ``` 然后,你可以创建一个推荐引擎对象: ```java Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); ``` 现在,你可以为用户1生成3个推荐: ```java List<RecommendedItem> recommendations = recommender.recommend(1, 3); ``` 这将返回一个包含3个`RecommendedItem`的列表。每个`RecommendedItem`都包含一个零食ID和一个评价分数,这个分数表示推荐引擎认为用户对这个零食的预期评价。 ```java for (RecommendedItem recommendation : recommendations) { System.out.println("零食ID: " + recommendation.getItemID() + ", 预期评价: " + recommendation.getValue()); } ``` 这段代码将打印出如下的推荐结果: ```java 零食ID: 104, 预期评价: 4.75 零食ID: 107, 预期评价: 4.5 零食ID: 105, 预期评价: 4.25 ``` 这就是用户1的推荐结果。请注意,这只是一个示例,实际的推荐结果将根据你的数据而变化。 </div><div role="tabpanel" id='tabs-9833ab5b69818f6ca6b2c16d26a18950671' class="tab-pane fade "> 原始数据库: <div class="hideContent">此处内容需要评论回复后(审核通过)方可阅读。</div> ## 导入依赖 在 Spring Boot 项目中,可以使用 MyBatis 来操作数据库。首先,我们添加 MyBatis 和 MySQL 的依赖。在你的 pom.xml 文件中添加以下代码: ```xml <dependencies> <!-- Spring Boot Starters --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> </dependencies> ``` 然后,在 application.yaml中配置 MySQL 和 MyBatis 的相关属性 ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test_db username: root password: root driver-class-name: com.mysql.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.yourpackage.model ``` 创建一个映射文件,在 resources/mapper 目录下创建 RatingMapper.xml 文件,写入以下内容: ```xml <mapper namespace="com.yourpackage.mapper.RatingMapper"> <select id="getAllRatings" resultType="com.yourpackage.model.Rating"> SELECT * FROM ratings </select> </mapper> ``` 创建对应的 Mapper 类和 Model 类,例如在 com.yourpackage.mapper 包下创建 RatingMapper.java: ```java package com.yourpackage.mapper; import com.yourpackage.model.Rating; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface RatingMapper { @Select("SELECT * FROM ratings") List<Rating> getAllRatings(); } ``` 在 com.yourpackage.model 包下创建 Rating.java: ```java package com.yourpackage.model; public class Rating { private int userId; private int snackId; private float rating; // getters and setters ... } ``` 在 Service 中使用这个 Mapper: ```java package com.yourpackage.service; import com.yourpackage.mapper.RatingMapper; import com.yourpackage.model.Rating; import org.springframework.stereotype.Service; import java.util.List; @Service public class RatingService { private final RatingMapper ratingMapper; public RatingService(RatingMapper ratingMapper) { this.ratingMapper = ratingMapper; } public List<Rating> getAllRatings() { return ratingMapper.getAllRatings(); } } ``` 这样你就可以在 Service 中获取所有的评价数据了。然后可以将这些数据转化为 Mahout 需要的格式,然后创建推荐引擎。 ## 自定义DataModel 当你从数据库中获取数据后,你需要将数据转换为 Mahout 可以理解的格式。这个可以通过创建一个自定义的 `DataModel` 来完成。由于 Mahout 不提供直接从内存中加载数据的 `DataModel`,我们需要自己创建一个。 下面是一个示例,展示了如何创建一个从 List 中加载数据的自定义 `DataModel`: ```java import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.common.FastByIDMap; import org.apache.mahout.cf.taste.impl.model.GenericDataModel; import org.apache.mahout.cf.taste.model.DataModel; import java.util.List; public class InMemoryDataModel implements DataModel { private final DataModel delegate; public InMemoryDataModel(List<Rating> ratings) { FastByIDMap<FastByIDMap<Float>> data = new FastByIDMap<>(); for (Rating rating : ratings) { long userId = rating.getUserId(); long snackId = rating.getSnackId(); float score = rating.getRating(); FastByIDMap<Float> userRatings = data.get(userId); if (userRatings == null) { userRatings = new FastByIDMap<>(); data.put(userId, userRatings); } userRatings.put(snackId, score); } delegate = new GenericDataModel(GenericDataModel.toDataMap(data, true)); } // delegate all other DataModel methods to `delegate` // ... } ``` 在这个类中,我们使用了 `FastByIDMap` 来存储评价数据。这是 Mahout 提供的一个用于快速查找的数据结构,与 Java 中的 Map 类似,但使用 primitive 类型的 key,因此更为高效。 然后,你可以在你的 Service 中使用这个 `InMemoryDataModel` 来创建推荐引擎: ```java List<Rating> ratings = ratingService.getAllRatings(); DataModel model = new InMemoryDataModel(ratings); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, model); Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); List<RecommendedItem> recommendations = recommender.recommend(1, 3); for (RecommendedItem recommendation : recommendations) { System.out.println("零食ID: " + recommendation.getItemID() + ", 预期评价: " + recommendation.getValue()); } ``` 这样,就可以在 Spring Boot 项目中使用 Mahout 生成推荐了。 </div> </div> </div> `DataModel` 是 Apache Mahout 推荐系统 API 中的一个接口,它被设计为对应用程序中的数据提供通用的抽象。这个接口的实现负责加载数据,以及提供给推荐引擎所需的数据访问方法。 Mahout 提供了一些预定义的 `DataModel` 实现,这些实现可以处理不同格式的数据。例如,`FileDataModel` 可以处理 CSV 格式的文件,`MySQLJDBCDataModel` 可以处理存储在 MySQL 数据库中的数据。这些预定义的实现对于大多数常见的数据源和数据格式都足够使用。 然而,如果你的数据源或数据格式非常特殊,你可能需要自定义一个 `DataModel` 的实现。你可以继承 `AbstractDataModel` 类来实现你自己的 `DataModel`,然后实现其中的方法以适应你的数据源和数据格式。 在上面的例子中,我使用了 `FileDataModel` 来处理 CSV 格式的文件。这个文件每一行包含三个字段:用户ID、零食ID、评价分数。这是一种非常常见的数据格式,所以你可以直接使用 `FileDataModel`,而不需要自定义 `DataModel`。 这是一个例子,假设你的数据文件路径是 "path/to/data.csv",你可以这样创建一个 `FileDataModel`: ```java DataModel model = new FileDataModel(new File("path/to/data.csv")); ``` 这样,`model` 对象就可以提供给推荐引擎访问你的数据了。 最后修改:2023 年 05 月 23 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏