#異常檢測——基於類似度的方法html
主要內容包括:python
「異常」一般是一個主觀的判斷,什麼樣的數據被認爲是「異常」的,須要結合業務背景和環境來具體分析肯定。
實際上,數據一般嵌入在大量的噪聲中,而咱們所說的「異常值」一般指具備特定業務意義的那一類特殊的異常值。噪聲能夠視做特性較弱的異常值,沒有被分析的價值。噪聲和異常之間、正常數據和噪聲之間的邊界都是模糊的。異常值一般具備更高的離羣程度分數值,同時也更具備可解釋性。
在普通的數據處理中,咱們經常須要保留正常數據,而對噪聲和異常值的特性則基本忽略。但在異常檢測中,咱們弱化了「噪聲」和「正常數據」之間的區別,專一於那些具備有價值特性的異常值。在基於類似度的方法中,主要思想是異常點的表示與正常點不一樣算法
基於距離的方法是一種常見的適用於各類數據域的異常檢測算法,它基於最近鄰距離來定義異常值。 此類方法不只適用於多維數值數據,在其餘許多領域,例如分類數據,文本數據,時間序列數據和序列數據等方面也有普遍的應用。
基於距離的異常檢測有這樣一個前提假設,即異常點的 k kk 近鄰距離要遠大於正常點。解決問題的最簡單方法是使用嵌套循環。 第一層循環遍歷每一個數據,第二層循環進行異常判斷,須要計算當前點與其餘點的距離,一旦已識別出多於 k kk 個數據點與當前點的距離在 D DD 以內,則將該點自動標記爲非異常值。 這樣計算的時間複雜度爲O ( N 2 ) O(N^{2})O(N2),當數據量比較大時,這樣計算是及不划算的。 所以,須要修剪方法以加快距離計算。dom
在基於單元格的技術中,數據空間被劃分爲單元格,單元格的寬度是閾值D和數據維數的函數。具體地說,每一個維度被劃分紅寬度最多爲 D 2 ⋅ d \frac{D}{{2 \cdot \sqrt d }}2⋅dide
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PrxOTupS-1611237077193)(img/UWiX5C7kCHx5yX7O9yQm9F1ndg-QgMqS3BAwIWPB40k.original.fullsize-1609839833441.png)]svg
以二維狀況爲例,此時網格間的距離爲 D 2 ⋅ d \frac{D}{{2 \cdot \sqrt d }}2⋅d函數
惟一沒法直接得出結論的是 L 2 L_{2}L2 中的單元格。 這表示特定單元中數據點的不肯定性區域。 對於這些狀況,須要明確執行距離計算。 同時,能夠定義許多規則,以便當即將部分數據點肯定爲異常值或非異常值。 規則以下:學習
此過程的第一步是將部分數據點直接標記爲非異常值(若是因爲第一個規則而致使它們的單元格包含 k kk 個點以上)。 此外,此類單元格的全部相鄰單元格僅包含非異常值。 爲了充分利用第一條規則的修剪能力,肯定每一個單元格及其 L 1 L_{1}L1 鄰居中點的總和。 若是總數大於 k kk ,則全部這些點也都標記爲非離羣值。測試
接下來,利用第二條規則的修剪能力。 對於包含至少一個數據點的每一個單元格 A AA,計算其中的點數及其 L 1 L_{1}L1 和 L 2 L_{2}L2 鄰居的總和。 若是該數字不超過 k kk,則將單元格A AA 中的全部點標記爲離羣值。 此時,許多單元可能被標記爲異常值或非異常值。ui
對於此時仍未標記爲異常值或非異常值的單元格中的數據點須要明確計算其 k kk 最近鄰距離。即便對於這樣的數據點,經過使用單元格結構也能夠更快地計算出 k kk 個最近鄰的距離。考慮到目前爲止還沒有被標記爲異常值或非異常值的單元格A AA。這樣的單元可能同時包含異常值和非異常值。單元格 A AA 中數據點的不肯定性主要存在於該單元格的 L 2 L_{2}L2 鄰居中的點集。沒法經過規則知道 A AA 的 L 2 L_{2}L2 鄰居中的點是否在閾值距離 D DD 內,爲了肯定單元 A AA 中數據點與其L 2 L_{2}L2 鄰居中的點集在閾值距離 D DD 內的點數,須要進行顯式距離計算。對於那些在 L 1 L_{1}L1 和 L 2 L_{2}L2 中不超過 k kk 個且距離小於 D DD 的數據點,則聲明爲異常值。須要注意,僅須要對單元 A AA 中的點到單元A AA的L 2 L_{2}L2鄰居中的點執行顯式距離計算。這是由於已知 L 1 L_{1}L1 鄰居中的全部點到 A AA 中任何點的距離都小於 D DD,而且已知 L r Lr