当前位置:网站首页>[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
边栏推荐
猜你喜欢
随机推荐
Win10 解决AMD平台下SVM无法开启的问题
英语每日打卡
C# 常用方法记录
库存现金、现金管理制度、现金的账务处理、银行存款、银行存款的账务处理、银行存款的核对
2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
研发过程中的文档管理与工具
链动2+1无限循环系统,2022年起盘成功率超高的模式
Flutter入门之网络请求篇
RecyclerView使用和原理解析
账务处理程序、记账凭证账务处理程序、汇总记账凭证账务处理程序、科目汇总表账务处理程序、会计信息化概述、信息化环境下会计账务处理的基本要求(此章出1道小题)
Visual Studio2022创建setup项目
C# 关键字学习手记
挖矿是什么意思?矿工都做了什么?
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
深度学习实战(1):花的分类任务
The CTF introduction of PHP file contains
对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
什么是广告电商商业模式?这几个门派告诉你
C#从入门到精通
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记