基于mahout的协同过滤推荐算法实现

    科技2025-06-08  6

    1、简述项目架构

     项目主要实现了基于mahout开源项目实现了协同过滤算法,用java常见的ssm框架搭建,完成了对于用户喜欢的电影进行推荐。

    采取MVC模式将业务逻辑、数据、界面显示分离的方法组织代码,recommender层主要才推荐算法的实现。数据库采用的是mysql。

    环境部署:

    idea,Tomcat7.9(版本差距不大应该都没问题),mysql5.7,jdk1.8

    2、数据库建立和数据导入

    CREATE DATABASE movie; USE movie; CREATE TABLE movies ( // 保存电影相关的信息。 id INTEGER NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL, published_year varchar(4) default NULL, type varchar(100) default NULL, PRIMARY KEY (id) ); CREATE TABLE movie_preferences ( // 保存用户对电影的评分,即喜好程度 userID INTEGER NOT NULL, movieID INTEGER NOT NULL, preference INTEGER NOT NULL DEFAULT 0, timestamp INTEGER not null default 0, FOREIGN KEY (movieID) REFERENCES movies(id) ON DELETE CASCADE );

    导入数据(时间可能有点长,等着就行):

    LOAD DATA LOCAL INFILE 'C:\\Users\\LPH\\Desktop\\ml-1m\\ml-1m\\movies.dat' INTO TABLE movies_preferences FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' (userID, movieID,preference,timestamp);

    3、基于用户的协同过滤实现

    主要分为四步:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎

    详细原理需要自己详细去看。

    DataModel model = MyDataModel.mydataModel();//构造数据模型 //http://www.cnphp6.com/archives/84955 //曼哈顿相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.CityBlockSimilarity(model); //欧几里德相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity(model); //对数似然相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.LogLikelihoodSimilarity(model); //斯皮尔曼相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.SpearmanCorrelationSimilarity(model); //Tanimoto 相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.TanimotoCoefficientSimilarity(model) //Cosine相似度 //UserSimilarity similarity = new org.apache.mahout.cf.taste.impl.similarity.UncenteredCosineSimilarity(); UserSimilarity similarity = new PearsonCorrelationSimilarity(model);//用PearsonCorrelation 算法计算用户相似度 //计算用户的“邻居”,这里将与该用户最近距离为 3 的用户设置为该用户的“邻居”。 UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, model); //采用 CachingRecommender 为 RecommendationItem 进行缓存 Recommender recommender = new CachingRecommender(new GenericUserBasedRecommender(model, neighborhood, similarity)); //得到推荐的结果,size是推荐结果的数目 recommendations = recommender.recommend(userID, size);

    4、结果展示

    根据兴趣度最接近的用户,推荐三部电影

    5、代码及数据

    https://github.com/byr068/ssm

    结尾:

    欢迎要实现基于知识图谱的推荐算法实现的小伙伴来叨扰,欢迎代码及原理级别的交流,仅限java,水平不高哈,不要介意。

    Processed: 0.010, SQL: 8