我在实现minhashing时遇到了问题。在纸上和从阅读中我理解这个概念,但我的问题是排列“技巧”。实现的建议不是置换集合和值的矩阵,而是“选择k(例如100)独立散列函数”,然后算法说:
for each row r
for each column c
if c has 1 in row r
for each hash function h_i do
if h_i(r) is a smaller value than M (i, c) then
M(i, c) := h_i(r)
在不同的小例子和教导book中,他们只使用两个或三个散列函数(h = a * x + b mod p)。这很容易找到,但在实践中如何做,我怎样才能找到100个这样的独立功能。
在Java示例here中,仅从一个散列函数而不是多散列函数生成散列值,与行索引无关。区别在哪里? 我现在的问题是如何找到这些独立的哈希函数,或者如果只有一个哈希函数的方法如何在算法中处理这些值?
答案 0 :(得分:1)
一种简单的方法是使用参数化散列系列,例如制表散列函数(http://en.wikipedia.org/wiki/Tabulation_hashing)
在本书的例子中(a * x + b mod p),通过选择不同的(a,b,p)集,你可以有不同的散列函数。一种拥有独立散列函数的方法是选择(a,b,p)素数/共素数,而不是大数
答案 1 :(得分:0)
根据iampat的回答,您可以使用制表哈希(http://en.wikipedia.org/wiki/Tabulation_hashing)。
另一个提供良好结果的非常有效的选项是使用单个优质散列函数(例如FNV_1a)来生成主散列,然后使用100种不同的XOR和bitroll组合来修改它。
要生成每个哈希,您可以获取主哈希,将其按给定距离进行滚动,然后使用给定值对其进行异或。对于100个散列函数中的每一个,随机选择比特卷和XOR值。有关详细信息,请参阅this discussion。
有些人建议使用乘法而不是XOR,在这种情况下,您可能需要选择素数。