跳过正文
  1. Posts/

局部敏感哈希算法(Locality Sensitive Hashing)初探

·7 分钟
目录

前言:
#

其实有了前文simhash算法的基础,局部敏感hash算法已经不存在理解上的问题了吧。。。毕竟simhash算法应该是局部敏感哈希算法的一种。。所以我就直接转载几篇我认为比较好的文档结合一下好了。。。会把比较重要的概念或者定义标记重点。

局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段时间找工作时接触到的一种衡量文本相似度的算法。局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论依据并且在高维数据空间中表现优异。它的主要作用就是从海量的数据中挖掘出相似的数据,可以具体应用到文本相似度检测、网页搜索等领域。

1. 基本思想
#

局部敏感哈希的基本思想类似于一种空间域转换思想,LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的****它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。

哈希函数,大家一定都很熟悉,那么什么样的哈希函数可以具有上述的功能呢,可以保持数据转化前后的相似性?当然,答案就是局部敏感哈希。

回到顶部

2. 局部敏感哈希LSH
#

局部敏感哈希的最大特点就在于保持数据的相似性,我们通过一个反例来具体介绍一下。

假设一个哈希函数为Hash(x) = x%8,那么我们现在有三个数据分别为255、257和1023,我们知道255和257本身在数值上具有很小的差距,也就是说它们在三者中比较相似。我们将上述的三个数据通过Hash函数转换:

Hash(255) = 255%8 = 7;

Hash(257) = 257%8 = 1;

Hash(1023) = 1023%8 = 7;

我们通过上述的转换结果可以看出,本身很相似的255和257在转换以后变得差距很大,而在数值上差很多的255和1023却对应相同的转换结果。从这个例子我们可以看出,上述的Hash函数从数值相似度角度来看,它不是一个局部敏感哈希,因为经过它转换后的数据的相似性丧失了。

我们说局部敏感哈希要求能够保持数据的相似性,那么很多人怀疑这样的哈希函数是否真的存在。我们这样去思考这样一个极端的条件,假设一个局部敏感哈希函数具有10个不同的输出值,而现在我们具有11个完全没有相似度的数据,那么它们经过这个哈希函数必然至少存在两个不相似的数据变为了相似数据。从这个假设中,我们应该意识到局部敏感哈希是相对的,而且我们所说的保持数据的相似度不是说保持100%的相似度,而是保持最大可能的相似度

对于局部敏感哈希“保持最大可能的相似度”的这一点,我们也可以从数据降维的角度去考虑。数据对应的维度越高,信息量也就越大,相反,如果数据进行了降维,那么毫无疑问数据所反映的信息必然会有损失。哈希函数从本质上来看就是一直在扮演数据降维的角色。

回到顶部

 3. 文档相似度计算
#

我们通过利用LSH来实现文档的相似度计算这个实例来介绍一下LSH的具体用法。

  3.1 Shingling
#

假设现在有4个网页,我们将它们分别进行Shingling(将待查询的字符串集进行映射,映射到一个集合里,如字符串“abcdeeee", 映射到集合”(a,b,c,d,e)", 注意集合中元素是无重复的,这一步骤就叫做Shingling, 意即构建文档中的短字符串集合,即shingle集合。),得到如下的特征矩阵:

其中“1”代表对应位置的Shingles在文档中出现过,“0”则代表没有出现过。

在衡量文档的相似度中,我们有很多的方法去完成,比如利用欧式距离、编辑距离、余弦距离、Jaccard距离等来进行相似度的度量。在这里我们运用Jaccard相似度。接下来我们就要去找一种哈希函数,使得在hash后尽量还能保持这些文档之间的Jaccard相似度,即:

我们的目标就是找到这样一种哈希函数,如果原来文档的Jaccard相似度高,那么它们的hash值相同的概率高,如果原来文档的Jaccard相似度低,那么它们的hash值不相同的概率高,我们称之为Min-hashing(最小哈希)。

  3.2 Min-hashing
#

Min-hashing定义为:特征矩阵按行进行一个随机的排列后,第一个列值为1的行的行号。举例说明如下,假设之前的特征矩阵按行进行的一个随机排列如下:

元素S1S2S3S4
0010
成功0011
1000
减肥1011
0101
最小哈希值:h(S1)=3,h(S2)=5,h(S3)=1,h(S4)=2.

为什么定义最小hash?事实上,两列的最小hash值就是这两列的Jaccard相似度的一个估计,换句话说,两列最小hash值同等的概率与其相似度相等,即P(h(Si)=h(Sj)) = sim(Si,Sj)。为什么会相等?我们考虑Si和Sj这两列,它们所在的行的所有可能结果可以分成如下三类:

