最近鄰問題(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庫