SparkMLlib---基于余弦相似度的用户相似计算
来源:互联网 发布:淘宝发货清单软件 编辑:程序博客网 时间:2024/05/21 14:55
package mllibimport org.apache.log4j.{Level, Logger}import org.apache.spark.{SparkContext, SparkConf}import scala.collection.mutable.Map/** * Created by 汪本成 on 2016/8/4. */object UserSimilar { //屏蔽不必要的日志显示在终端上 Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF) //程序入口 val conf = new SparkConf().setMaster("local[1]").setAppName(this.getClass().getSimpleName().filter(!_.equals('$'))) println(this.getClass().getSimpleName().filter(!_.equals('$'))) val sc = new SparkContext(conf) //设置用户名 val users = sc.parallelize(Array("张三", "李四", "王五", "赵六", "阿七")) //设置电影名 val films = sc.parallelize(Array("逆战", "人间", "鬼屋", "西游记", "雪豹")) //使用一个source嵌套map作为姓名电影名和分值的存储 val source = Map[String, Map[String, Int]]() //设置一个用以存放电影分的map val filmSource = Map[String, Int]() 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) //返回嵌套map source } //两两计算分值,采用余弦相似性 def getCollaborateSource(user1: String, user2: String): Double = { //获得1,2两个用户的评分 val user1FilmSource = source.get(user1).get.values.toVector val user2FilmSource = source.get(user2).get.values.toVector //对公式部分分子进行计算 val member = user1FilmSource.zip(user2FilmSource).map(d => d._1 * d._2).reduce(_ + _).toDouble //求出分母第一个变量值 val temp1 = math.sqrt(user1FilmSource.map(num => {math.pow(num, 2)}).reduce(_ + _)) //求出分母第二个变量值 val temp2 = math.sqrt(user2FilmSource.map(num => {math.pow(num, 2)}).reduce(_ + _)) //求出分母 val denominator = temp1 * temp2 //进行计算 member / denominator } def main(args: Array[String]) { //初始化分数 getSource() val name1 = "张三" val name2 = "李四" val name3 = "王五" val name4 = "赵六" val name5 = "阿七" users.foreach(user => { println(name1 + " 相对于 " + user + " 的相似性分数是 " + getCollaborateSource(name1, user) ) }) println("--------------------------------------------------------------------------") users.foreach(user => { println(name2 + " 相对于 " + user + " 的相似性分数是 " + getCollaborateSource(name2, user) ) }) println("--------------------------------------------------------------------------") users.foreach(user => { println(name3 + " 相对于 " + user + " 的相似性分数是 " + getCollaborateSource(name3, user) ) }) println("--------------------------------------------------------------------------") users.foreach(user => { println(name4 + " 相对于 " + user + " 的相似性分数是 " + getCollaborateSource(name4, user) ) }) println("--------------------------------------------------------------------------") users.foreach(user => { println(name5 + " 相对于 " + user + " 的相似性分数是 " + getCollaborateSource(name5, user) ) }) }}
运行结果:
"C:\Program Files\Java\jdk1.8.0_77\bin\java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=D:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_77\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\rt.jar;G:\location\spark-mllib\out\production\spark-mllib;C:\Program Files (x86)\scala\lib\scala-actors-migration.jar;C:\Program Files (x86)\scala\lib\scala-actors.jar;C:\Program Files (x86)\scala\lib\scala-library.jar;C:\Program Files (x86)\scala\lib\scala-reflect.jar;C:\Program Files (x86)\scala\lib\scala-swing.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\datanucleus-api-jdo-3.2.6.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\datanucleus-core-3.2.10.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\datanucleus-rdbms-3.2.9.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\spark-1.6.1-yarn-shuffle.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\spark-assembly-1.6.1-hadoop2.6.0.jar;G:\home\download\spark-1.6.1-bin-hadoop2.6\lib\spark-examples-1.6.1-hadoop2.6.0.jar;D:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain mllib.CollaborativeFilteringSparkCollaborativeFilteringSparkUsing Spark's default log4j profile: org/apache/spark/log4j-defaults.propertiesSLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/G:/home/download/spark-1.6.1-bin-hadoop2.6/lib/spark-assembly-1.6.1-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: Found binding in [jar:file:/G:/home/download/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]16/08/04 20:41:49 INFO Slf4jLogger: Slf4jLogger started16/08/04 20:41:49 INFO Remoting: Starting remoting16/08/04 20:41:49 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkDriverActorSystem@192.168.1.100:8380]张三 相对于 张三 的相似性分数是 0.9999999999999999张三 相对于 李四 的相似性分数是 0.7089175569585667张三 相对于 王五 的相似性分数是 0.6055300708194983张三 相对于 赵六 的相似性分数是 0.564932682866032张三 相对于 阿七 的相似性分数是 0.8981462390204985--------------------------------------------------------------------------李四 相对于 张三 的相似性分数是 0.7089175569585667李四 相对于 李四 的相似性分数是 1.0000000000000002李四 相对于 王五 的相似性分数是 0.8780541105074453李四 相对于 赵六 的相似性分数是 0.6865554812287477李四 相对于 阿七 的相似性分数是 0.6821910402406466--------------------------------------------------------------------------王五 相对于 张三 的相似性分数是 0.6055300708194983王五 相对于 李四 的相似性分数是 0.8780541105074453王五 相对于 王五 的相似性分数是 1.0王五 相对于 赵六 的相似性分数是 0.7774630169639036王五 相对于 阿七 的相似性分数是 0.7416198487095662--------------------------------------------------------------------------赵六 相对于 张三 的相似性分数是 0.564932682866032赵六 相对于 李四 的相似性分数是 0.6865554812287477赵六 相对于 王五 的相似性分数是 0.7774630169639036赵六 相对于 赵六 的相似性分数是 1.0赵六 相对于 阿七 的相似性分数是 0.738024966423108--------------------------------------------------------------------------阿七 相对于 张三 的相似性分数是 0.8981462390204985阿七 相对于 李四 的相似性分数是 0.6821910402406466阿七 相对于 王五 的相似性分数是 0.7416198487095662阿七 相对于 赵六 的相似性分数是 0.738024966423108阿七 相对于 阿七 的相似性分数是 0.999999999999999816/08/04 20:41:51 INFO RemoteActorRefProvider$RemotingTerminator: Shutting down remote daemon.Process finished with exit code 0
1 0
- SparkMLlib---基于余弦相似度的用户相似计算
- SparkMLlib---基于余弦相似度的用户相似计算
- Python简单实现基于VSM的余弦相似度计算
- Python简单实现基于VSM的余弦相似度计算
- Python简单实现基于VSM的余弦相似度计算
- Python简单实现基于VSM的余弦相似度计算
- 基于向量余弦的文件相似度计算
- Python简单实现基于VSM的余弦相似度计算
- php利用余弦相似度计算文章的相似度
- Mahout基于余弦相似度的评估
- 余弦计算相似度度量
- 余弦计算相似度度量
- 余弦计算相似度度量
- 余弦计算相似度度量
- 余弦计算相似度度量
- 余弦定理的应用:基于文字的文本相似度计算
- tfidf算法+余弦相似度算法计算文本相似度
- 利用余弦相似度计算文本相似度
- 解密jQuery事件核心 - 委托设计(二)
- linux 线程 进程经典文章
- 剑指offer - 矩形覆盖
- CodeForces 627A XOR Equation
- Android中JNI的使用方法
- SparkMLlib---基于余弦相似度的用户相似计算
- MOngoDB写入图片
- iOS的一些个人总结
- 阿里直播平台的架构演进
- hdu 5793 2016 Multi-University Training Contest 6(快速幂+乘法逆元)
- 比较两个字符串中字符是否相等(变位词-anagram)?
- Android Studio下jni应用
- POJ 2778 DNA Sequence (AC 自动机+矩阵)
- 写给自己的......................