(1)A类:两列的值都为1;

(2)B类:其中一列的值为0,另一列的值为1;

(3)C类:两列的值都为0.

特征矩阵相当稀疏,导致大部分的行都属于C类,但只有A、B类行的决定sim(Si,Sj),假定A类行有a个,B类行有b个,那么sim(si,sj)=a/(a+b)。现在我们只需要证明对矩阵行进行随机排列,两个的最小hash值相等的概率P(h(Si)=h(Sj))=a/(a+b),如果我们把C类行都删掉,那么第一行不是A类行就是B类行,如果第一行是A类行那么h(Si)=h(Sj),因此P(h(Si)=h(Sj))=P(删掉C类行后,第一行为A类)=A类行的数目/所有行的数目=a/(a+b),这就是最小hash的神奇之处。

Min-hashing的具体做法可以根据如下进行表述:

返回到我们的实例,我们首先生成一堆随机置换,把特征矩阵的每一行进行置换,然后hash function就定义为把一个列C hash成一个这样的值:就是在置换后的列C上,第一个值为1的行的行号。如下图所示:

  图中展示了三个置换,就是彩色的那三个,我现在解释其中的一个,另外两个同理。比如现在看蓝色的那个置换,置换后的Signature Matrix为:

  然后看第一列的第一个是1的行是第几行,是第2行,同理再看二三四列,分别是1,2,1,因此这四列(四个document)在这个置换下,被哈希成了2,1,2,1,就是右图中的蓝色部分,也就相当于每个document现在是1维。再通过另外两个置换然后再hash,又得到右边的另外两行,于是最终结果是每个document从7维降到了3维。我们来看看降维后的相似度情况,就是右下角那个表,给出了降维后的document两两之间的相似性。可以看出,还是挺准确的,回想一下刚刚说的:希望原来documents的Jaccard相似度高,那么它们的hash值相同的概率高,如果原来documents的Jaccard相似度低,那么它们的hash值不相同的概率高,如何进行概率上的保证?Min-Hashing有个惊人的性质:

  就是说,对于两个document,在Min-Hashing方法中,它们hash值相等的概率等于它们降维前的Jaccard相似度。

  注:在上述例子中,我们还可以采取欧氏距离等相似度量来替代Jaccard相似度,这时候LSH相应的策略也需要进行改变,从而使得最后的hash值等于降为前的相似度。

局部敏感hash的一般定义

局部敏感hash实质上是满足一定条件的函数簇,上面介绍只是一个基于Jaccard的例子,实际上还有面向其他距离的LSH。

令d1<d2是定义在距离测定d下得两个距离值,如果一个函数族的每一个函数f满足:

(1)如果d(x,y)<=d1,则f(x)=f(y)的概率至少为p1,即P(f(x)=f(y)) >= p1;

(2)如果d(x,y)>=d2,则f(x)=f(y)的概率至多为p2,即p(f(x)=f(y)) <= p2.

那么称F为(d1,d2,p1,p2)-敏感的函数族。实际上我们之前的最小hash函数族是(d1,d2,1-d1,1-d2)-敏感的。

局部敏感hash族还可以进行放大处理,已获得更高的准确率和召回率,当然也有面向其他距离的LSH。本文的东西全部源自参考文献的课本,有兴趣可以好好读一下这本书。

相关文章

蓄水池抽样算法概述(Reservoir Sampling Algorithm)[转载]

·3 分钟
面京东被这个问题卡了QAQ,来补补这方面的课。 转自:链接 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数。其时间复杂度为 O(N),包含下列步骤 (假设有一维数组 S, 长度未知,需要从中随机选择 k 个元素, 数组下标从 1 开始), 伪代码如下:

软件体系结构复习笔记

