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