最近邻问题(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 他映射到的空间维度,你要根据你的样本量大体的估一下或者作测试。3d
lSH的直观理解
像左图中的c点划分错误的状况下,你想让你的检索尽可能的准确怎么办,这个事情是能够作的,须要付出的代价是你计算资源或时间的成本,能够采用屡次划分的方式,而后根据这几个超平面的检索结果,取他们的并集。
LSH之类似网页查找
词(特征)的权重是指这个词对这句话的重要度(tf-idf)。乘以权重时,原来是1的位置直接乘以权重,原来是0的位置用-1乘以权重。
有用的理由:若是如今去掉灰色这个词,对最后的结果的正负性没有影响,只有你去掉那些词的时候对结果的正负性可能会有影响呢?是否是w权重比较大的词!!就是说,若是在原来的文本中剔除一些或者加入一些不是那么重要的字的话,那我认为没有影响,除非你剔除或加入额外分词重要的词,那这个时候可能就会认为这是不一样的句子。cdn
SimHash可用库
LSH经常使用库
ANN之K-means Tree
每一个非叶子节点都是一个簇的聚类中心点。
若是你如今要找回Top 2T,若是不知足他会怎么作呢?他会回溯回去,回溯到上一级大团,而后去找聚类中心第二接近的,由于聚类中心他们总会有一个远近,因此他会对他们作一个排序(rank),拿出来那些比较接近的小的簇,而后再去求并。blog
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库