久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

spark mllib 協同過濾算法之如何實現基于余弦相似度的用戶相似度計算

170次閱讀
沒有評論

共計 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 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計2359字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 陇南市| 庆安县| 金溪县| 库尔勒市| 遵义市| 乌审旗| 出国| 田东县| 郓城县| 贺兰县| 陆良县| 青岛市| 福安市| 玉田县| 麻江县| 达孜县| 化隆| 会泽县| 辽中县| 博野县| 绍兴县| 泰顺县| 萨迦县| 济源市| 兴宁市| 麻江县| 祁门县| 科技| 钦州市| 武清区| 玉溪市| 武乡县| 黑水县| 常德市| 长葛市| 安宁市| 阿克苏市| 东乡族自治县| 普兰店市| 柳州市| 濮阳市|