最开始仿真和精度测试,基于 matlab 完成的。

Demo_MakeTable.m (生成 Hash 表)

  1. %========================================
  2. %***********************************
  3. %******* 设定参数: *****************
  4. %******* l : hash表个数 ********
  5. %******* k : 各表关键字个数 *******
  6. %=========================================
  7. clear all; close all; clc;
  8. l = 3;
  9. k = 15;
  10. sData = textread('./Data/data.txt', '%s');
  11. n = length(sData);
  12. Data = false(n, 128);
  13. for i = 1 : n
  14. Data(i, :) = sData{i} - '0';
  15. end
  16. clear sData;
  17.  
  18. Tables = lsh_1norm(l, k, Data);
  19. save(['.\Data\' num2str(l) '_' num2str(k) '_Tables'], 'Tables');
  20. % cd ./ErrorCompute
  21. % Demo_ErrorStat
  22. %% Write Hash keys and the Index
  23. % 多线程
  24. % matlabpool local 10
  25. % for i = 1 : l
  26. % fprintf(' %d 个哈希表.\n', i);
  27. % Write_Hash_Index(k, Tables(i), i);
  28. % end
  29. % matlabpool close

lsh_1norm.m (核心函数,我用其组织了整个索引结构生成过程)

  1. function T2 = lsh_1norm(l, k, yy)
  2. %==================================
  3. % parameters setting && getting
  4. % [n d] = size(x);
  5. %==================================
  6. %************ 数据集预处理 : hamming 空间(维度小于100时使用) ********
  7. % fprintf('数据集转换到 Hamming space.\n');
  8. % tic
  9. % x = x'; % n x d (d < 100)
  10. % C = max(x(:));
  11. % dim = size(x);
  12. % yy = false(dim(1), dim(2) * 255);
  13. % for i = 1 : dim(1)
  14. % for j = 1 : dim(2)
  15. % oneO = false(1,C);
  16. % oneO(1:x(i,j)) = 1;
  17. % yy(i,(j-1)*C+1 : (j-1)*C+C) = oneO;
  18. % end
  19. % end
  20. % clear oneO x;
  21. % toc
  22. % fprintf('转换 Hamming space 完成.\n');
  23. %==================================
  24. fprintf('初始化 %d Hash 表...\n', l);
  25. % matlabpool local 10
  26. % 可并行
  27. for i = 1 : l
  28. % creat and init Tables[i] = f(k, x);
  29. T1(i) = createTable(k, yy);
  30. end
  31. % matlabpool close
  32. fprintf('初始化完成。\n');
  33. %=====================================
  34. tic;
  35. matlabpool local 10
  36. % save the index of feature data
  37. % insert(T, x);
  38. for i = 1 : l
  39. fprintf('数据插入第 %d hash\n', i);
  40. T2(i) = insert_data(T1(i), yy);
  41. end
  42. matlabpool close
  43. toc;
  44. % clc;
  45.  
  46. %======================================

createTable.m

  1. function T = createTable(k, x)
  2. % M = size(x,1)+17; % length of second hashTable (hashTable2)
  3. M = 587474;
  4. d = size(x, 2);
  5.  
  6. select_d = unidrnd(d, 1, k);
  7. I.d = select_d;
  8. % I.threshold = unifrnd(0, 1, 1, k) * 255; % value interval [0 255]
  9. I.k = k;
  10. T.I = I;
  11. T.randDigits = unidrnd(M, 1, k);
  12. T.buckets = [];
  13. T.index = {};
  14. T.hashTable2 = cell(M,1);

insert_data.m

  1. function T = insert_data(T, x)
  2. % M = size(x, 1) + 17;
  3. M = 587474;
  4.  
  5. % buck01 = x(T.I.d, :)' < repmat(T.I.threshold, size(x,2), 1);
  6. buck01 = x(:, T.I.d);
  7. [uBuck id1 id2] = unique(buck01,'rows');
  8. T.buckets = logical(uBuck);
  9. T.bucket_cnt = length(id1);
  10. key = mod(sum(bsxfun(@times, uBuck, T.randDigits),2), M) + 1; % matalb 下标从 1 开始
  11. T.index = cell(length(id1), 1);
  12. for bb = 1 : length(id1)
  13. sameBucket = find(id2 == bb);
  14. T.index{bb} = [T.index{bb}; sameBucket'];
  15. T.hashTable2{key(bb)} = [T.hashTable2{key(bb)} bb];
  16. end

Demo_computeError.m (测试精确度)

  1. % clear all; clc;
  2. p = 1;
  3. load(['..\Data\3_15_Tables.mat']);
  4. load('..\Data\data.mat');
  5. load('..\Data\query.mat');
  6. Data = Data';
  7. avgErr = zeros(1, 50);
  8. MissSum = zeros(1, 50);
  9. picErr = zeros(1,50); picErr(1) = 0.982;
  10.  
  11. for K = 1 : 10
  12. MissCnt = 0;
  13. ratioCnt = 0;
  14. fid = fopen(['K_' num2str(K) '.txt'], 'w');
  15. for i = 1 : length(Q) % the ith input.
  16. % fprintf(fid, '%-5d', i);
  17. % fprintf([num2str(i) ' ']);
  18. q = Q(i,:)';
  19. [Id1, Mis] = LSH_Search(q', K, Tables, Data, p);
  20. if Mis
  21. MissCnt = MissCnt + 1;
  22. fprintf(fid, 'Miss\n');
  23. continue;
  24. end
  25. % num = num + 1;
  26. % imwrite(uint8(input),['.\Data\','query_subset2\',num2str(num),'.bmp']);
  27. Id2 = Linear_Search(q, K, Data, p);
  28. Dlsh = lp_norm(q, Data(:, Id1), p);
  29. Dcst = lp_norm(q, Data(:, Id2), p);
  30. id = Dlsh == Dcst;
  31. ratio = Dcst ./ (Dlsh + 0.00002);
  32. ratio(id) = 1;
  33. % for j = 1 : K
  34. % fprintf(fid, '%-8.2f', ratio(j));
  35. % end
  36. fprintf(fid, 'error: %8.3f\n', ratio(K));
  37. ratioCnt = ratioCnt + ratio(K);
  38. end
  39. fprintf(fid, 'Hit times: %-5d Avg. error: %.3f\n', length(Q)-MissCnt, ratioCnt/(length(Q)-MissCnt));
  40. avgErr(K) = ratioCnt/(length(Q)-MissCnt);
  41. fprintf(fid, 'Miss times: %-5d Miss ratio: %.3f', MissCnt, MissCnt/length(Q));
  42. MissSum(K) = MissCnt;
  43. picErr(K) = ratioCnt / (length(Q)-MissCnt);
  44. fclose(fid);
  45. end
  46. % figure,plot(1:50,avgErr,'-r.','MarkerFaceColor','g'),
  47. % xlabel('number of K'),ylabel('Error'),title('Error of LSH');
  48. % figure, plot(1:50,MissSum/146,'-r.','MarkerEdgeColor','k'),
  49. % xlabel('number of K'),ylabel('Miss ratio'),title('Qurey miss of LSH');
  50.  
  51. figure,plot(1:10,picErr(1:10),'-r.','MarkerFaceColor','g'),
  52. xlabel('number of K'),ylabel('Error'),title('Error of LSH');

Linear_Search.m

  1. function Index = Linear_Search(q, K, DataSet, p)
  2.  
  3. D = feval('lp_norm', q, DataSet, p);
  4. [~, id] = sort(D);
  5. Index = id(1 : K);

lp_norm.m  (此处使用了 Hamming distance, p = 2 时,可以调整为 l2 范式欧式距离)

  1. %************ get the distance **********************
  2. function distance = lp_norm(x0, x, p)
  3. tem = repmat(x0, 1, size(x,2));
  4. distance = sum((abs(tem - x) .^ p), 1) .^ (1/p);

lookup.m (LSH 查找)

  1. function Index = lookup(T, q) % x can be removed
  2. %========================================================
  3. %************ 参数解释: ***********************
  4. %************ T : 哈希表 ***********************
  5. %************ x : 总数据集 **********************
  6. %************ q: 查询
  7. %
  8. %========================================================
  9.  
  10. %========================================================
  11. index = [];
  12. % 可并行
  13. for i = 1 : length(T)
  14. tem = getIndex(T(i), q);
  15. index = [index tem];
  16. end
  17. Index = unique(index);

getIndex.m

  1. function tableiIndex = getIndex(T, x0)
  2.  
  3. M = length(T.hashTable2);
  4. tableiIndex = [];
  5.  
  6. seq01_x = x0(:, T.I.d);
  7. index_x = mod(sum(bsxfun(@times, seq01_x, T.randDigits),2), M) + 1;
  8.  
  9. if ~isempty(T.hashTable2{index_x})
  10. index_bucket = T.hashTable2{index_x};
  11. %******************************************
  12. %for i = 1 : length(index_bucket)
  13. %******************************************
  14. uni_index_bucket = index_bucket(find(all(bsxfun(@eq, seq01_x, T.buckets(index_bucket, :)), 2)));
  15. for i = 1 : length(uni_index_bucket)
  16. tableiIndex = [tableiIndex T.index{uni_index_bucket(i)}];
  17. end
  18. end

Linear_Search.m (线性查找)

  1. function Index = Linear_Search(q, K, DataSet, p)
  2.  
  3. D = feval('lp_norm', q, DataSet, p);
  4. [~, id] = sort(D);
  5. Index = id(1 : K);

(横轴为 K-NN 中 K 的值,纵轴为准确度)

相关截图:

Algorithm proposed from Papers :

(Indyk 1999) similarity search in hish dimensions via hashing.

(Indyk 2005) Locality-sensitive hashing scheme based on p-stable distributions.

实习日记:图像检索算法 LSH 的总结与分析(matlab)的更多相关文章

  1. 实习日记:图像检索算法 LSH 的总结与分析

    先贴上这两天刚出炉的C++代码.(利用 STL 偷了不少功夫,代码待优化) Head.h #ifndef HEAD_H #define HEAD_H #include "D:\\LiYang ...

  2. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  3. 第2章 rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是本文的姊妹篇: 1.rsync(一):基本命令和用法 2.rsync(二):ino ...

  4. rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...

  5. Python实现的选择排序算法原理与用法实例分析

    Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...

  6. Bag of Features (BOF)图像检索算法

    1.首先.我们用surf算法生成图像库中每幅图的特征点及描写叙述符. 2.再用k-means算法对图像库中的特征点进行训练,生成类心. 3.生成每幅图像的BOF.详细方法为:推断图像的每一个特征点与哪 ...

  7. TW实习日记:前三天

    今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ...

  8. TW实习日记:第31-32天

    不知不觉的,实习的净工作天数,已经都超过一个月了.因为对工作内容不是很满意,所以打算月底离职,也不知道是公司太缺人还是我真的能干活,领导竟然三番两次找我让我再考虑...明天又要找我了,哎...随机应变 ...

  9. $2015 武汉森果公司web后端开发实习日记----书写是为了更好的思考

    找暑期实习,3月份分别投了百度和腾讯的实习简历,都止步于笔试,总结的主要原因有两点:基础知识不扎实,缺乏项目经验.后来到拉勾网等网站上寻找实习,看了很多家,都还是处于观望状态.后来参加了武汉实习吧在大 ...

随机推荐

  1. 常用的获取时间差的sql语句

    "select count(*) from [注册] where datediff(day,time,getdate())<1";//获取当天注册人员数 sql=" ...

  2. 必备技能:分清楚DOM的attribute和property

    分清楚DOM的attribute和property,用JQ的时候分清楚attr,和prop方法,网上有很多大神的总结,我就不列举了.

  3. android 第一个程序的编写

    移通152余继彪 需求分析:输入两个数字,让他们相乘,然后得出结果 首先建立一个android项目 在 layout中建立第一个界面 该界面有四个组件,两个editText 一个TextView,一个 ...

  4. python mysql 更新和插入数据无效

    注意,在删除和增加后必须执行conn.commit()才有效,否则操作无效.

  5. bcopy函数

    函数原型:void bcopy(const  void  *src,  void  *dest,  int  n) 头文件:#include <string.h> 函数功能:将src指针指 ...

  6. pads 扇出

    1 选择BGA器件 2.扇出设置 3 安全间距问题 4 可以区域扇出也可以多点扇出

  7. android广播接收器BroadcastReceiver

    首先看一下什么是 BroadcastReceiver BroadcastReceiver:直译是"广播接收者",所以它的作用是用来接收发送过来的广播的. 那我们有必要知道:什么是广 ...

  8. swiper的使用

    最近要用html5制作可以一屏一屏向上滑动的页面,发现大家使用swiper插件的较多,所以试了试,发现做出来的效果还不错,喜欢的朋友可以参考一下自己动手做啦. 1.首先我们要引入4个文件: <h ...

  9. ipvsadm命令使用方法

    由于LVS(IPVS)是工作在内核空间的,因此要在用户空间对其进行配置和管理就要用到ipvsadm,ipvsadm是LVS在用户空间的管理命令. 一般在安装linux(CentOS6.5)时该命令是为 ...

  10. [dijkstra+heap优化] 模板

    var n,m,s,i,j,x,y,z,l,tot :longint; pre,last,other,len :..] of longint; heap,d,pl :Array[..] of long ...