当前位置:网站首页>[Spark]-LSH局部敏感哈希
[Spark]-LSH局部敏感哈希
2022-08-02 03:28:00 【Code_LT】
spark 自带LSH使用
官方介绍:支持距离:Jaccard
、欧几里德距离
import org.apache.spark.ml.feature.BucketedRandomProjectionLSH
import org.apache.spark.ml.linalg.Vectors
def embeddingLSH(spark:SparkSession, itemEmbMap:Map[String, Array[Float]]): Unit ={
val movieEmbSeq = itemEmbMap:Map.toSeq.map(item => (item._1, Vectors.dense(item._2.map(f => f.toDouble))))
val movieEmbDF = spark.createDataFrame(movieEmbSeq).toDF("itemId", "emb")
//LSH bucket model
val bucketProjectionLSH = new BucketedRandomProjectionLSH()
.setBucketLength(0.1)
.setNumHashTables(3)
.setInputCol("emb")
.setOutputCol("bucketId")
val bucketModel = bucketProjectionLSH.fit(movieEmbDF)
val embBucketResult = bucketModel.transform(movieEmbDF)
println("itemId, emb, bucketId schema:")
embBucketResult.printSchema()
println("itemId, emb, bucketId data result:")
embBucketResult.show(10, truncate = false)
println("Approximately searching for 5 nearest neighbors of the sample embedding:")
val sampleEmb = Vectors.dense(0.795,0.583,1.120,0.850,0.174,-0.839,-0.0633,0.249,0.673,-0.237)
bucketModel.approxNearestNeighbors(movieEmbDF, sampleEmb, 5).show(truncate = false)
}
Spark缺点
摘自https://www.jianshu.com/p/b72af2d27235:
最近有个需求做百万级别实体的相关推荐,离线场景算完入库接口调用,数仓和计算引擎基于Hive和Spark,一开始设想直接老套路embedding+LSH(Spark ml下局部敏感哈希),测了几次都GG了,十分不好用,原因有以下:
计算不稳定: Spark的LSH动不动卡着不动或者慢或者OOM,主要原因是join步骤相当消耗资源和桶内数据倾斜导致,然而在倾斜的桶内暴力搜索可能是不值得的,因为相似度数据对可能也在另一个不倾斜的桶内出现了
数据丢失: 调用approxSimilarityJoin会莫名其妙的丢失实体,比如输入1000个实体做最近邻50个检索,最后只输出了200个实体的top50,这个问题不是半径太小导致的,而是哈希之后没有任何一条(hash_table,哈希值)一样可以join上的数据对,这个问题是参数设置导致的,LSH调参比较蛋疼
不能对所有实体输出TopK: Spark的LSH的approxNearestNeighbors是输出TopK,和需求完全切合,但是这个API不支持在全表操作,只能输出一个实体进行推荐,所以只能使用join方法再对join到的数据对进行排序取topK,相当浪费计算资源
不支持余弦相似度: Spark的BucketedRandomProjectionLSH不支持余弦相似度,这个影响不大,可以先做一步归一化然后用欧氏距离,但是不是很方便
Linkin 的LSH
ScANNS是Spark的近邻搜索库,它支持在余弦距离
、jaccard距离
和欧几里德距离
空间内的离线大批量数据进行最近邻搜索。
工程下载和说明参考项目的github主页:
https://github.com/LinkedInAttic/scanns#understanding-the-model-parameters
参考文献
https://www.jianshu.com/p/b72af2d27235
边栏推荐
猜你喜欢
聊一聊数据库的行存与列存
laravel 写api接口时 session获取不到处理办法
在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
file contains vulnerabilities
深度学习理论:model.fit 函数参数详解
同时安装VirtualBox和VMware,虚拟机如何上网
TimeSformer视频理解框架:视频理解中的Transformer
不懂“赚钱逻辑”,你永远都是社会最底层(广告电商)
Google Hacking
The first time to tear the code by hand, how to solve the problem of full arrangement
随机推荐
laravel 查询数据库获取结果如何判断是否为空?
OpenCore 黑苹果安装教程
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
Anaconda报错:An unexpected error has occurred. Conda has prepared the above report 解决办法
学IT,找工作——移除链表元素
Uniapp | compatibility problems in the development of (to be continued)
Activity
whistle 手机调试代理工具
C# 注释语法
file contains vulnerabilities
Debian 12 Bookworm 尝鲜记
自定义ViewGroup实现搜索栏历史记录流式布局
3000字入门图神经网络
Binder机制详解(一)
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
(不重点考)试算平衡的分类
元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
Transformer结构解析及常见问题
uniapp发布到微信小程序:分包、删减代码全过程
MVC,MVP和MVVM架构解析