網站如何做前后端分離百度接單平臺
加權推薦算法
文章目錄
- 加權推薦算法
- 1.推薦算法的簡單介紹
- 2.加權推薦算法詳細介紹
- 3.代碼實現(xiàn)
- 4.總結
1.推薦算法的簡單介紹
眾所周知,推薦算法有很多種,例如:
1.加權推薦:分為簡單的特征加權,以及復雜的混合加權。主要是將特征以權重進行計算總和,排序出前幾名的數(shù)據(jù),即最符合條件的數(shù)據(jù),推薦給用戶。
2.內容基推薦:這種方法基于物品的特征。系統(tǒng)會分析用戶過去喜歡的物品特征,然后找到具有類似特征的其他物品推薦給用戶。這種方法依賴于對物品內容的深入理解,比如文本、圖像或音頻特征。
比如我想買【華為手機】,但是系統(tǒng)中關于華為手機的商品很少,在用戶繼續(xù)瀏覽的過程中,就會根據(jù)華為手機屬于【手機】類的這個特征,推薦其他【手機】類型的商品。
3.協(xié)同過濾推薦:分為物品基協(xié)同過濾和用戶基協(xié)同過濾。
簡單描述一下【用戶基協(xié)同過濾】。
如果一個用戶A喜歡某個物品,那么這個系統(tǒng)會找到與用戶A相似的其他用戶B,然后將B喜歡的、A還未接觸的物品推薦給A。
2.加權推薦算法詳細介紹
本次探討的就是簡單的特征加權,以留學申請為例簡單描述一下:
比如留學申請的過程中中有幾個重要特征參數(shù):所在國家、全球QS排名、專業(yè)。
那么當我想選擇:{英國,前10,計算機}
這樣的數(shù)據(jù)時,一般會怎么查呢?是不是精確查詢了?在數(shù)據(jù)庫中找到英國+QS前10+計算機
這樣的數(shù)據(jù)返回給用戶。
但是在面對數(shù)據(jù)較少的時候,顯示給用戶的數(shù)據(jù)就太少了,比如我上面展示的,只有2條數(shù)據(jù)符合要求。
那如果我想每次用戶搜索完成后,最少都要展示10條數(shù)據(jù)呢?
這樣就需要在精確搜索進行改進了,改為【特征加權推薦】,以國家、專業(yè)、QS排名三個為特征,設置權重,對數(shù)據(jù)庫中的數(shù)據(jù)進行計算,獲取前10個得分最高的數(shù)據(jù)展示。
這樣就可以推薦出用戶也“可能”喜歡的院校了,比如就推薦出了美國高校的計算機專業(yè)。
3.代碼實現(xiàn)
實現(xiàn)代碼示例如下:
加權推薦的算法部分
首先我們需要準備留學專業(yè)的java實體類。
package com.ride.system.domain;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ride.system.common.core.domain.BaseEntity;/*** 留學專業(yè)信息對象 sys_study_abroad**/
public class SysStudyAbroad extends BaseEntity
{private static final long serialVersionUID = 1L;/** 主鍵 */private Long studyAbroadId;/** 國家 */private String country;/** 專業(yè) */private String major;/** QS排名 */private String qs;// 推薦加權得分private Double score;public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}public String getQs() {return qs;}public void setQs(String qs) {this.qs = qs;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public SysMajor getMajor() {return major;}public void setMajor(SysMajor major) {this.major = major;}
}
接下來,編寫推薦算法的函數(shù)
/*** 加權平均推薦算法* @param userInput 用戶輸入* @param majors 留學專業(yè)列表,即數(shù)據(jù)庫中全部專業(yè)數(shù)據(jù)* @param weights 權重規(guī)則* @return*/
public static List<SysStudyAbroad> weightedRecommendation(SysStudyAbroad userInput, List<SysStudyAbroad> majors, Map<String, Double> weights) {List<SysStudyAbroad> recommendations = new ArrayList<>();for (SysStudyAbroad major : majors) {double score = 0;// 計算每個權重的得分// 如果滿足一個要求,則得1分,否則0分。double countrySimilarity = userInput.getCountry().equals(major.getCountry()) ? 1 : 0;double majorSimilarity = userInput.getMajor().equals(major.getMajor()) ? 1 : 0;double qsRankSimilarity = Math.abs(Integer.parseInt(userInput.getQs()) - Integer.parseInt(major.getQs())) >= 0 ? 1: 0;// 加權得分綜合score += weights.get("country") * countrySimilarity;score += weights.get("major") * majorSimilarity;score += weights.get("qsRank") * qsRankSimilarity;major.setScore(score);recommendations.add(major);}// 根據(jù)加權的得分進行推薦排序recommendations.sort((c1, c2) -> Double.compare(c2.getScore(), c1.getScore()));return recommendations;
}
在需要調用的地方進行調用
/*** 推薦留學專業(yè)信息列表** @param sysStudyAbroad 留學專業(yè)信息* @return 留學專業(yè)信息*/
@Override
public List<SysStudyAbroad> recommend(SysStudyAbroad sysStudyAbroad)
{// 查詢數(shù)據(jù)庫專業(yè)數(shù)據(jù)List<SysStudyAbroad> majors = sysStudyAbroadMapper.selectSysStudyAbroadListAll();//設置權重值,國家為0.3,專業(yè)為0.5,qs排名為0.2Map<String, Double> weights = new HashMap<>();weights.put("country", 0.3);weights.put("major", 0.5);weights.put("qsRank", 0.2);List<SysStudyAbroad> recommendations = weightedRecommendation(sysStudyAbroad, majors, weights);recommendations = recommendations.subList(0, Math.min(20, recommendations.size()));for (SysStudyAbroad major : recommendations) {System.out.println("國家: " + major.getCountry() + ", 專業(yè): " + major.getMajorId() + ", QS排名: " + major.getQs() + ",權重: " + major.getScore());}return recommendations;
}
用戶輸入如下
推薦結果如下
4.總結
特征加權推薦算法適用于在用戶條件的基礎上推薦額外的內容,適用于有2個特征以上的數(shù)據(jù)結構。
如有問題,歡迎評論區(qū)批評指正!??