我在之前的博客已大致介绍了LSH的原理及其的适用场景,有兴趣的朋友可以移步至
http://grunt1223.iteye.com/blog/937600
这里我给出它的具体实现及实验效果:
private int dimention; //维度大小,例如对于sift特征来说就是128
private int max; //所需向量中元素可能的上限,譬如对于RGB来说,就是255
private int hashCount; //哈希表的数量,用于更大程度地削减false positive
//LSH随机选取的采样位数,该值越小,则近似查找能力越大,但相应的false positive也越大;若该值等于size,则为由近似查找退化为精确匹配
private int bitCount;
private int size; //转化为01字符串之后的位数,等于max乘以dimensions
private int[][] hashFamily; //LSH哈希族,保存了随机采样点的INDEX
VectorComparator comparator;
// private HashMap<String, ArrayList<IdentifiedVector>> map;
private HashMap<String, ArrayList<String>> map;
public SimpleLSH(int dimention, int max, int hashCount, int bitCount) {
this.dimention = dimention;
this.max = max;
this.hashCount = hashCount;
this.bitCount = bitCount;
this.size = this.dimention * this.max;
this.hashFamily = new int[hashCount][bitCount];
// map = new HashMap<String, ArrayList<IdentifiedVector>>();
map = new HashMap<String, ArrayList<String>>();
this.comparator = new VectorComparator(new int[] { 0 });
}
//生成随机的投影点
private void generataHashFamily() {
Random rd = new Random();
for (int i = 0; i < hashCount; i++) {
for (int j = 0; j < bitCount; j++) {
hashFamily[i][j] = rd.nextInt(size);
}
}
//将向量转化为二进制字符串,比如元素的最大范围255,则元素65就被转化为65个1以及190个0
private int[] unAray(int[] data) {
int unArayData[] = new int[size];
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i]; j++) {
unArayData[i * max + j] = 1;
}
}
return unArayData;
}
//将向量映射为LSH中的key
private String generateHashKey(int[] list, int hashNum) {
StringBuilder sb = new StringBuilder();
int[] tempData = unAray(list);
int[] hashedData = new int[bitCount];
//首先将向量转为二进制字符串
for (int i = 0; i < bitCount; i++) {
hashedData[i] = tempData[hashFamily[hashNum][i]];
sb.append(hashedData[i]);
// System.out.print(hashedData[i]);
}
//再用常规hash函数比如MD5对key进行压缩
MessageDigest messageDigest = null;
try
{
messageDigest = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e) {
}
byte[] binary = sb.toString().getBytes();
byte[] hash = messageDigest.digest(binary);
String hashV = MathUtils.getHexDigest(hash);
return hashV;
}
//将向量映射为LSH中的key,并保存至map中
private void generateHashMap(String id, int[] vercotr) {
for (int j = 0; j < hashCount; j++) {
String key = generateHashKey(vercotr, j);
ArrayList<String> l;
if (map.containsKey(key)) {
l = map.get(key);
} else {
l = new ArrayList<String>();
}
l.add(id);
map.put(key, l);
}
}
// 查询与输入向量最接近(海明空间)的向量
public Set<String> query(int[] data) {
// Set<IdentifiedVector> result = new HashSet<IdentifiedVector>();
Set<String> result = new HashSet<String>();
for (int j = 0; j < hashCount; j++) {
String key = generateHashKey(data, j);
if (map.containsKey(key)) {
result.addAll(map.get(key));
}
}
return result;
}
我利用上面的LSH对图片的边缘直方图特征进行建模,获得了不错的效果,可以用于近似图片的查找,效果如下:
- 大小: 90.3 KB
分享到:
相关推荐
局部敏感哈希(Locality-sensitive hashing,简称LSH)是一种在数据挖掘领域中广泛应用于高维空间近邻搜索问题的技术。2004年的这篇论文介绍了一种基于p-稳定分布的局部敏感哈希方案,该方案提出了一种新型的哈希...
在Java实现LSH的过程中,通常会用到以下组件和技术: 1. **数据结构**:如ArrayList、HashSet或HashMap用于存储哈希表和哈希后的数据项。 2. **哈希函数**:可以设计自定义的哈希函数,例如MinHash、Bloom Filter或...
A locality-sensitive hash for real vectorsTyler NeylonAbstract We present a simple and practical algorithm for the c−approximate near neighbor problem (c−NN): given n points P ⊂ Rd and radius R, ...
开源项目-glaslos-tlsh.zip,Feature complete golang port of the Trend Micro Locality Sensitive Hash (TLSH) library. Feedback welcome!
than locality sensitive hashing, which is the fastest current method. By using semantic hashing to filter the documents given to TF-IDF, we achieve higher accuracy than applying TF-IDF to the entire...
常见的哈希函数包括Locality Sensitive Hashing (LSH)、Bloom Filter、Min-Wise Independent Permutations等。这些函数通过随机投影或特定变换将图像的高级特征转化为紧凑的哈希码。 2. **图像特征提取**: 在使用...
java笔试题算法 TLSH - Trend Micro Locality Sensitive Hash TLSH 是一个模糊匹配库。 给定一个最小长度为 50 字节的字节流 TLSH 生成一个哈希值,可用于相似性比较。 相似的对象将具有相似的散列值,这允许通过...
TLSH(Trend Micro Locality Sensitive Hash)是一种特定类型的哈希算法,设计用于快速检测和比较数据块的相似性,特别适用于文本、文件或序列数据的比较。 JavaScript作为一种广泛使用的编程语言,尤其在Web开发中...
比如,可以使用更复杂的哈希技术,如Locality Sensitive Hashing (LSH),来进一步减少哈希冲突;或者引入深度学习模型,如卷积神经网络,来提取更高层次的语义特征,提升检索准确性。 总结,这个资源提供了基础的...
局部敏感哈希一个Scala库,用于局部敏感哈希。 当前的实现仅适用于文本,并且仅支持Jaccard相似性。 val lsh = new LSH(shingleLength , min hash Length , number of bands , processedDocuments, threshold)
TLSH(Trend Micro Locality Sensitive Hash)JavaScript端口 TLSH是设计的模糊匹配库(托管在) 给定最小长度为512个字符的字节流(以及最小的随机性),TLSH会生成可用于相似性比较的哈希值。 相似的对象将具有...
LSH(Locality Sensitive Hashing,位置敏感哈希)是一种在高维空间中快速查找相似数据的近似算法。这种技术主要用于大数据集中的近似最近邻搜索(Approximate Nearest Neighbor, ANN),尤其适用于处理高维向量,如...
一种常见的哈希方法是Locality Sensitive Hashing (LSH),它能够在高维空间中近似地找出相似的数据点。 MapReduce是一种分布式计算模型,由Google提出,用于处理和生成大规模数据集。它分为Map和Reduce两个阶段:...
在实际应用中,为了提高搜索效率,通常会使用数据结构如Bloom Filter或LSH(Locality Sensitive Hashing)来存储和检索哈希码。Bloom Filter可以高效地检测不存在项,而LSH则能将相似的哈希码映射到相同的桶,从而...
LSH(Locality Sensitive Hashing,局部敏感哈希)是一种在大数据集上进行近似相似性搜索的技术,尤其适用于高维数据。该算法的主要思想是将高维数据映射到低维空间,使得相似的数据在哈希后有更高的概率落入相同的...
例如,Bloom Filter、Min-Hash、Locality Sensitive Hashing (LSH)等都是常见的Hash算法。 3. 相似度计算:在图像检索中,如何度量两个图像的相似程度是关键。通常使用欧氏距离、余弦相似度、Jaccard相似度等度量...
为了提高性能,可以使用一些数据结构优化技术,如Bloom Filter或MinHash LSH(Locality Sensitive Hashing),它们能在牺牲一定的精确度情况下进一步减少计算量和存储空间。 总结起来,使用ThinkPHP5结合SimHash...
这可能是通过组合多种哈希函数,或者使用如LSH(Locality Sensitive Hashing)等技术,来降低哈希碰撞的概率。 接下来,孪生神经网络是一种深度学习模型,特别适用于对相似度计算的任务。这种网络通常由两个共享...
4. **LSH自注意力(Locality Sensitive Hashing Attention)**:这是Reformer的另一个创新,利用LSH(局部敏感哈希)来加速自注意力计算,减少长序列处理的计算成本。 5. **有效实现**:Reformer库提供了一个高效的...