Spark怎样实现推荐系统中的相似度算法
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,Spark怎样实现推荐系统中的相似度算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在推荐系统中,协同过滤算法是应用较多的,具体又
千家信息网最后更新 2025年01月24日Spark怎样实现推荐系统中的相似度算法下面不介绍相关数学概念,主要给出常用的相似度算法代码实现,并且同一算法有多种实现方式。
欧几里得距离 皮尔逊相关系数
Spark怎样实现推荐系统中的相似度算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
在推荐系统中,协同过滤算法是应用较多的,具体又主要划分为基于用户和基于物品的协同过滤算法,核心点就是基于"一个人"或"一件物品",根据这个人或物品所具有的属性,比如对于人就是性别、年龄、工作、收入、喜好等,找出与这个人或物品相似的人或物,当然实际处理中参考的因子会复杂的多。
def euclidean2(v1: Vector, v2: Vector): Double = {
require(v1.size == v2.size, s"SimilarityAlgorithms:Vector dimensions do not match: Dim(v1)=${v1.size} and Dim(v2)" +
s"=${v2.size}.")
val x = v1.toArray
val y = v2.toArray
euclidean(x, y)
}
def euclidean(x: Array[Double], y: Array[Double]): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:Array length do not match: Len(x)=${x.length} and Len(y)" +
s"=${y.length}.")
math.sqrt(x.zip(y).map(p => p._1 - p._2).map(d => d * d).sum)
}
def euclidean(v1: Vector, v2: Vector): Double = {
val sqdist = Vectors.sqdist(v1, v2)
math.sqrt(sqdist)
}
def pearsonCorrelationSimilarity(arr1: Array[Double], arr2: Array[Double]): Double = {
require(arr1.length == arr2.length, s"SimilarityAlgorithms:Array length do not match: Len(x)=${arr1.length} and Len(y)" +
s"=${arr2.length}.")
val sum_vec1 = arr1.sum
val sum_vec2 = arr2.sum
val square_sum_vec1 = arr1.map(x => x * x).sum
val square_sum_vec2 = arr2.map(x => x * x).sum
val zipVec = arr1.zip(arr2)
val product = zipVec.map(x => x._1 * x._2).sum
val numerator = product - (sum_vec1 * sum_vec2 / arr1.length)
val dominator = math.pow((square_sum_vec1 - math.pow(sum_vec1, 2) / arr1.length) * (square_sum_vec2 - math.pow(sum_vec2, 2) / arr2.length), 0.5)
if (dominator == 0) Double.NaN else numerator / (dominator * 1.0)
}
余弦相似度
/** jblas实现余弦相似度 */
def cosineSimilarity(v1: DoubleMatrix, v2: DoubleMatrix): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:Array length do not match: Len(v1)=${x.length} and Len(v2)" +
s"=${y.length}.")
v1.dot(v2) / (v1.norm2() * v2.norm2())
}
def cosineSimilarity(v1: Vector, v2: Vector): Double = {
require(v1.size == v2.size, s"SimilarityAlgorithms:Vector dimensions do not match: Dim(v1)=${v1.size} and Dim(v2)" +
s"=${v2.size}.")
val x = v1.toArray
val y = v2.toArray
cosineSimilarity(x, y)
}
def cosineSimilarity(x: Array[Double], y: Array[Double]): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:Array length do not match: Len(x)=${x.length} and Len(y)" +
s"=${y.length}.")
val member = x.zip(y).map(d => d._1 * d._2).sum
val temp1 = math.sqrt(x.map(math.pow(_, 2)).sum)
val temp2 = math.sqrt(y.map(math.pow(_, 2)).sum)
val denominator = temp1 * temp2
if (denominator == 0) Double.NaN else member / (denominator * 1.0)
}
修正余弦相似度
def adjustedCosineSimJblas(x: DoubleMatrix, y: DoubleMatrix): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:DoubleMatrix length do not match: Len(x)=${x.length} and Len(y)" +
s"=${y.length}.")
val avg = (x.sum() + y.sum()) / (x.length + y.length)
val v1 = x.sub(avg)
val v2 = y.sub(avg)
v1.dot(v2) / (v1.norm2() * v2.norm2())
}
def adjustedCosineSimJblas(x: Array[Double], y: Array[Double]): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:Array length do not match: Len(x)=${x.length} and Len(y)" +
s"=${y.length}.")
val v1 = new DoubleMatrix(x)
val v2 = new DoubleMatrix(y)
adjustedCosineSimJblas(v1, v2)
}
def adjustedCosineSimilarity(v1: Vector, v2: Vector): Double = {
require(v1.size == v2.size, s"SimilarityAlgorithms:Vector dimensions do not match: Dim(v1)=${v1.size} and Dim(v2)" +
s"=${v2.size}.")
val x = v1.toArray
val y = v2.toArray
adjustedCosineSimilarity(x, y)
}
def adjustedCosineSimilarity(x: Array[Double], y: Array[Double]): Double = {
require(x.length == y.length, s"SimilarityAlgorithms:Array length do not match: Len(x)=${x.length} and Len(y)" +
s"=${y.length}.")
val avg = (x.sum + y.sum) / (x.length + y.length)
val member = x.map(_ - avg).zip(y.map(_ - avg)).map(d => d._1 * d._2).sum
val temp1 = math.sqrt(x.map(num => math.pow(num - avg, 2)).sum)
val temp2 = math.sqrt(y.map(num => math.pow(num - avg, 2)).sum)
val denominator = temp1 * temp2
if (denominator == 0) Double.NaN else member / (denominator * 1.0)
}
大家如果在实际业务处理中有相关需求,可以根据实际场景对上述代码进行优化或改造,当然很多算法框架提供的一些算法是对这些相似度算法的封装,底层还是依赖于这一套,也能帮助大家做更好的了解。比如Spark MLlib在KMeans算法实现中,底层对欧几里得距离的计算实现。
关于Spark怎样实现推荐系统中的相似度算法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
算法
相似
物品
系统
推荐
余弦
实际
问题
帮助
代码
就是
底层
更多
欧几
欧几里得
里得
处理
解答
复杂
易行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
转让网络安全运维的公司
四川网络安全大赛
北京质量软件开发推广
重庆代航网络技术
学习网络安全的技术
绍兴财务软件开发价格
软件开发及其模型的案例
简述电子商务数据库
服务器被新建管理员权限
作用串口服务器
万方数据库含金量如何
敦煌的软件开发
安乐社区宣传网络安全
java连接数据库用户名
网络安全进校园活动总结 小学
海淀区网络软件开发服务保障
护苗网络安全化
互联网科技进步 知乎
像素图形数据库
汇川技术软件开发好进吗
用户网络安全服务需求
数据库报433的错
数据库怎么打开bak文件
网络技术的解决方案
北京服务器租用哪个平台好云主机
提高做数据库的速度
动软 数据库
数据库中有无限时间
一台服务器三个域名
软件开发培训协议书范本