基于物品的协同过滤算法简单实战应用

📅 发布时间:2026/7/6 1:54:59 👁️ 浏览次数:
基于物品的协同过滤算法简单实战应用
目录前言此文章就不介绍推荐算法内部逻辑了重在实现一、数据库设计二、代码实现1.基于物品的协同过滤算法实现智能推荐2.结果总结前言提示此文章作为实际开发过程中的文档记录下面案例仅供参考随着业务的不断扩展需要一些个性化的功能来增加亮点本章介绍了个性化功能之一的推荐功能。 使用基于物品的协同过滤算法来实现推荐功能。此文章就不介绍推荐算法内部逻辑了重在实现一、数据库设计直接先上数据库字段名称IDIDUSER_ID用户IDITEM_ID物品IDPREFERENCE偏好值这是最基本的格式只需要USER_IDITEM_IDPREFERENCE这三个字段就可以实现行为数据存储。这里的ITEM_ID为实际需要推荐对象的唯一键当然也可以根据实际业务加上需要的字段比如时间。下面是数据准备可以作为测试数据USER_IDITEM_IDPREFERENCECRT_TIMEID14431854689698652162.52024-06-21 12:37:59576139542714068993144497619852462080032024-06-21 12:38:12576139597470707713151020216868433510452024-06-21 13:03:0057613618391123148915732583516366479360.12024-08-12 13:52:115950023845316648962660242226146836483170791528048721920.32024-08-09 11:25:495938767024854917132660242226146836484188453329499791360.32024-08-09 11:53:0659388277244029747326602422261468364843297967298630860822024-06-21 12:40:0457614006701884620926602422261468364844318546896986521652024-06-21 12:43:5912660242226146836484449761985246208002.52024-06-21 12:39:1857613987617381990526602422261468364851020216868433510422024-06-21 12:39:0757613982908436889732435438752215859241055458199229644852024-06-21 12:49:1457614208693273804932435438752215859243297967298630860842024-06-21 12:47:1423243543875221585925102021686843351042.52024-06-21 12:46:405761417287265935373243543875221585925347956025521807364.52024-06-21 12:47:32340514538776041881941128743411596083242024-06-21 12:57:211140514538776041881943297967298630860842024-06-21 12:55:59940514538776041881944318546896986521622024-06-21 12:55:37840514538776041881944497619852462080032024-06-21 12:55:07740514538776041881951020216868433510442024-06-21 12:54:3364051453877604188195347956025521807363.52024-06-21 12:56:301040514538943394611441128743411596083242024-06-21 12:51:2157614290866400051340514538943394611443297967298630860832024-06-21 12:50:5354051453894339461144431854689698652164.52024-06-21 12:50:3344051453894339461145102021686843351045二、代码实现提示代码实现只展示获取推荐数据的业务层保存逻辑就正常存到数据库就行1.基于物品的协同过滤算法实现智能推荐代码如下示例/** * 基于物品的协同过滤算法实现智能推荐(知识) * * param username 用户账号 * return 结果 * throws ClassNotFoundException 异常 * throws TasteException 异常 */publicListStringgetAiItemSimilarityRecommendKw(Stringusername){try{StringuserStringIdadminFeign.getUserIdByUserName(username).getData();if(StringUtils.isEmpty(userStringId)){returnnewArrayList();}LonguserIdLong.parseLong(userStringId);returnaiRecommendUtil.aiItemSimilarityRecommendKw(userId,5);}catch(Exceptione){log.info(获取智能推荐数据失败---{},e.getMessage());returnnewArrayList();}}/** * 基于物品的协同过滤算法实现智能推荐(知识) * * param userId 用户id * param howMany 推荐数量 * return * throws ClassNotFoundException 异常 * throws SQLException * throws TasteException */publicListStringaiItemSimilarityRecommendKw(LonguserId,IntegerhowMany)throwsClassNotFoundException,SQLException,TasteException{Class.forName(aiRecommendClassName);MysqlDataSourcedataSourcenewMysqlDataSource();dataSource.setServerName(aiRecommendServiceName);//本地为localhostdataSource.setUser(user);dataSource.setPassword(password);dataSource.setDatabaseName(databaseName);dataSource.setUseSSL(false);JDBCDataModeldataModelnewMySQLJDBCDataModel(dataSource,ai_recommend_kw,USER_ID,ITEM_ID,PREFERENCE,null);// 用ReloadFromJDBCDataModel包装一层提高推荐性能ReloadFromJDBCDataModelreloadFromJDBCDataModelnewReloadFromJDBCDataModel(dataModel);// 计算物品相似度ItemSimilaritycachingSimilaritynull;try{ItemSimilaritysimilaritynewPearsonCorrelationSimilarity(reloadFromJDBCDataModel);// 使用CachingItemSimilarity包装物品相似度计算器cachingSimilaritynewCachingItemSimilarity(similarity,reloadFromJDBCDataModel);}catch(TasteExceptione){e.printStackTrace();}// 构建推荐引擎GenericItemBasedRecommenderrecommendernewGenericItemBasedRecommender(reloadFromJDBCDataModel,cachingSimilarity);// 给用户userId推荐howMany个物品ListRecommendedItemrecommendationsnull;try{recommendationsrecommender.recommend(userId,howMany);}catch(TasteExceptione){e.printStackTrace();}ListStringresultListnewArrayList();log.info(使用基于物品的协同过滤算法);if(CollectionUtils.isEmpty(recommendations)){returnnewArrayList();}for(RecommendedItemrecommendedItem:recommendations){resultList.add(String.valueOf(recommendedItem.getItemID()));log.info(推荐结果:{},recommendedItem);}returnresultList;}2.结果推荐结果:RecommendedItem[item:548948167409598464,value:2.7]推荐结果:RecommendedItem[item:483350820622897152,value:1.6]推荐结果:RecommendedItem[item:601551980415238144,value:1.6]推荐结果:RecommendedItem[item:601556963080671232,value:1.6]推荐结果:RecommendedItem[item:454377148632952832,value:1.4]总结由上述操作就能实现一个非常简单的推荐功能但如果得到一个完善的推荐功能还远远不够。