海量数据索引与近似最近邻随记

最近邻问题(NN)

将次数看成向量,然后我们就可以比对向量的距离(欧式距离,余弦距离)。数据中会有一些异常点,这些异常点会导致结果的不稳定。

这种思想非常的不稳定,因为他只基于一个样本来做最后类别的判定。

K最近邻算法(NN => KNN)

少数服从多数。

距离准则

Jaccard:并不是每个人都会点击或者购买这么高强度的行为,因为购买是需要花钱的。我们能采集到的数据量比较的数据,实际上是用户的一些隐性的行为,比如他在这个页面停留了多久(时间阈值,比如30秒),超过阈值我就认为他有兴趣。它不像打分数据一样有严格的连续值,比如0-10这样一个严格的连续取值,它只有0,1(有或没有)的这种行为,看过或没看过,感兴趣或不感兴趣。Jaccard是算两个向量共同是1的部分或者共同是0的部分。

近似最近邻算法(KNN => ANN)

预先对数据做划分会面临一个问题,可能会划分错误,无论怎么划分都有可能将本身比较接近的一些点给划分开。所以他会损失掉一部分准确度,当然这部分损失在你的承受范围内的。在损失一些准确度的情况下,用一部分的空间去提升速度,实际上就是预先对数据做了划分和索引。这种操作在工业界并不是致命的,比如淘宝上的找相似或者找同款功能。

局部铭感度哈希

生成2进制串,保证距离特性

在高维空间比较接近的会落到同一个桶里面。

LSH第一步做哈希,即把这些图片都分完桶了,LSH映射完之后,他会拿到你指定的个数的,例如指定的是k,那它就会拿到kbit的串,意味着你掉到了kbit这样一个串的桶里面。第一步是映射,映射做的事情就是对原始给定的高维向量,做一个映射,得到映射拿到的桶ID号。

第二步检索,检索做的是,首先他会去找桶里面其他的数据,LSHash这个库检索回来的张数是不确定的。当新的数据过来时,通过第一步的映射,一样会拿到一个桶的编号,到这个桶里面看看有多少张图片,将这个桶的图片取出来,计算看满不满足要求,如果桶里的图片不够,LSHash保证不了个数,所以这个库解决不了这个问题。在不够的情况下,通过计算二进制串的汉明距离,将与他汉明距离为1的这些桶编号全都拿回来。如果汉明距离为1的不够怎么办,它再取汉明距离为2的桶。、

注意:你要小心的设置LSH 他映射到的空间维度,你要根据你的样本量大致的估一下或者做测试。

lSH的直观理解

像左图中的c点划分错误的情况下,你想让你的检索尽量的准确怎么办,这个事情是可以做的,需要付出的代价是你计算资源或时间的成本,可以采用多次划分的方式,然后根据这几个超平面的检索结果,取他们的并集。

LSH之相似网页查找

词(特征)的权重是指这个词对这句话的重要度(tf-idf)。乘以权重时,原来是1的位置直接乘以权重,原来是0的位置用-1乘以权重。

有用的理由:如果现在去掉灰色这个词,对最后的结果的正负性没有影响,只有你去掉那些词的时候对结果的正负性可能会有影响呢?是不是w权重比较大的词!!就是说,如果在原来的文本中剔除一些或者加入一些不是那么重要的字的话,那我认为没有影响,除非你剔除或加入额外分词重要的词,那这个时候可能就会认为这是不同的句子。

SimHash可用库

LSH常用库

ANN之K-means Tree

每个非叶子节点都是一个簇的聚类中心点。

如果你现在要找回Top 2T,如果不满足他会怎么做呢?他会回溯回去,回溯到上一级大团,然后去找聚类中心第二接近的,因为聚类中心他们总会有一个远近,所以他会对他们做一个排序(rank),拿出来那些比较接近的小的簇,然后再去求并。

ANN之K-D Tree

DT决策树,它在做的事情是去找一个波动最大的维度,为什么要找方差最大的维度?方差最大的维度,意味着这个维度上的熵比较大或者是他的不确定性比较高,他的信息增益比较大,也就是他能够给我带来减小不确定的可能性最大。

二维用线做切分

三维用面做切分,从三个维度中找哪个是波动/方差最大的。

假设现在要与(6,1)最接近的3个点,首先是第一个维度6,在7的左侧,然后顺着左侧往下走,紧接着第二个维度1,判断在4的左侧还是右侧?在左侧,找到了(2,3)是离她最接近的点。然后沿着(2,3)这个叶子节点回溯到父节点(5,4),计算加上父节点满不满足3个,不满足,父节点还有一侧(4,7),再计算加上这个节点满不满足3个,发现满足,就不再回溯到上一个父节点。

K-means Tree VS K-D Tree

工程经验之ANN库

你可能感兴趣的:(海量数据索引与近似最近邻随记)