Datasketch 教程
Datasketch 教程:近似集合操作和局部敏感哈希 (LSH)
Datasketch
是一个 Python 库,专注于高效的集合操作和局部敏感哈希(LSH)等近似算法。它特别适合处理高维数据,例如在海量数据中快速查找相似对象(如图片、文本、音频等)的应用场景。Datasketch
提供了 MinHash、HyperLogLog、b-Bit MinHash、Weighted MinHash、和 LSH 等强大的功能。
官方文档链接
Datasketch
的官方文档可以在 https://ekzhu.github.io/datasketch/ 找到。
一、安装
首先,安装 Datasketch
库:
pip install datasketch
二、MinHash 基本操作
MinHash
是一种用于集合相似度近似计算的算法,主要用于估计两个集合的 Jaccard 相似度。它通常用于查找相似文档、图片等应用中。
1. MinHash 的基本用法
假设我们有两个文档,每个文档可以被表示为单词的集合。我们可以使用 MinHash
来计算它们的 Jaccard 相似度。
from datasketch import MinHash
# 两个示例集合
set1 = {'apple', 'banana', 'grape'}
set2 = {'apple', 'orange', 'grape'}
# 创建 MinHash 对象
m1, m2 = MinHash(), MinHash()
# 为每个集合中的元素进行 MinHash 签名
for item in set1:
m1.update(item.encode('utf8'))
for item in set2:
m2.update(item.encode('utf8'))
# 计算两个集合的 Jaccard 相似度
similarity = m1.jaccard(m2)
print(f"MinHash 估计的 Jaccard 相似度: {similarity}")
在上面的代码中,MinHash.update()
用于将集合中的每个元素加入到 MinHash 对象中。最后,通过 jaccard()
方法估计两个集合的 Jaccard 相似度。
2. MinHash 计算精度的调节
MinHash 的计算精度可以通过设置哈希函数的数量来调节。哈希函数数量越多,计算的相似度越精确,但相应的时间复杂度和空间复杂度也会增加。
# 设置 MinHash 使用 128 个哈希函数
m1, m2 = MinHash(num_perm=128), MinHash(num_perm=128)
for item in set1:
m1.update(item.encode('utf8'))
for item in set2:
m2.update(item.encode('utf8'))
similarity = m1.jaccard(m2)
print(f"MinHash (128 个哈希函数) 估计的 Jaccard 相似度: {similarity}")
三、局部敏感哈希 (LSH)
局部敏感哈希 (LSH) 是一种用于高效查找近似最近邻的算法,能够加速海量数据中的相似搜索。Datasketch
提供了 MinHash LSH 来解决这个问题。
1. LSH 基本用法
使用 LSH,可以在大量集合中快速查找与目标集合相似的集合。以下示例展示了如何使用 LSH 查找相似集合。
from datasketch import MinHash, MinHashLSH
# 创建 MinHash LSH,设置阈值为 0.5
lsh = MinHashLSH(threshold=0.5, num_perm=128)
# 构建 MinHash 对象
m1, m2, m3 = MinHash(num_perm=128), MinHash(num_perm=128), MinHash(num_perm=128)
set1 = {'apple', 'banana', 'grape'}
set2 = {'apple', 'orange', 'grape'}
set3 = {'pear', 'banana', 'grape'}
# 为每个集合生成 MinHash 签名
for item in set1:
m1.update(item.encode('utf8'))
for item in set2:
m2.update(item.encode('utf8'))
for item in set3:
m3.update(item.encode('utf8'))
# 将 MinHash 对象添加到 LSH
lsh.insert("set1", m1)
lsh.insert("set2", m2)
lsh.insert("set3", m3)
# 查询与 set1 相似的集合
result = lsh.query(m1)
print(f"与 set1 相似的集合: {result}")
在这个示例中,我们创建了一个 LSH 对象,设置了相似度阈值为 0.5
。接着,我们将三个 MinHash 对象添加到 LSH 中,并使用 query()
方法查询与某个集合相似的集合。
2. LSH 批量插入和查询
如果有大量数据,Datasketch
支持批量插入和查询,以提高效率。
# 插入多个 MinHash 对象
lsh.insert_batch([("set1", m1), ("set2", m2), ("set3", m3)])
# 批量查询相似的集合
queries = [("query1", m1), ("query2", m2)]
results = lsh.query_batch(queries)
for query, result in zip(queries, results):
print(f"与 {query[0]} 相似的集合: {result}")
3. 自定义 LSH 参数
LSH 的性能和准确性可以通过 threshold
(相似度阈值)、num_perm
(哈希函数数量)等参数进行调节。合理设置这些参数,可以在查询速度和准确性之间取得平衡。
# 创建 MinHash LSH,使用较高的相似度阈值
lsh = MinHashLSH(threshold=0.8, num_perm=256)
# 插入 MinHash 对象并进行查询
lsh.insert("set1", m1)
result = lsh.query(m1)
print(f"与 set1 相似的集合: {result}")
四、HyperLogLog (HLL) 使用
HyperLogLog (HLL)
是一种用于近似计数的算法,可以用于估计集合的基数(即集合中不重复元素的数量)。与 MinHash 不同,HyperLogLog 更加适合处理基数估计问题。
1. 基本用法
以下示例展示了如何使用 HyperLogLog 进行基数估计。
from datasketch import HyperLogLog
# 创建一个 HyperLogLog 对象
hll = HyperLogLog()
# 插入元素
for item in set1:
hll.update(item.encode('utf8'))
# 估计集合基数
cardinality = hll.count()
print(f"集合的基数估计值: {cardinality}")
HyperLogLog 可以处理非常大的集合,并且内存占用极小,因此适合用于大规模数据集的去重计数。
五、Weighted MinHash (加权 MinHash)
Weighted MinHash
是一种扩展的 MinHash 算法,适用于集合中元素具有权重的情况。它可以用于计算带权重集合的 Jaccard 相似度。
1. 加权 MinHash 的使用
假设我们有两个带有权重的集合,Datasketch
的 Weighted MinHash
可以帮助我们计算其加权 Jaccard 相似度。
from datasketch import WeightedMinHash
# 两个加权集合,元素和对应权重
weights1 = {'apple': 1.0, 'banana': 2.0, 'grape': 1.0}
weights2 = {'apple': 1.0, 'orange': 2.0, 'grape': 1.0}
# 创建加权 MinHash 对象
wm1 = WeightedMinHash(seed=42)
wm2 = WeightedMinHash(seed=42)
# 更新 MinHash 对象,输入元素和对应权重
for item, weight in weights1.items():
wm1.update(item.encode('utf8'), weight)
for item, weight in weights2.items():
wm2.update(item.encode('utf8'), weight)
# 计算加权 Jaccard 相似度
weighted_similarity = wm1.jaccard(wm2)
print(f"加权 Jaccard 相似度: {weighted_similarity}")
六、总结
Datasketch
是一个功能强大的库,适合处理大规模集合相似性问题。通过 MinHash、LSH、HyperLogLog、Weighted MinHash 等工具,用户可以高效地处理集合相似性搜索、基数估计、去重计数等问题。
- MinHash:用于快速计算集合之间的 Jaccard 相似度。
- LSH:基于 MinHash 的局部敏感哈希,用于加速相似性搜索。
- HyperLogLog:一种用于基数估计的高效算法。
Weighted MinHash:适用于带权重集合的相似度计算。
如果你需要处理海量数据并且需要进行相似度查询、基数估计等操作,Datasketch
是一个非常实用的工具。
原文地址:https://blog.csdn.net/jixiaoyu0209/article/details/142643908
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!