推薦系統
面對海量的數據信息,從中快速推薦出符合用戶特點、是用戶感興趣的物品
推薦算法分類
1 基于人口統計學的推薦
2 基于內容的推薦
3 基于協同過濾的推薦
4 混合推薦
基于人口統計學的推薦
截屏2020-09-08 下午11.49.12.png
基于內容的推薦
截屏2020-09-08 下午11.50.45.png
基于協同過濾的推薦(是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶感興趣的信息)
1 基于近鄰的協同過濾(基于用戶、基于物品)
2 基于模型的協同過濾(奇異值分解(SVD)、潛在語義分析(LSA)、支撐向量機(SVM))
-
1 基于用戶的協同過濾(基于用戶、基于物品)
截屏2020-09-08 下午11.54.09.png -
2 基于物品的協同過濾
截屏2020-09-08 下午11.55.11.png
Apache Mahout是基于Lambda架構,基于計算引擎(MapReduce/Spark/Flink?H2O)開發的機器學習和數據挖掘的分布式框架, 分布式線性代數框架,旨在快速實現自己的算法,支持多個分布式后端。
截屏2020-09-10 上午9.25.19.png
Mahout實現了常用的數據挖掘算法,包括聚類算法、回歸算法、余玄相似性、分類算法、推薦過濾、頻繁子項挖掘
- 個性化推薦系統實現步驟
1 獲取用戶畫像
2 構建數據模型
3 將原始數據映射到Mahout定義的Data Model中
DataModel(基于內存)
GenericBooleanPrefDataModel(基于內存)
FileDataModel(基于文件)
JDBCDataModel(基于數據庫)
4 調優推薦組件(相似度組件、臨界關系組件、推薦算法等)
5 推薦模型評估
- 代碼實現
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-math</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-examples</artifactId>
<version>${mahout.version}</version>
</dependency>
1 用戶相似度模型
/**
* LogLikelihoodSimilarity 對數似然相似度
* TanimotoCoefficientSimilarity 谷本系數相似度
* CityBlockSimilarity 曼哈頓距離相似度
* SpearmanCorrelationSimilarity Spearman秩相關系數
* UncenteredCosineSimilarity 余弦相似度
* EuclideanDistanceSimilarity 歐幾里得距離相似度
* PearsonCorrelationSimilarity 皮爾遜相關系數相似度
* */
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
2 構建近鄰對象 threshold 是相似閾值 這個數值越高 推薦精準越高 但是推薦的數據也越少 最高為 給用戶設置的喜好值最高值
/**
* ThresholdUserNeighborhood 對每個用戶基于一定的限制,相似度限制內的所有用戶為鄰居
* NearestNUserNeighborhood 對每個用戶取固定數量 N 的最近鄰居
* */
float threshold = 0f;
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(threshold, userSimilarity, dataModel);
3 構建推薦器
/**
* GenericUserBasedRecommender 基于用戶相似度
* GenericItemBasedRecommender 基于item相似度
* SlopeOneRecommender 基于SlopeOne算法
* SVDRecommender 基于支持向量機
* KnnItemBasedRecommender 基于相似用戶的實現
* TreeClusteringRecommender 基于樹形聚類的推薦算法
* */
UserBasedRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity);
// 給用戶4推薦10個相似數據
List<RecommendedItem> recommend = recommender.recommend(4, 10);
for (RecommendedItem recommendedItem : recommend) {
System.out.println(recommendedItem);
}
4 結果輸出
try(PrintWriter writer = new PrintWriter(resultFile)){
for (int userID=1; userID <= model.getNumUsers(); userID++){
List<RecommendedItem> recommendedItems = recommender.recommend(userID, 2);
String line = userID+" : ";
for (RecommendedItem recommendedItem: recommendedItems){
line += recommendedItem.getItemID()+":"+recommendedItem.getValue()+",";
}
if (line.endsWith(",")){
line = line.substring(0, line.length()-1);
}
writer.write(line);
writer.write('\n');
}
} catch (IOException ioe){
resultFile.delete();
throw ioe;
}
5 推薦模型評估
//參數0.9表示每個用戶訓練集為90%,1.0代表所有的用戶來參與評估
// 0。75 預測評分為5的話,實際為 5 - 0.75
// 結果值越小與實際值越相似
double score = evaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
System.out.println("均方差:"+score);
double rmse = recommenderEvaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
System.out.println("均方根誤差:"+rmse);
相似度算法分析
歐式距離
歐幾里得度量(euclidean metric)(也稱歐氏距離)是一個通常采用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離
場景:適合于特征數據量較小的情況
截屏2020-09-10 下午2.01.35.png
歐式距離相似度EuclideanDistanceSimilarity
原理:利用歐式距離d定義的相似度s,s=1 / (1+d)。
范圍:[0,1],值越大,說明d越小,也就是距離越近,則相似度越大。
曼哈頓距離
同歐式距離相似,都是用于多維數據空間距離的測度。
兩個點在標準坐標系上的絕對軸距總和
應用場景:主要應用場景,如棋盤、城市里兩個點之間的距離等
截屏2020-09-10 下午1.46.52.png
截屏2020-09-10 下午1.41.45.png
曼哈頓距離CityBlockSimilarity
范圍:[0,1],同歐式距離一致,值越小,說明距離值越大,相似度越大。
說明:比歐式距離計算量少,性能相對高。
余弦相似度
多維空間兩點與所設定的點形成夾角的余弦值。
余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"余弦相似性"。
應用場景:用余弦值衡量文本相似度,常用于文本識別,比如新聞的挖掘
舉例:
文本1中詞語a,b分別出現100,50次,向量表示為(100,50)
文本2中詞語a,b分別出現50,25次,向量表示為(50,25)
文本3中詞語a,b分別出現10,0次,向量表示為(10,0)
文本4中詞語a,b分別出現2,0次,向量表示為(2,0)
可以得知,1,2點向量平行(詞頻比例相同),
3,4點向量平行,那么是不是可以判斷1,2文本更相似,3,4文本更相似呢?
截屏2020-09-10 下午1.36.26.png
截屏2020-09-10 下午3.26.11.png
余弦相似度PearsonCorrelationSimilarityUncenteredCosineSimilarity
范圍:[-1,1],值越大,說明夾角越大,兩點相距就越遠,相似度就越小。
距離與余弦相似度區別:余弦相似度衡量的是維度間取值方向的一致性,注重維度之間的差異,不注重數值上的差異,而歐氏度量的正是數值上的差異性。
案例分析:如某T恤從100塊降到了50塊(A(100,50)),某西裝從1000塊降到了500塊(B(1000,500)),那么T恤和西裝都是降價了50%,兩者的價格變動趨勢一致,可以用余弦相似度衡量,即兩者有很高的變化趨勢相似度,但是從商品價格本身的角度來說,兩者相差了好幾百塊的差距,歐氏距離較大,即兩者有較低的價格相似度。
截屏2020-09-10 下午4.05.39.png
Pearson相關系數
是用來衡量兩個數據集合是否在一條線上面,它用來衡量定距變量間的線性關系。
這個相對于歐幾里德距離要復雜一點。它的一個好處是,當兩者對一件物品的評分差距較大時,并不一定兩者不想近,如果他兩對于其他的物品評價也有差距,但是都是正相關,那兩者的相似度還是相近的。這個比歐幾里德距離準確。
場景:適合于特征數據量較大的情況(效果較好)
適用于A的評價普遍高于B的評價
截屏2020-09-10 下午3.19.35.png
它是存在一條擬合線的,這條線盡量靠近所有點,結果也是求所有點和這條線的擬合程度。皮爾遜相關度評價算法首先會找出兩位評論者都曾評論過的物品,然后計算兩者的評分總和與平方和,并求得評分的乘積之和。最后,算法利用這些計算結果計算出皮爾遜相關度。
截屏2020-09-10 下午3.03.21.png
公式定義為: 兩個連續變量(X,Y)的pearson相關性系數(Px,y)等于它們之間的協方差cov(X,Y)除以它們各自標準差的乘積(σX,σY)。系數的取值總是在-1.0到1.0之間,接近0的變量被成為無相關性,接近1或者-1被稱為具有強相關性。
皮爾森相關度 PearsonCorrelationSimilarity
范圍:[-1,1],絕對值越大,說明相關性越強,負相關對于推薦的意義小。
Tanimoto 固本系數
這是一個計算交集和并集的比率的方法
度量兩個集合之間的相似程度的方法。
應用場景:比較文本相似度,用于文本查重與去重;計算對象間距離,用于數據聚類等
A=[1,2,3,4] 列表長度:4
B=[1,2,7] 列表長度:3
C = A & B = [1,2] 列表長度:2
T = Nc / ( Na + Nb -Nc) = len(c) / ( len(a) + len(b) - len(c)) = 2 / (4+3-2) = 0.4
可以用戶計算用戶之間的相似程度,這種方法適用于:數據表示為0、1這種二值化,而非有數量大小的情況
截屏2020-09-10 下午3.27.08.png
對數似然相似度:LogLikelihoodSimilarity
原理:重疊的個數,不重疊的個數,都沒有的個數
說明:處理無打分的偏好數據,比Tanimoto系數的計算方法更為智能。
對于事件A和事件B,我們考慮兩個事件發生的次數,具有如下矩陣
截屏2020-09-10 下午4.10.46.png