minhash算法

minhash算法
大数据量计算相似度的时候,我们使用minhash(最小哈希)进行降维,使用LSH算法进行近似查询。

相似性的度量:
使用雅卡尔系数,交集数量除以并集数量。

以文档为例,组成成分为单词。我们将单词量化为数值,那么一个文档的构成可以有一个数值单词表构成,0表示存在,1表示不存在。

我们最初想法是打乱单词的数值代表,由一个单词代表一篇文档,但是这样在大数量的条件下比较复杂。

我们的办法是使用hash函数,对单词对应的序列号进行哈希,每个哈希函数产生对文档产生一个代表值,有多少个哈希函数,一个文档最后就由多少个新的序列号代表。

这样加入,我们一个文档由10000个单词组成,维度是很大的,我们使用128个哈希函数,这样文档的单词维度就变成了128维,大大降低了维度。

我们使用新的序列号维度进行相似性的度量

使用minhash进行降维的合理性在于,两个集合随即一个行排列最小哈希值相等的概率是等于雅卡尔系数的

参考来自这里

转载于:https://www.cnblogs.com/lzida9223/p/10831171.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MinHash算法是一种用于计算两个集合之间相似度的快速算法。其基本思想是将集合中的元素哈希成一个个签名,再比较两个集合的签名相同的元素个数。 具体实现步骤如下: 1. 首先将集合中的元素进行哈希,得到一个个哈希值。 2. 然后将哈希值分成若干组,每组取一个最小值作为这一组的签名。 3. 对于两个集合,比较它们的签名相同的元素个数,用这个数值作为它们的相似度。 下面是一个简单的Python实现: ```python import hashlib def minhash(set1, set2, num_hashes): # 随机生成num_hashes个哈希函数 hash_funcs = [hashlib.sha1(str(i).encode()).hexdigest() for i in range(num_hashes)] # 初始化两个集合的签名 set1_sig = [float('inf')] * num_hashes set2_sig = [float('inf')] * num_hashes # 计算集合的签名 for val in set1: # 对每个元素进行哈希 hash_val = hashlib.sha1(str(val).encode()).hexdigest() # 更新集合的签名 for i in range(num_hashes): if hash_funcs[i] in hash_val: set1_sig[i] = min(set1_sig[i], val) for val in set2: # 对每个元素进行哈希 hash_val = hashlib.sha1(str(val).encode()).hexdigest() # 更新集合的签名 for i in range(num_hashes): if hash_funcs[i] in hash_val: set2_sig[i] = min(set2_sig[i], val) # 计算相似度 similarity = sum([set1_sig[i] == set2_sig[i] for i in range(num_hashes)]) / num_hashes return similarity ``` 这个实现中,我们使用了SHA1哈希函数来生成哈希值。在生成签名时,我们将哈希值分成了num_hashes组,并且每组取一个最小值作为签名。最后,我们计算两个集合的签名相同的元素个数,并用这个数值作为它们的相似度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值