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

Demo_MakeTable.m (生成 Hash 表)

%========================================
%***********************************
%******* 设定参数: *****************
%******* l : hash表个数 ********
%******* k : 各表关键字个数 *******
%=========================================
clear all; close all; clc;
l = 3;
k = 15;
sData = textread('./Data/data.txt', '%s');
n = length(sData);
Data = false(n, 128);
for i = 1 : n
Data(i, :) = sData{i} - '0';
end
clear sData; Tables = lsh_1norm(l, k, Data);
save(['.\Data\' num2str(l) '_' num2str(k) '_Tables'], 'Tables');
% cd ./ErrorCompute
% Demo_ErrorStat
%% Write Hash keys and the Index
% 多线程
% matlabpool local 10
% for i = 1 : l
% fprintf('第 %d 个哈希表.\n', i);
% Write_Hash_Index(k, Tables(i), i);
% end
% matlabpool close

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

function T2 = lsh_1norm(l, k, yy)
%==================================
% parameters setting && getting
% [n d] = size(x);
%==================================
%************ 数据集预处理 : 转 hamming 空间(维度小于100时使用) ********
% fprintf('数据集转换到 Hamming space.\n');
% tic
% x = x'; % n x d (d < 100)
% C = max(x(:));
% dim = size(x);
% yy = false(dim(1), dim(2) * 255);
% for i = 1 : dim(1)
% for j = 1 : dim(2)
% oneO = false(1,C);
% oneO(1:x(i,j)) = 1;
% yy(i,(j-1)*C+1 : (j-1)*C+C) = oneO;
% end
% end
% clear oneO x;
% toc
% fprintf('转换 Hamming space 完成.\n');
%==================================
fprintf('初始化 %d 个 Hash 表...\n', l);
% matlabpool local 10
% 可并行
for i = 1 : l
% creat and init Tables[i] = f(k, x);
T1(i) = createTable(k, yy);
end
% matlabpool close
fprintf('初始化完成。\n');
%=====================================
tic;
matlabpool local 10
% save the index of feature data
% insert(T, x);
for i = 1 : l
fprintf('数据插入第 %d 个hash表\n', i);
T2(i) = insert_data(T1(i), yy);
end
matlabpool close
toc;
% clc; %======================================

createTable.m

function T = createTable(k, x)
% M = size(x,1)+17; % length of second hashTable (hashTable2)
M = 587474;
d = size(x, 2); select_d = unidrnd(d, 1, k);
I.d = select_d;
% I.threshold = unifrnd(0, 1, 1, k) * 255; % value interval [0 255]
I.k = k;
T.I = I;
T.randDigits = unidrnd(M, 1, k);
T.buckets = [];
T.index = {};
T.hashTable2 = cell(M,1);

insert_data.m

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

Demo_computeError.m (测试精确度)

%  clear all; clc;
p = 1;
load(['..\Data\3_15_Tables.mat']);
load('..\Data\data.mat');
load('..\Data\query.mat');
Data = Data';
avgErr = zeros(1, 50);
MissSum = zeros(1, 50);
picErr = zeros(1,50); picErr(1) = 0.982; for K = 1 : 10
MissCnt = 0;
ratioCnt = 0;
fid = fopen(['K_' num2str(K) '.txt'], 'w');
for i = 1 : length(Q) % the ith input.
% fprintf(fid, '%-5d', i);
% fprintf([num2str(i) ' ']);
q = Q(i,:)';
[Id1, Mis] = LSH_Search(q', K, Tables, Data, p);
if Mis
MissCnt = MissCnt + 1;
fprintf(fid, 'Miss\n');
continue;
end
% num = num + 1;
% imwrite(uint8(input),['.\Data\','query_subset2\',num2str(num),'.bmp']);
Id2 = Linear_Search(q, K, Data, p);
Dlsh = lp_norm(q, Data(:, Id1), p);
Dcst = lp_norm(q, Data(:, Id2), p);
id = Dlsh == Dcst;
ratio = Dcst ./ (Dlsh + 0.00002);
ratio(id) = 1;
% for j = 1 : K
% fprintf(fid, '%-8.2f', ratio(j));
% end
fprintf(fid, 'error: %8.3f\n', ratio(K));
ratioCnt = ratioCnt + ratio(K);
end
fprintf(fid, 'Hit times: %-5d Avg. error: %.3f\n', length(Q)-MissCnt, ratioCnt/(length(Q)-MissCnt));
avgErr(K) = ratioCnt/(length(Q)-MissCnt);
fprintf(fid, 'Miss times: %-5d Miss ratio: %.3f', MissCnt, MissCnt/length(Q));
MissSum(K) = MissCnt;
picErr(K) = ratioCnt / (length(Q)-MissCnt);
fclose(fid);
end
% figure,plot(1:50,avgErr,'-r.','MarkerFaceColor','g'),
% xlabel('number of K'),ylabel('Error'),title('Error of LSH');
% figure, plot(1:50,MissSum/146,'-r.','MarkerEdgeColor','k'),
% xlabel('number of K'),ylabel('Miss ratio'),title('Qurey miss of LSH'); figure,plot(1:10,picErr(1:10),'-r.','MarkerFaceColor','g'),
xlabel('number of K'),ylabel('Error'),title('Error of LSH');

Linear_Search.m

function Index = Linear_Search(q, K, DataSet, p)

D = feval('lp_norm', q, DataSet, p);
[~, id] = sort(D);
Index = id(1 : K);

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

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

lookup.m (LSH 查找)

function Index = lookup(T, q) % x can be removed
%========================================================
%************ 参数解释: ***********************
%************ T : 哈希表 ***********************
%************ x : 总数据集 **********************
%************ q: 查询
%
%======================================================== %========================================================
index = [];
% 可并行
for i = 1 : length(T)
tem = getIndex(T(i), q);
index = [index tem];
end
Index = unique(index);

getIndex.m

function tableiIndex = getIndex(T, x0)

M = length(T.hashTable2);
tableiIndex = []; seq01_x = x0(:, T.I.d);
index_x = mod(sum(bsxfun(@times, seq01_x, T.randDigits),2), M) + 1; if ~isempty(T.hashTable2{index_x})
index_bucket = T.hashTable2{index_x};
%******************************************
%for i = 1 : length(index_bucket)
%******************************************
uni_index_bucket = index_bucket(find(all(bsxfun(@eq, seq01_x, T.buckets(index_bucket, :)), 2)));
for i = 1 : length(uni_index_bucket)
tableiIndex = [tableiIndex T.index{uni_index_bucket(i)}];
end
end

Linear_Search.m (线性查找)

function Index = Linear_Search(q, K, DataSet, p)

D = feval('lp_norm', q, DataSet, p);
[~, id] = sort(D);
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. sC#进阶系列——WebApi 接口参数不再困惑:传参详解

    原文:http://www.cnblogs.com/landeanfen/p/5337072.html 一.get请求 对于取数据,我们使用最多的应该就是get请求了吧.下面通过几个示例看看我们的ge ...

  2. IT公司100题-32-交换元素,使数组差最小

    问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...

  3. goldengate 12c 12.2 新特性(updated)

    GoldenGate 12.2已经提供下载,增加了不少新特性 1. 异构配置加强不在需要sourceDefs和AssumeTargetDefs文件,在队列文件中已经包含metadata信息,比如tab ...

  4. github的注册过程

    带着疑问打开了github.这是一个神奇的网站,因为它到处都是英语,对于我这种英语盲这简直太痛苦了.借助了百度翻译,我还是马马虎虎的完成了github的制作. 首先在它的登录界面下面有一个sign u ...

  5. 查找SAP标准程序用户出口及BADI的方法

    查找SAP标准事务代码中使用的BADI: 在SE24中,查看类对象CL_EXITHANDLER,在其方法(Methods)GET_INSTANCE 的第14行打断点,之后运行事务代码: 当有BADI将 ...

  6. 实时刷新Winform中Label的Text

    最直白的例子: private void btnStart_Click(object sender, EventArgs e) { ; ) { labelTime.Text = i.ToString( ...

  7. React Native组件之Text

    React Native组件之Text相当于iOS中的UILabel. 其基本属性如下: /** * Sample React Native App * https://github.com/face ...

  8. 12-1 mysql的增删改减

    增加数据:insert into 表名 values('','');insert into 表名(列名) values('');注意:1.如果添加 得数据是字符串,需要加'',其他类型不要加. 2.添 ...

  9. Java技术的特点

    Java技术是一套完整的IT行业解决方案,其中包含了很多技术.最初是从解决家电设备联网通讯的方案发展起来的,其特点适用于Internet,于是在Internet广泛应用的环境下,迅速发展成为一种计算机 ...

  10. C++中 destory() 和deallocate()以及delete函数的相关性和区别性

    这里非常的绕口  需要仔细的来看看: destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备 deallocate():真正的释放一个内存 ...