您好,登錄后才能下訂單哦!
這篇文章主要介紹了spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
/** * 協同過濾算法,基于余弦相似度的用戶相似度計算 * 一般來說歐幾里得相似度用來表現不同目標的絕對差異性,分析目標之間的相似性與差異情況. * 而余弦相似度更多的是對目標從前進趨勢上進行區分. */ 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)) }) } }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。