雲音樂推薦系統(二):推薦系統的核心演算法

跳蛙pass發表於2020-11-11

一、召回階段

1.1基於熱門的召回

篩選使用者播放歌曲的行為資料,
選取播放次數最多的歌曲作為熱門歌曲,為每個使用者進行推薦

1.2基於使用者分群的召回

將使用者劃分為細粒度群體,為每一個使用者群體篩選歌
曲播放行為,選取每個群體中的熱門歌曲,為每一個
使用者進行推薦
可以使用KMeans等聚類演算法

1.3基於協同過濾的召回

二、協同過濾演算法(計算相似的一種方式)

2.1基於使用者(user-based)的協同過濾演算法

首先計算使用者與使用者之間的相似性,
然後再計算其他與目標相似的使用者對物品的評分來為目標使用者推薦

2.2基於物品的(item-based)的協同過濾演算法

與基於使用者的協同過濾演算法基本相似

2.3基於模型(model-based)的協同過濾演算法

SVD矩陣分解協同過濾演算法
LFM隱含語義協同過濾演算法
ALS交替最小二乘協同過濾演算法

三、協同過濾

依賴使用者行為資料
分析使用者行為資料,求出
使用者與使用者之間的相似度,進而通過相似度計算出使用者對所有物品的”感興趣程度”(user-based)
物品與物品之間的相似度,進而通過相似度計算出使用者對所有物品的”感興趣程度”(item-based)
中間矩陣,進而通過中間矩陣計算出使用者對所有物品的”感興趣程度”(model-based)

四、基於使用者的協同過濾

在這裡插入圖片描述
根據使用者行為資料,獲取使用者對物品的喜歡程度評分,同時使用者無法對所有物品都進行評分,最終可組織成一個使用者-物品稀疏矩陣
在這裡插入圖片描述
計算使用者之間的相似程度,通過使用者向量,按照餘弦相似度公式進行求解
在這裡插入圖片描述在s插入圖片描述
上面是向量點積
在這裡插入圖片描述
上面是是向量的模積

將使用者一看出一個向量u1=[4.5,3,3.5,0,4,0];
將使用者二看成一個向量u2=[0,4.5,5,0,0,4,0];
使用者沒有對物品進行評分回預設為0,但是可以對預設的沒有評分的物品用平均數代替

餘弦相似度的scala程式碼實現:

object cosine_similarity {

  //向量的模
  def module(vec: Vector[Double]) = {
    math.sqrt(vec.map(math.pow(_, 2)).sum)
  }
  //向量的點積
  def innerProduct(v1: Vector[Double], v2: Vector[Double]) = {
    val listBuffer = ListBuffer[Double]()
    for (i <- 0 until v1.length; j <- 0 to v2.length; if i == j) {
      if (i == j) listBuffer.append(v1(i) * v2(j))
    }
    listBuffer.sum
  }

  def cosvec(v1: Vector[Double], v2: Vector[Double]) = {
    val cos = innerProduct(v1, v2) / (module(v1) * module(v2))
    if (cos <= 1) cos else 1.0
  }

  def main(args: Array[String]): Unit = {
    var vec1 = Vector(4.5, 3, 3.5, 0, 4, 0, 0)
    var vec2 = Vector(0, 4.5, 5, 0, 0, 4, 0)
    var similarity = cosvec(vec1,vec2)
    println("vec1與vec2的餘弦相似度為:")
    println(similarity)
  }
}

使用餘弦相似度構造使用者-使用者相似度矩陣
求解使用者兩兩之間的相似度,可以得到如下相似度矩陣
在這裡插入圖片描述
為目標使用者推薦物品時,選取與目標使用者最相似的前K個使用者,選取目標使用者沒有進行過評分的物品n,將K個相似使用者對n個物品的評分進行加權,認為該評分為目標使用者對n個物品的預測評分
在這裡插入圖片描述

	sim(u,v)表示目標使用者與使用者的相似性,
	R(vi)表示使用者對商品的真實評分

使用者1對商品預測評分
=(sim(使用者1,使用者2)*使用者2對該商品的真實評分+sim(使用者1,使用者3)*使用者3對該商品的真實評分+sim(使用者1,使用者4)*使用者4對該商品的真實評分)/(sim(使用者1,使用者2)+sim(使用者1,使用者3)+sim(使用者1,使用者4))

最後對n個物品預測評分進行倒排,優先推薦

協同過濾實際是通過分析使用者行為資料,對原始user-item稀疏矩陣進行”填充”的過程
在這裡插入圖片描述

五、ALS(交替最小二乘法)

ALS演算法是2008年以來,用的比較多的協同過濾演算法,它已經整合到Spark的Mllib庫中,從協同過濾的分類來說,它屬於基於模型的協同過濾,它的核心思想同樣是對User-Item稀疏矩陣進行”填充”,從而獲得User對所有Item的感興趣程度

5.1 ALS原理

假設有一批使用者行為資料,其中包含m個User和n個Item,構建User-Item矩陣(稀疏矩陣),其中的元素表示第u個User對第i個Item的評分
藍色為已經評分
灰色為未評分
在這裡插入圖片描述
ALS會將User-Item矩陣分解為兩個矩陣:User-Embedding_K矩陣和Embedding_K-Item矩陣(Embedding_K是超引數,自己設定),兩個矩陣相乘能剛好得到User-Item矩陣
在這裡插入圖片描述
將User-Item稀疏矩陣中藍色的值作為訓練集,User-Embedding,Embedding-Item矩陣為稠密矩陣,並且矩陣中所有的值都在機器學習任務中當作引數,需要通過機器學習訓練得出,損失函式由User-Embedding,Embedding-Item矩陣的點積和訓練集的值求RMSE得出,優化方法使用ALS交替最小二乘法進行損失函式優化,最終求得User-Embedding,Embedding-Item矩陣,這樣就可以得到稠密的User-Item矩陣

六、協同過濾的“評分策略”

User-item矩陣的評分是主觀設定
專案中的設定為:

播放=>1分,下載=>2分,分享=>3分,收藏=>4分
最終在全域性做一次評分歸一化得出最終評分(將總得分處理到0~1之間)
通常評分策略由懂業務、模型開發、專案經理等人蔘與制定
調整評分策略是優化召回演算法的一個非常重要的途徑

相關文章