隨機投影森林 一種近似最近鄰方法(ANN)

2021-08-02 17:36:01 字數 950 閱讀 5708

當資料個數比較大的時候,線性搜尋尋找knn的時間開銷太大,而且需要讀取所有的資料在記憶體中,這是不現實的。因此,實際工程上,使用近似最近鄰也就是ann問題。其中一種方法是利用隨機投影樹,對所有的資料進行劃分,將每次搜尋與計算的點的數目減小到乙個可接受的範圍,然後建立多個隨機投影樹構成隨機投影森林,將森林的綜合結果作為最終的結果。

​建立一棵隨機投影樹的過程大致如下(以二維空間為例):

隨機選取乙個從原點出發的向量,與這個向量垂直的直線將平面內的點劃分為了兩部分,將屬於這兩部分的點分別劃分給左子樹和右子樹。在數學計算上,是通過計算各個點與垂直向量的點積完成這一步驟的,點積大於零的點劃分到左子樹,點積小於零的點劃分到右子樹。注意一點,圖中不帶箭頭的直線是用於劃分左右子樹的依據,帶箭頭的向量是用於計算點積的。這樣,原有的點就劃分為了兩部分

但是此時乙個劃分結果內的點的數目還是比較多,因此繼續劃分。再次隨機選取乙個向量,與該向量垂直的直線將所有點進行了劃分。

注意一點,此時的劃分是在上一次劃分的基礎上進行的。​也就是說現在圖中的點已經被劃分成了四部分,對應於一棵深度為2,有四個葉節點的樹。以此類推繼續劃分下去,直到每個葉節點中點的數目都達到乙個足夠小的數目。注意這棵樹並不是完全樹。

利用這棵樹對新的點進行最近鄰計算時,首先通過計算該點與每次劃分所用向量的點積,來找到其所屬於的葉節點,然後利用這個葉節點內的​​這些點進行最近鄰演算法的計算。這個過程是一棵隨機投影樹的計算過程,利用同樣的方法,建立多個隨機投影樹構成隨機森林,將森林的總和結果作為最終的結果。

python中可以完成這個功能的模組包括rpforest和sklearn.neighbors中的lshforest。​

from: 

Kotlin生成隨機唯一訂單的一種方法

生成隨即訂單字串格式為兩位隨機大寫字母 年份後兩位 月份 小時 分 4位隨機流水號 object diceutils 生成訂單號 隨機大寫字母 年份後兩位 月份 小時 分 4位隨機數 fun getorderid string else if transacation 9999 var trans ...

隨機獲取一種顏色值的三種方法

閒來無事,想起了初中時流行的山寨手機的跑馬燈。於是想動手自己做乙個。那會的跑馬燈都是紅藍兩色居多,俗。我這種二十一世紀的潮流人士肯定得做那種千百種顏色的。奼紫嫣紅,美哉。這樣做的話,顏色值就不能乙個乙個手寫了,於是想做成不確定的顏色。第一種寫法 function colorrandom 第二種寫法 ...

一種快速可預製的隨機數組產生方法

在工程軟體的設計和安全系統設計中,建立模型 產生密碼經常需要使用到隨機數組。然而計算機不會產生絕對隨機的隨機數,計算機只能產生 偽隨機數 其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。偽隨機數並不是假隨機數,而...