·7 分钟
Cha1 1软件架构概念: 2 是系统的一个或多个结构,它们由软件组件,组件的外部可见属性以及组件之间的关系组成。 3 组件的外部可见属性是指其他组件对该组件所做的假设。 4软件架构的多个结构: 5 静态的角度: 6 模块结构 7 分析类结构 8 类结构 9 动态的角度: 10 进程结构 11 数据流 12 控制流 13 使用结构 14 调用结构 15 层次结构 16 部署的角度: 17 物理结构 18 19架构不止是功能需求的结果 20 21Ch2: 22需求包含三要素:功能,质量,限制条件 23质量属性:系统在其生命周期过程中所表现出来的各种特征 24质量属性的关系: 25 一个质量属性的获取对其他质量属性可能产生正面或者负面的影响。 26 任何质量属性都不可能在不考虑其他属性情况下单独获取。 27质量属性举例: 28 运行时可见属性:性能,可用性,安全性 29 维护时可见属性:可修改,可扩展,可移植 30 易用性: 31 可学习性 32 可记忆性 33 错误避免 34 错误处理 35 满意度 36 37质量场景创建的参与人员: 38 最终用户 39 系统管理员 40 维护人员 41 客户 42 开发组织 43构架本身的质量属性: 44 一致性 45 正确性和完整性 46 可构建性 47生成质量属性场景的目的和意义: 48 帮助构架师生成有意义的质量属性需求 49 使质量属性需求的描述规范化 50 某一场景是一类场景的代表,系统将以完全相同的方式做出反应。 51构架的商业属性(限制): 52 上市时间 53 成本和收益 54 预期系统生命周期长短 55 目标市场 56 推出计划 57 与老系统的集成 58 59第三章: 60软件架构样式的种类: 61 以数据为中心 62 数据流 63 虚拟机 64 调用-返回 65 独立组件 66 C/S 67构架的异质性: 68 局部异质 69 层次异质 70 并行异质 71 72ISO/OSI七层参考模型: 73 应用层 74 表示层 75 会话层 76 传输层 77 网络层 78 数据链路层 79 物理层 80 81软件框架: 82 提取特定领域软件的共性部分形成的体系结构。 83框架和架构的关系: 84 框架不是构架。 85 构架确定了系统整体结构、层次划分、不同部分之间的协作等设计老驴。 86 框架比构架更具体,更偏重于技术。 87 一个框架对应一个架构,一个架构可以有多个框架。 88 89第四章: 90架构战术:影响质量属性的设计决策。 91架构策略:架构中所采用的战术的集合。 92可用性的战术: 93 错误检测的战术: 94 回声 95 心跳 96 异常 97 错误恢复的战术: 98 表决 99 主动冗余 100 被动冗余 101 备件 102 状态再同步 103 检查点/回滚 104 错误预防的战术: 105 进程监视器 106 从服务中删除 107 事物 108可修改性的战术: 109 局部化修改的战术: 110 维持语义一致性 111 预期期望的变更 112 泛化模块 113 限制可能的选择 114 防止连锁反应的战术: 115 信息隐藏 116 维持现有的接口 117 添加结构 118 添加适配器 119 提供一个占位程序 120 推迟绑定时间的战术: 121 运行时注册 122 配置文件 123 多态 124 组件更换 125 遵守已定义的协议 126实施性能的战术: 127 影响响应时间的两个基本因素: 128 资源消耗 129 阻塞时间: 130 资源争用 131 资源的可用性 132 对其他计算的依赖性 133 控制对资源需求的战术: 134 减少处理一个事件所需要的资源: 135 提高计算效率 136 减少计算开销 137 减少需要同时处理: 138 管理事件率 139 控制采样频率 140 控制系统的使用: 141 限制执行时间 142 限制队列的大小 143 资源管理的战术: 144 引入并发 145 维持数据或计算的多个副本 146 增加可用资源 147 资源仲裁常见的调度策略: 148 先进/先出 149 固定优先级:语义重要性;时限时间单调;速率单调 150 动态优先级调度:轮转;时限时间最早优先 151 静态调度 152实施安全性的战术: 153 用于抵抗攻击的战术: 154 对用户进行身份验证 155 对用户进行授权 156 维护数据的机密性 157 维护完整性 158 限制暴露的信息 159 限制访问 160 检测攻击的战术: 161 从攻击中恢复的战术: 162 回复状态 163 识别攻击者 164易用性的战术: 165 运行时战术: 166 维持任务的一个模型 167 维护用户的一个模型 168 维护系统的一个模型 169 设计时战术: 170软件架构样式与战术的关系: 171 软件架构样式是从战略层面解决质量问题,战术是从具体部署上给猪解决质量问题的局部策略。 172 173 174第五章:设计构架 175基于构架的开发步骤: 176 为软件系统创建一个商业案例 177 弄清系统需求 178 构建构架 179 正确表述此构架,并与有关各方进行交流 180 对此构架进行分析和评价 181 实现基于构架的系统并保证与构架相一致 182 系统维护时,构架文档应同步维护 183构架驱动的因素: 184 功能 185 质量 186 部分限制条件(限制条件的某个子集) 187 188良好架构的评判原则(判断题常考): 189 设计构架过程的建议: 190 架的设计应该由一门设计师来完成 191 设计师应该全面掌握对系统的技术需求,以及对各项定性指标的优先级清单。 192 构架的文档完备,并蚕蛹所有人员认可的文档形式。 193 构架设计文档应让各风险承担者积极评估。 194 通过对构架分析,得出明确的定性与定量指标。 195 构架设计应该有助于具体实现。 196 允许构架带来一定的资源争用,并给出可行的解决方案。 197 关于构架的结构的建议: 198 构架由定义良好的模块组成,各个模块的功能划分应该基于信息隐藏。 199 模块的划分应体现出相互独立的原则。 200 把计算机基础结构的特性封装在一定的模块 201 构架尽量不依赖某个特定版本的商品产品或工具。 202 产生数据的功能和使用数据的功能应分属于不同的模块。 203 对并发系统,构架应充分考虑进程与模块结构的不对应。 204 进程编写要考虑到与特定处理器的关系,并容易改变关系。 205 构架应尽量采用一些已知的设计模式。 206 207ADD构架设计的步骤: 208 样本输入 209 选择要分解的模块 210 根据下列5个步骤对模块进行求精(重点): 211 从具体的质量场景和功能需求集合中选择构架驱动因素。 212 选择满足构架驱动因素的构架模式。 213 实例化模块并根据用例分配功能,使用多个视图进行表示 214 定义子模块的接口 215 验证用例和质量场景并对其进行求精,使它们称为子模块的限制。 216 对需求进一步分解的每个模块重复上述步骤。 217创建骨架系统: 218 思想:提供一种基本能力,以一种对项目有利的顺序实现系统的功能。 219 好处: 220 提高开发效率,鼓舞士气。 221 能更早发现复杂的依赖关系。 222 使开发人员更多关注最难实现的部分。 223 能够缩短系统集成时间,降低其成本,并使集成成本更明确。 224 便于评审和测试。 225 步骤: 226 实现处理构架组件交互的软件部分 227 选择组件逐步添加到系统中。 228 逐步进行测试。 229架构师的职责: 230 了解所在组织的业务目标,使架构更好地支持业务目标。 231 规划产品的开发与严禁 232 规划和建设架构级的重用etc 233 234 235分析软件构架的原因(重要): 236 它是风险承担者之间的交流平台,是早期设计决策的体现,是可传递的模型。 237 软件质量不可能在软件开发的最后阶段追加上去,必须在设计之初就考虑到。 238 239第七章: 240构架评审: 241 成本: 242 人员时间成本 243 构架评审部门的组织开销 244 构架评审部分要求高级设计人员参与的代价(不就是人员时间成本吗。。。 245 收益: 246 及早发现构架中存在的问题 247 构架的改进 248 财务收益 249 强制位评审做准备 250 捕获构架设计的基本思想 251 验证需求的有效性 252评审实施: 253 按问题的重要性进行分类 254 强调那些与偶家相符或相悖的重要问题 255 必须记载评审中所提的每个问题 256构架评审的主要指导原则: 257 把由独立部门实施的正规的构架评审作为项目开发周期规划的一部分。 258 选择评审的最佳时间,尽早预审一次。 259 选择恰当的评审技巧 260 签署评审合同 261 限制所要品神的质量属性的个数 262 要保证评审小组中有构架方面的专家,领域专家,资料员,后勤员。 263 一定要有系统设计师。 264 收集各种场景数据,并在此基础上形成评审清单。 265 266第八章: 267架构权衡分析法(ATAM): 268 特点:不仅可以揭示出构架满足特定质量目标的情况,而且可以让我们更清楚地认识质量目标之间的联系。 269 输入:用场景集合捕获的质量要求。 270 输出: 271 简介的框架表述 272 表述清楚的业务目标 273 构架决策到质量需求的映射 274 所确定的敏感点和权衡点集合 275 有风险决策和无风险决策 276 风险主题的集合 277 阶段: 278 评估小组和项目决策者共同决定评估细节 279 评估小组收集信息和分析 280 风险承担着参与评估 281 评估小组自我检查和改进,提交书面报告 282 步骤(重点): 283 ATAM方法的表述 284 商业动机的表述 285 构架的表述 286 对构架方法进行分类 287 生成质量属性效用树 288 分析构架方法 289 集体讨论并确定场景优先级 290 再次分析构架方法 291 结果的表述 292 293第九章: 294 文档: 295 目的与作用:让不同的风险承担者都能快速找到和理解他们需要的信息。 296 基本原则:从读者的角度出发。