共計 2359 個字符,預計需要花費 6 分鐘才能閱讀完成。
行業資訊
服務器
云計算
spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算
這篇文章主要介紹了 spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
運行代碼如下
/**
* 協同過濾算法,基于余弦相似度的用戶相似度計算
* 一般來說歐幾里得相似度用來表現不同目標的絕對差異性,分析目標之間的相似性與差異情況.
* 而余弦相似度更多的是對目標從前進趨勢上進行區分.
*/
package spark.collaborativeFiltering
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.Map
object sparkCollaborativeFiltering { val conf = new SparkConf()
.setMaster(local)
.setAppName(CollaborativeFilteringSpark ) // 設置環境變量
val sc = new SparkContext(conf) // 實例化環境
val users = sc.parallelize( Array( 張三 , 李四 , 王五 , 朱六 , 卓七)
) // 設置用戶
val films = sc.parallelize( Array( 飄 , 龍門客棧 , 羅密歐與朱麗葉 , 澳門風云 , 狼圖騰)
) // 設置電影名
// 使用一個 source 嵌套 map 作為姓名電影名和分值的存儲
val source = Map[String,Map[String,Int]]()
val filmSource = Map[String,Int]()// 設置一個用以存放電影分的 map
def getSource(): Map[String,Map[String,Int]] = {// 設置電影評分
val user1FilmSource = Map( 飄 - 2, 龍門客棧 - 3,
羅密歐與朱麗葉 - 1, 澳門風云 - 0, 狼圖騰 - 1)
val user2FilmSource = Map( 飄 - 1, 龍門客棧 - 2,
羅密歐與朱麗葉 - 2, 澳門風云 - 1, 狼圖騰 - 4)
val user3FilmSource = Map( 飄 - 2, 龍門客棧 - 1,
羅密歐與朱麗葉 - 0, 澳門風云 - 1, 狼圖騰 - 4)
val user4FilmSource = Map( 飄 - 3, 龍門客棧 - 2,
羅密歐與朱麗葉 - 0, 澳門風云 - 5, 狼圖騰 - 3)
val user5FilmSource = Map( 飄 - 5, 龍門客棧 - 3,
羅密歐與朱麗葉 - 1, 澳門風云 - 1, 狼圖騰 - 2)
source += (張三 - user1FilmSource)// 對人名進行存儲
source += (李四 - user2FilmSource)
source += (王五 - user3FilmSource)
source += (朱六 - user4FilmSource)
source += (卓七 - user5FilmSource)
source // 返回嵌套 map
}
// 兩兩計算分值, 采用余弦相似性
def getCollaborateSource(user1:String,user2:String):Double = { val user1FilmSource = source.get(user1)
.get.values.toVector // 獲得第 1 個用戶的評分
val user2FilmSource = source.get(user2)
.get.values.toVector // 獲得第 2 個用戶的評分
val member = user1FilmSource.zip(user2FilmSource)
.map(d = d._1 * d._2).reduce(_ + _)
.toDouble// 對公式分子部分進行計算,zip 將若干 RDD 壓縮成一個 RDD
val temp1 = math.sqrt(user1FilmSource.map(num = { // 求出分母第 1 個變量值
math.pow(num,2) // 數學計算
}).reduce(_ + _)) // 進行疊加
val temp2 = math.sqrt(user2FilmSource.map(num = {// 求出分母第 2 個變量值
math.pow(num,2)// 數學計算
}).reduce(_ + _))// 進行疊加
val denominator = temp1 * temp2 // 求出分母
member / denominator// 進行計算
}
def main(args: Array[String]) { getSource() // 初始化分數
val name = 李四 // 設定目標對象
users.foreach(user = {// 迭代進行計算
println(name + 相對于 + user + 的相似性分數是:+
getCollaborateSource(name,user))
})
}
}
結果如圖
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!
正文完