当前位置:网站首页>[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
边栏推荐
猜你喜欢
随机推荐
Go 程序太大了,能要个延迟初始化不?
Glide使用及原理分析
二舅为什么能刷屏?这三件事对企业公关的启示
laravel 写api接口时 session获取不到处理办法
TimeSformer视频理解框架:视频理解中的Transformer
Windows下MySQL数据库报“ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:8000‘ (10061)”错误解决
面试必备:Android性能分析与优化实战进阶手册
加密数字货币前传:从大卫·乔姆到中本聪
Transformer结构解析及常见问题
VS2017报错:LNK1120 1 个无法解析的外部命令
Dcat Admin 关闭代码生成器 登录指定地址
深度学习理论:测试集与验证集的区别及各自用途
管理会计(对内)指引、管理会计要素及其具体内容(可能考,考前记一下,推荐记一下四个大点即可)、
Selenium-WebDriverApi接口
C# 常用方法记录
laravel-admin FROM表单同行展示问题
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
Binder机制详解(二)
Syncthing文件同步方案完全攻略(亲测有效)
关于我的项目-微信小程序2(uniapp->wx小程序)









