zoukankan      html  css  js  c++  java
  • 机器学习 —— 寻找相似项 局部敏感哈希

    本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/

    todo 本文未完善,还待修改

    许多问题可以被表述为寻找相似项。比如,有相似单词的网页 —— 用于重复检测、根据主题分类,
    购买了相似物品的用户,有相似特征的图像。
    这些问题可以被抽象为:
    给定:
    一组高维的数据 x1, x2, x3, ... 和计算两点距离的函数 d(x1, x2)。例如一组图像,每一图像就是一个表示颜色的长向量

    $$egin{bmatrix}
    1 & 2 & 3 & 0 & 1 & 2 & 3 & 4
    end{bmatrix}$$

    目标:
    找到所有距离小于给定阈值 s 的数据点对 (xi,xj)。 d(xi, xj) <= s
    最直观的方法是两个循环两两计算(xi,xj)的大小。但这样的时间复杂度是 O(n^2),在数据量很大的情况下不可接受。
    O(n)的方法:
    候选者思想
    Pass 1:把文档 hash 到桶里使得相似的文档 hash 到相同的桶里面
    Pass 2: 只对比 hash 到相同桶里的文档
    时间复杂度为 O(n)
    具体步骤:
    图 shingling_minHashing_localitySensitiveHashing
    1.Shingling : 把文档转换为集合
    最直观的方法将文档看成单词或重要单词的集合。但这样忽略掉了文档中单词的次序。
    k-shingle : 在文档中出现的一连串的 k 个 tokens。 token 可以是字母、单词或者其它东西
    例如 k = 2; 文档 D1 = abcab ,则 2-shingle 组成的集合是 S(D1) = {ab, bc, ca}
    为了压缩长的 shingle ,我们采用 hash 的方法,然后用文档的 k-shingle 的 hash 值来表示该文档。
    例如 hash(D1) = {1, 5, 7} --> ?? 这个怎么 hash 的? --> aa ab ac ba bb bc ca cb cc 分别 hash 为 0 1 2 3 4 5 6 7 8
    可以等价地把一个文档表示为 k-shingle 空间里的 0/1 向量 C ,每一个单独的 shingle 是一个维度。
    这样表示后,可以用 Jaccard similarity 来衡量两个文档的相似性
    $$sim(D_1, D_2) = |C_1 cap C_2|/|C_1 cup C_2|$$
    通常而言,对于小文档来说 k 取 5,对于大文档来说 k 取 10

    2.Min-Hashing : 把大集合转换为小签名并保持相似性
    把集合表示为位向量,用 bitwise AND 表示集合的交, bitwise OR 表示集合的并
    例如: C1= 10111; C2 = 10011
    交集的大小为 3, 并集的大小为 4
    Jaccard similarity = 3/4
    Distance d(C1,C2) = 1 - (Jaccard)
    图 document_shingles.png

    怎么 hash ?
    目标:找到一个 hash 函数 $h(dot)$ 使得
    1)如果两个文档的相似性 $sim(C_1, C_2)$ 很高,那么 $h(C_1) = h(C_2)$ 的概率也很高
    2)如果两个文档的相似性 $sim(C_1, C_2)$ 很低,那么 $h(C_1) e h(C_2)$ 的概率也很高

    显然这样的 hash 函数跟评价相似性的准则相关,其中有一个叫 Min-Hashing 的函数很适合Jaccard similarity 相似性准则
    Min-Hashing 方法:
    1)假设布尔数据矩阵的行被一个随机排列 $pi$ 重排(不真正重排数据矩阵,只是重排另一个表示它的行的下标的数组)
    2)定义一个 hash 函数 $h_pi(C) = $重排后第一个为1的行的新下标
    $h_pi(C) = min_pipi(C)$
    实现时可以这么做 --> 其实就是在表示随机排列的数组中取最小值且该值对应的数据矩阵的值不为 0:
    hash值初始化为无穷大,从上往下扫描列
    a.如果第r行为0,则什么都不做
    b.如果第r行为1,则将hash值置为原来 hash 值和当前随机排列里的值中的较小值
    3)定义 k 个这样的 hash 函数就可以把原来 m*n 的数据矩阵降维为 k*m
    示例:

    Min-Hashing 性质:
    $$Pr[h_pi(C_1) = h_pi(C_2)] = sim(C_1, C_2)$$
    可以这么简单理解,如果两个文档很相似,那么如果采用 Jaccard similarity 的话,把这两个文档
    中的单词按 k 个为一个单位乱序重排后,它们也应该很相似。示例如下,其中 Col/Col 表示原文档的相似性,
    Sig/Sig 表示原文档经几个 hash 函数后的签名的相似性

    3.Locality-Sensitive Hashing : 关注那些可能来自相似文档的签名对

  • 相关阅读:
    委托和泛型
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/senlie/p/3895646.html
Copyright © 2011-2022 走看看