`
grunt1223
  • 浏览: 421954 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA实现的Locality Sensitive Hash

阅读更多
我在之前的博客已大致介绍了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
3
3
分享到:
评论
16 楼 夜的那种黑丶 2017-12-13  
博主,请教一个问题,我利用OpenCV3提取得到SIFT特征,是以Mat形式存在的,我要怎么利用将它降维匹配呢,希望博主能够指导一下。
15 楼 夜的那种黑丶 2017-12-10  
最近要用到这方面的内容,楼主贴出的代码少了一些工具类吧,求一份源码,谢谢!
891918144@qq.com
14 楼 wang_zhao 2017-04-03  
博主您好 ,能否求一份该博文对应源码,在下学生狗一枚,非常感谢!!!!420685918@qq.com
13 楼 qwertykln 2015-11-24  
博主,能不能发一份完整代码给我啊,我现在正在学习这个,邮箱:384450503@qq.com  谢谢了。
12 楼 reny0oo 2015-08-17  
soledad1030 写道
[size=x-large][size=large][size=medium]博主,您好,请问是否可以贡献出 MathUtils 和 VectorComparator 这两个类呢?

由于您的代码中也没有注释描述这两类实现的功能,所以我没办法自己编写代码,希望您能把代码发送至我的邮箱:xiao.feng@ia,ac.cn 非常感谢啦
[/size][/size][/size]

给我也一份吧,137735058@qq.com,谢谢博主
11 楼 u010382571 2015-06-04  
u010382571 写道
博主,求发 一份代码给我,学生党毕设急用。。。

邮箱1119484889@qq.com
10 楼 u010382571 2015-06-04  
博主,求发 一份代码给我,学生党毕设急用。。。
9 楼 huiyi1991 2015-05-18  
博主,看到你这有java实现的,很是高兴,同求一份java源码啊,急需学习使用,邮箱:1124165467@qq.com ,十分谢谢!
8 楼 Flyer2015 2015-04-28  
博主,能不能发一份完整代码给我啊,我现在正在学习这个,看了好多资料都是一知半解的,好痛苦,邮箱:1164660013@qq.com  谢谢了。
7 楼 sdrzbruce 2015-02-03  
博主,您好,能否发给我一份完整的代码,十分感谢!我的邮箱sdrzbruce@163.com  谢了~
6 楼 艮离艮离 2014-08-24  
博主,我一直不太理解LSH的实现,能否请你把完整的代码发到我的邮箱,大恩大德感激不尽啊,对了,我也是杭州的,我请你吃饭啊   邮箱:513344592@qq.com  万分感谢~
5 楼 objsun 2014-05-07  
博主,既然是多哈希表存储,为什么你代码里只有一个map.而且对于同一个向量,hashcount次映射后的key都是存在一张哈希表里。。这不造成大量重复了吗
4 楼 soledad1030 2014-01-17  
不好意思,我的邮箱是 xiao.feng@ia.ac.cn 上面打错了一个点
3 楼 soledad1030 2014-01-17  
[size=x-large][size=large][size=medium]博主,您好,请问是否可以贡献出 MathUtils 和 VectorComparator 这两个类呢?

由于您的代码中也没有注释描述这两类实现的功能,所以我没办法自己编写代码,希望您能把代码发送至我的邮箱:xiao.feng@ia,ac.cn 非常感谢啦
[/size][/size][/size]
2 楼 qweaz2012 2013-12-16  
不知道博主能不能发一份详细代码给我,yh0904_2012@126.com,最近正好在学习,非常感谢!!!
1 楼 longpo1988 2013-08-06  
您好,能不能给我发一份全的代码,谢谢,邮箱longpo1988@163.com,非常感谢!

相关推荐

    Locality-Sensitive-Hashing

    在Java实现LSH的过程中,通常会用到以下组件和技术: 1. **数据结构**:如ArrayList、HashSet或HashMap用于存储哈希表和哈希后的数据项。 2. **哈希函数**:可以设计自定义的哈希函数,例如MinHash、Bloom Filter或...

    A Locality-Sensitive Hash for Real Vectors (10.1.1.215.7690)-计算机科学

    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, ...

    2004 Locality-sensitive hashing scheme based on p-stable distributions.pdf

    局部敏感哈希(Locality-sensitive hashing,简称LSH)是一种在数据挖掘领域中广泛应用于高维空间近邻搜索问题的技术。2004年的这篇论文介绍了一种基于p-稳定分布的局部敏感哈希方案,该方案提出了一种新型的哈希...

    开源项目-glaslos-tlsh.zip

    开源项目-glaslos-tlsh.zip,Feature complete golang port of the Trend Micro Locality Sensitive Hash (TLSH) library. Feedback welcome!

    semantic_hash.pdf

    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:特尔什

    java笔试题算法 TLSH - Trend Micro Locality Sensitive Hash TLSH 是一个模糊匹配库。 给定一个最小长度为 50 字节的字节流 TLSH 生成一个哈希值,可用于相似性比较。 相似的对象将具有相似的散列值,这允许通过...

    TLSH一个生成字符串哈希的JavaScript库

    TLSH(Trend Micro Locality Sensitive Hash)是一种特定类型的哈希算法,设计用于快速检测和比较数据块的相似性,特别适用于文本、文件或序列数据的比较。 JavaScript作为一种广泛使用的编程语言,尤其在Web开发中...

    图片检索(均匀hash,感知hash,颜色直方图)

    比如,可以使用更复杂的哈希技术,如Locality Sensitive Hashing (LSH),来进一步减少哈希冲突;或者引入深度学习模型,如卷积神经网络,来提取更高层次的语义特征,提升检索准确性。 总结,这个资源提供了基础的...

    Locality-Sensitive-Hashing:用于位置敏感哈希的Scala库

    局部敏感哈希一个Scala库,用于局部敏感哈希。 当前的实现仅适用于文本,并且仅支持Jaccard相似性。 val lsh = new LSH(shingleLength , min hash Length , number of bands , processedDocuments, threshold)

    tlsh-js:TLSH(趋势科技本地敏感哈希)JavaScript端口

    TLSH(Trend Micro Locality Sensitive Hash)JavaScript端口 TLSH是设计的模糊匹配库(托管在) 给定最小长度为512个字符的字节流(以及最小的随机性),TLSH会生成可用于相似性比较的哈希值。 相似的对象将具有...

    LSH资料ppt_pdf

    LSH(Locality Sensitive Hashing,位置敏感哈希)是一种在高维空间中快速查找相似数据的近似算法。这种技术主要用于大数据集中的近似最近邻搜索(Approximate Nearest Neighbor, ANN),尤其适用于处理高维向量,如...

    基于哈希技术和MapReduce的大数据集K-近邻算法实现代码

    一种常见的哈希方法是Locality Sensitive Hashing (LSH),它能够在高维空间中近似地找出相似的数据点。 MapReduce是一种分布式计算模型,由Google提出,用于处理和生成大规模数据集。它分为Map和Reduce两个阶段:...

    图片搜索功能的demo

    在实际应用中,为了提高搜索效率,通常会使用数据结构如Bloom Filter或LSH(Locality Sensitive Hashing)来存储和检索哈希码。Bloom Filter可以高效地检测不存在项,而LSH则能将相似的哈希码映射到相同的桶,从而...

    LSH-master_lsh_追踪算法_

    LSH(Locality Sensitive Hashing,局部敏感哈希)是一种在大数据集上进行近似相似性搜索的技术,尤其适用于高维数据。该算法的主要思想是将高维数据映射到低维空间,使得相似的数据在哈希后有更高的概率落入相同的...

    基于内容的检索相关文献

    例如,Bloom Filter、Min-Hash、Locality Sensitive Hashing (LSH)等都是常见的Hash算法。 3. 相似度计算:在图像检索中,如何度量两个图像的相似程度是关键。通常使用欧氏距离、余弦相似度、Jaccard相似度等度量...

    thinkphp5-使用SimHash进行海量内容数据查重

    为了提高性能,可以使用一些数据结构优化技术,如Bloom Filter或MinHash LSH(Locality Sensitive Hashing),它们能在牺牲一定的精确度情况下进一步减少计算量和存储空间。 总结起来,使用ThinkPHP5结合SimHash...

    基于多种哈希算法和孪生神经网络的短视频相似度检测系统.zip

    这可能是通过组合多种哈希函数,或者使用如LSH(Locality Sensitive Hashing)等技术,来降低哈希碰撞的概率。 接下来,孪生神经网络是一种深度学习模型,特别适用于对相似度计算的任务。这种网络通常由两个共享...

    Python库 | reformer-0.1.1-py3-none-any.whl

    4. **LSH自注意力(Locality Sensitive Hashing Attention)**:这是Reformer的另一个创新,利用LSH(局部敏感哈希)来加速自注意力计算,减少长序列处理的计算成本。 5. **有效实现**:Reformer库提供了一个高效的...

Global site tag (gtag.js) - Google Analytics