LOF: Identifying Density-Based Local Outliers
Markus M. Breunig, Hans-Peter Kriegel, Raymond T. Ng, Jörg Sander
Proc. ACM SIGMOD 2000 Int. Conf. On Management of Data, Dalles, TX, 2000
局部離群因子(LOF):識別基於密度的局部異常值
摘要
對於許多KDD應用程序,例如檢測電子商務中的犯罪活動、發現罕見的實例或異常值,可能比發現常見的模式更有趣。現有的離群點檢測工作把離群點看作是一個二元屬性。在本文中,我們認為在許多情況下,為每個對象指定一個異常值的程度更有意義。這個程度稱為對象的局部離群因子(Local Outlier Factor, LOF)。它是局部的,因為程度取決於對象相對於周圍鄰域的隔離程度。我們給出了詳細的形式化分析,表明LOF具有許多理想的性質。通過使用真實世界的數據集,我們證明了LOF可以用來發現異常值,這些異常值似乎是有意義的,但是不能用現有的方法來識別。最后,對算法的性能進行了詳細的評估,結果表明,該算法是可行的。
關鍵詞:離群點檢測,數據挖掘
1. 引言
越來越多的數據被收集並存儲在數據庫中,這就需要有高效和有效的分析方法來利用數據中隱含的信息。數據庫中的知識發現(KDD)被定義為從數據中識別有效、新穎、潛在有用且最終可理解的知識的非平凡過程。
KDD中的大多數研究集中於尋找適用於數據集中相當大一部分對象的模式。然而,對於諸如偵查各種犯罪活動(例如電子商務中的犯罪活動)等應用而言,罕見事件、偏離多數或例外情況可能比常見的情況更有趣和有用。然而,在KDD社區中,發現這樣的異常和離群值還沒有像其他一些主題(如關聯規則)那樣受到重視。
近年來,對大數據集的離群點檢測進行了一些研究。雖然第2節將對這些研究進行更詳細的討論,但在此指出,大多數研究都將異常值視為二元屬性。也就是說,數據集中的對象是否是異常值。對於許多應用程序,情況更為復雜。為每個對象指定一個異常值的程度就變得更有意義了。
與離群點檢測相關的還有大量關於聚類算法的工作。從聚類算法的觀點來看,離群點是不在數據集聚類中的對象,通常稱為噪聲。然而,由聚類算法產生的噪聲集高度依賴於特定的算法及其聚類參數。只有少數方法與異常點檢測直接相關。一般來說,這些算法從更全局的角度考慮異常值,這也有一些主要的缺點。這些缺點將在第2節和第3節中詳細討論。此外,基於這些聚類算法,作為離群點的屬性也是二元的。
本文介紹了一種在多維數據集中尋找離群點的新方法。我們為數據集中的每個對象引入一個局部離群值(LOF),表示其離群程度。據我們所知,這是離群值的第一個概念,它也量化了對象的離群程度。離群因子是局部的,即只考慮每個對象的一個受限鄰域。我們的方法與基於密度的聚類松散相關。然而,我們的方法不需要任何顯式或隱式的集群概念。具體而言,我們在本文中的技術貢獻如下:
- 在介紹了LOF的概念之后,分析了LOF的形式化性質。我們證明了對於集群(也稱簇/聚類, cluster)中的大多數對象,它們的LOF大約等於1。對於任何其他對象,我們給出其LOF的上下界。這些邊界突出了LOF的本地特性。此外,我們還分析了這些邊界何時是緊的。我們確定對象類的邊界是緊的。最后,對於邊界不緊的對象,我們提供了更清晰的邊界。
- 對象的LOF基於MinPts的單個參數,MinPts是用於定義對象局部鄰域的最近鄰數。我們研究了這個參數如何影響LOF值,並給出了選擇MinPts值來尋找局部異常值的實用指南。
- 最后,我們給出了實驗結果,顯示了發現局部異常值的能力和性能。我們的結論是,使用LOF查找局部異常值是有意義和有效的。
論文的結構如下。在第二節中,我們討論了離群點檢測的相關工作及其缺點。在第3節中,我們詳細討論了離群值概念的動機,特別是離群值的局部視圖而不是全局視圖的優勢。在第4節中,我們將介紹LOF並定義其他輔助概念。在第五節中,我們深入分析了LOF的形式化性質。由於LOF需要單參數MinPts,在第6節中我們分析了參數的影響,並討論了選擇MinPts值進行LOF計算的方法。在第7節中,我們進行了廣泛的實驗評估。
2. 相關工作
以往關於離群點檢測的研究大多是在統計學領域進行的。這些研究大致可分為兩類。第一類是基於分布的,其中使用標准分布(如正態分布、泊松分布等)來最佳擬合數據。離群值的定義基於概率分布。已經為不同的場景開發了100多個此類測試,稱為不一致性測試。這類測試的一個主要缺點是,大多數使用的分布是單變量的。有些測試是多元的(例如多元正態異常值)。但是對於許多KDD應用程序,底層的分布是未知的。用標准分布擬合數據是昂貴的,而且可能不會產生令人滿意的結果。
統計學中的第二類離群值研究是基於深度的。每個數據對象表示為k-d空間中的一個點,並指定一個深度。對於離群點檢測,離群點更可能是深度較小的數據對象。已經提出了許多深度的定義。從理論上講,基於深度的方法可以適用於k的大值。然而,在實踐中,雖然存在k=2或3的有效算法([16]、[18]、[12]),但對於k≥4的大數據集,基於深度的方法變得低效。這是因為基於深度的方法依賴於k-d凸包的計算,對於n個對象,k-d凸包的下限復雜度為Ω(nk/2)。
Knorr和Ng提出了基於距離的離群值的概念。它們的概念概括了基於分布的方法的許多概念,並且對於較大的k值,它們的計算復雜度比基於深度的方法更好。在第3節的后面,我們將詳細討論它們的概念與本文提出的局部離群值的概念有何不同。通過使用到k近鄰的距離來對離群值進行排序,擴展了基於距離的離群值的概念。給出了一種非常有效的算法來計算排名前n位的離群值,但離群值的概念仍然是基於距離的。
鑒於該領域的重要性,欺詐檢測比一般的離群點檢測領域受到了更多的關注。根據應用領域的具體情況,已經開發了詳細的欺詐模型和欺詐檢測算法。與欺詐檢測相比,目前討論的異常點檢測工作更具探索性。異常點檢測確實可能導致欺詐模型的構建。
最后,大多數聚類算法,尤其是在KDD環境下開發的算法(例如CLARANS、DBSCAN、BIRCH、STING、WaveCluster、DenClue、CLIQUE),在某種程度上能夠處理異常。然而,由於聚類算法的主要目標是尋找聚類,因此它們是用來優化聚類的,而不是用來優化離群點的檢測。在生成聚類結果時,通常只允許或忽略異常(在聚類的背景下稱為“噪聲”)。即使不忽略離群值,離群值的概念本質上是二元的,並且對於對象的離群程度沒有量化。我們的局部離群值概念與基於密度的聚類方法有一些基本概念。然而,我們的離群點檢測方法不需要任何顯式或隱式的聚類概念。
3. 現有(非局部)方法的問題
正如我們在第2節中所看到的,現有的離群點檢測的大部分工作都在統計學領域。直觀地,Hawkins給出了離群值的定義。
定義1:霍金斯離群值(Hawkins-Outlier)
離群值是一種與其他觀測值相差甚遠的觀測值,以至於引起人們懷疑它是由另一種機制產生的。
Knorr和Ng在下面的離群值定義中對這一概念進行了形式化描述。在本文中,我們使用o,p,q來表示數據集中的對象。我們使用符號d(p,q)來表示對象p和q之間的距離。對於一組對象,我們使用C(有時直覺地認為C形成一個簇)。為了簡化我們的表示法,我們用d(p,C)來表示C中p和q之間的最小距離,即\(d(p,C) = \min \{ d(p,q)|q \in C\} .\)
定義2:DB(pct, dmin) - 離群值
數據集D中的對象p是DB(pct,dmin)-離群值,如果D中的對象的最小百分比pct大於距離dmin,即集合${ q \in D|d(p,q) \le d\min } $的基數小於或等於D大小的(100−pct)%。
上面的定義只捕獲某些類型的異常值。因為定義采用數據集的全局視圖,所以這些異常值可以被視為“全局”異常值。然而,對於許多表現出更復雜結構的有趣的真實世界數據集,存在另一種異常值。這些對象可以是相對於他們的局部近鄰,特別是相對於近鄰的密度。這些離群值被視為“局部”離群值。
為了進行說明,請考慮圖1中給出的示例。這是一個包含502個對象的簡單二維數據集。第一個簇C1中有400個對象,簇C2中有100個對象,另外還有兩個對象o1和o2。在這個例子中,C2形成了比C1更密集的團簇。根據霍金斯的定義,o1和o2都可以被稱為離群值,而C1和C2中的對象則不應該被稱為離群值。有了“局部”異常值的概念,我們希望將o1和o2都標記為異常值。相反,在基於距離的離群值框架內,只有o1是以下意義上的合理DB(pct,dmin)-離群值。如果對於C1中的每個對象q,q與其最近鄰之間的距離大於o2與C2之間的距離(即d(o2,C2)),我們實際上可以證明沒有合適的pct和dmin值,因此o2是DB(pct,dmin)-離群值,但C1中的對象不是。
原因如下。如果dmin值小於距離d(o2,C2),則所有501個對象(pct=100×501/502)都比dmin離o2更遠。但同樣的條件也適用於C1中的每個物體q。因此,在這種情況下,o2和C1中的所有對象都是DB(pct,dmin)-離群值。
否則,如果dmin值大於距離d(o2,C2),則很容易看出:o2是DB(pct,dmin)-離群值意味着C1中有許多對象q,使得q也是DB(pct,dmin)離群值。這是因為集合{p∈D | d(p,o2)≤ dmin}的基數總是大於集合{p∈D | d(p,q)≤ dmin}的基數。因此,在這種情況下,如果o2是DB(pct,dmin)-離群值,那么C1中的許多對象q也是離群值。更糟糕的是,有pct和dmin的值,這樣,雖然o2不是異常值,但C1中的一些q是異常值。
4. 局部離群值的正式定義
上面的例子表明,DB(pct,dmin)-離群值所取的全局視圖在某些條件下是有意義的和足夠的,但是對於存在不同密度的簇的一般情況來說並不令人滿意。在本節中,我們開發了局部異常值的正式定義,這避免了上一節中提出的缺點。我們的概念和現有的離群值概念之間的關鍵區別在於,離群不是二元屬性。相反,我們為每個對象指定一個離群因子,即對象的離群程度。
定義3:k-距離(k-distance)
對於任意正整數k,對象p的k距離,表示為k-distance(p),定義為p與對象o∈D之間的距離d(p,o),使得:
(i) 至少有k個對象o'∈D{p},使得d(p, o') ≤ d(p, o)
(ii) 至多有k-1個對象o'∈D{p},使得d(p, o') < d(p, o)
【其中D為數據集(Database)。通俗的說,某一點p的k距離(k-distance),就是點p和距離點p第k近的點之間距離(不包括點p)】
定義4:k-距離鄰域(k-distance neighborhood)
給定p的k-距離,p的k-距離鄰域包含與p的距離不大於k-距離的每個對象,即Nk-distance(p) = {q∈D \ {p} | d(p, q)≤ k-distance(p)}
這些對象q稱為p的k個近鄰。簡化表示為Nk(p)
【所謂p的k距離鄰域,就是p的直線距離不超過p的k-距離的所有數據樣本構成的集合(集合中至少應有k個元素)】
例如,假設有
(i) 1個對象與p的距離為1個單位;
(ii) 2個對象與p的距離為2個單位;
(iii) 3個對象與p的距離為3個單位。
如下圖所示:
那么,2-distance(p) = 3-distance(p) = 2,N4-distance(p) = 6.
定義5:可達距離(reachability distance)
令k為自然數,將對象p相對於對象o的可達距離定義為
reach-distk(p, o) = max{k-distance(o), d(p, o)}
圖2說明了k=4時可達距離的概念。
直觀地說,如果對象p遠離o(例如圖中的p2),那么兩者之間的可達距離就是它們的實際距離。然而,如果它們“足夠”接近(例如,圖中的p1),實際距離將被o的k距離代替。原因是這樣做,所有p接近o的統計波動d(p,o)可以顯著減少。這種平滑效果的強度可以通過參數k來控制。k值越高,同一鄰域內的對象的可達距離越相似。
到目前為止,我們已經為任何正整數k定義了k-distance(p)和reach-distk(p)。但是為了定義離群值,我們將重點放在k的一個特定實例上,該實例將我們與基於密度的聚類聯系起來。在典型的基於密度的聚類算法中,有兩個參數定義了密度的概念:(i)指定最小對象數的參數MinPts;(ii)指定容積的參數。這兩個參數決定了聚類算法的密度閾值。也就是說,如果對象或區域的鄰域密度超過給定的密度閾值,則對象或區域是連接的。然而,為了檢測基於密度的異常值,需要比較不同對象集的密度,這意味着我們必須動態地確定對象集的密度。因此,我們將MinPts作為唯一的參數,並使用reach distMinPts(p,o),對於o∈NMinPts(p),作為容積的度量來確定對象p附近的密度。
定義6:局部可達密度((local reachability density)
對象p的局部可達密度定義為:
\(lr{d_{MinPts}}(p) = 1/(\frac{{\sum\limits_{o \in {N_{MinPts}}(p)} {reach - dis{t_{MinPts}}(p,o)} }}{{\left| {{N_{MinPts}}(p)} \right|}})\)
直觀地說,對象p的局部可達性密度是基於p的最近鄰的平均可達距離的倒數。注意,如果求和中的所有可達性距離都為0,則局部密度可以是∞。如果至少存在與p不同但共享相同空間坐標的MinPts對象,即如果數據集中至少存在p的MinPts副本,則對象p可能會發生這種情況。為了簡單起見,我們不會顯式地處理這種情況,而是簡單地假設沒有重復的情況。(為了處理重復,我們可以將鄰域的概念建立在k-不同距離的基礎上,定義類似於定義3中的k-距離,另外要求至少有k個具有不同空間坐標的對象。)
定義7:(局部)離群因子(((local) outlier factor)
對象p的(局部)離群因子定義為:
\(LO{F_{MinPts}}(p) = \frac{{\sum\limits_{o \in {N_{MinPts}}(p)} {\frac{{lr{d_{MinPts}}(o)}}{{lr{d_{MinPts}}(p)}}} }}{{\left| {{N_{MinPts}}(p)} \right|}}\)
對象p的離群因子反映了我們稱p為離群值的程度。它是p的局部可達密度與p的最小近鄰可達密度之比的平均值。不難看出,p的局部可達密度越低,p的MinPts近鄰的局部可達密度越高,p的LOF值就越高。在下一節中,LOF的形式化性質將得到精確的證明(此略)。為了簡化表示法,如果沒有出現混淆,我們從reach-dist、lrd和LOF中刪除下標MinPts。
5. 局部離群點的性質
在本節中,我們對LOF的性質進行了詳細的分析。我們的目標是證明我們對LOF的定義抓住了局部異常值的精神,並且具有許多令人滿意的性質。具體地說,我們證明了對於簇中的大多數對象p,p的LOF大約等於1。對於其他對象,包括簇外的對象,我們給出了LOF上下界和上界的一般定理。此外,我們還分析了邊界的緊性。我們證明了重要對象類的界是緊的。但是,對於其他類的對象,邊界可能沒有那么緊。對於后者,我們給出了另一個更好的界定理。
5.1 簇內深層對象的LOF
在第3節中,我們使用圖1來激發局部異常值的概念。特別是,我們希望將o2標記為外圍對象,但將集群C1中的所有對象標記為非外圍對象。下面,我們展示了對於C1中的大多數對象,其LOF大約為1,這表明它們不能被標記為外圍對象。
引理1:設C是對象的集合。讓reach-dist-min表示C中對象的最小可達距離,即reach-dist-min=min{reach-dist(p,q)| p,q∈C}。同樣,讓reach-dis-max表示C中對象的最大可達距離。將ε定義為(reach-dist-max/reach-dist-min − 1).
對於所有對象p∈C,有:
(i) p的所有MinPts-最近鄰q都在C中,且
(ii)q的所有MinPts-最近鄰o也在C中,則有1/(1+ε) ≤LOF(p) ≤ (1+ε) .
引理1的解釋如下。直觀地說,C對應於一個“簇”。讓我們考慮群集中“深”的對象p,這意味着p的所有MinPts近鄰q都在C中,而q的所有MinPts近鄰也都在C中。對於這樣的深對象p,p的LOF是有界的。如果C是一個“緊”簇,引理1中的ε值可能非常小,從而迫使p的LOF非常接近1。
為了返回到圖1中的示例,我們可以應用引理1得出結論,集群C1中大多數對象的LOF接近1。
5.2 LOF的一般上界和下界
上面的引理1顯示了LOF的一個基本性質,即對於集群中的深層對象,它們的LOF接近於1,不應該被標記為局部異常值。我馬上想到幾個問題。那些靠近星團外圍的物體呢?那么那些在簇外的物體呢,比如圖1中的o2?我們能得到這些物體LOF的上下限嗎?
下面的定理1給出了任意對象p的LOF(p)的一般上下界。因此,定理1沿着二維推廣了引理1。首先,定理1適用於任何對象p,並不局限於簇內的對象。第二,即使對於團簇內部的物體,定理1給出的界也比引理1給出的界更緊,這意味着引理1中定義的ε可以更接近於零。這是因為在引理1中,reach-dist-min和reach-dist-max的值是基於一組較大的可達距離得到的。相反,在定理1中,最小值和最大值僅基於所考慮對象的最小最近鄰域,導致更嚴格的界限。在第5.3節中,我們將更詳細地分析定理1中給出的界的緊性。
定義下列項:
\(direc{t_{\min }}(p) = \min \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\}\)
\(direc{t_{\max }}(p) = \max \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\}\)
\(indirec{t_{\min }}(p) = \min \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\}\)
\(indirec{t_{\max }}(p) = \max \{ reach - dist(p,q)|q \in {N_{MinPts}}(p)\}\)
定理1:令p是數據集D中的一個對象,且1≤MinPts≤|D|,則
\(\frac{{direc{t_{\min }}(p)}}{{indirec{t_{\max }}(p)}} \le LOF(p) \le \frac{{direc{t_{\max }}(p)}}{{indirec{t_{\min }}(p)}}\)
為了用圖3中的例子來說明這個定理,假設dmin是imax的4倍,dmax是imin的6倍。然后根據定理1,p的LOF在4到6之間。從定理1中也應該清楚,LOF(p)有一個易於理解的解釋。它只是p的直接鄰域相對於p的間接鄰域的可達距離的函數。
5.3 邊界的緊密性
總之,如果直接鄰域和間接鄰域中平均可達距離的波動很小(即pct很低),則定理1可以很好地估計LOF,因為最小和最大LOF邊界彼此接近。有兩個重要的情況是這樣的。
- 如果可達距離的波動相當均勻,即p的MinPts近鄰屬於同一簇,則對象p的pct百分比非常低。在這種情況下,directmin、directmax、indirectmin和indirectmax的值幾乎相同,導致LOF接近1。這與引理1中建立的結果是一致的。
- 上述論點可以推廣到一個對象p,該對象p不位於簇的深處,但其MinPts最近的鄰居都屬於同一簇(如圖3所示)。在這種情況下,即使LOF可能不接近1,定理1所預測的LOF的界也是緊的。
5.4 直接鄰域與多個簇重疊的對象的邊界
到目前為止,我們已經分析了定理1中給出的邊界的嚴密性,並給出了邊界嚴密性的兩個條件。一個立即浮現在腦海中的問題是:在什么情況下邊界不緊?根據圖5,如果物體p的minpts -最近鄰屬於不同密度的簇,pct的值可能非常大。然后根據圖5,LOFmax和LOFmin值之間的差值可以變大。在這種情況下,定理1中給出的邊界不能很好地工作。
作為一個例子,讓我們再次考慮圖1所示的情況。對於對象o2,由於其所有MinPts近鄰都來自同一簇C2,因此定理1給出的關於o2的LOF的界應該是緊的。相比之下,o1的MinPts近鄰來自C1和C2簇。在這種情況下,o1的LOF的給定界限可能不太好。
下面的定理2旨在給出當p的最小鄰域與多個簇重疊時,對象p的LOF的更好的界。定理2的直觀意義是,當我們把p的MinPts近鄰划分為若干組時,每個組對p的LOF的貢獻是成比例的。
定理2:令p是數據集D中的一個對象,且1≤MinPts≤|D|,C1,C2,...,Cn是NMinPts(p)的分割,即NMinPts(p)=C1∪C2∪...∪Cn∪{p}且Ci∩Cj=∅,Ci≠∅,1≤i,j≤n, i≠j.
此外,令ξi=|Ci|/NMinPts(p)|
則有:
(a) \(LOF(p) \ge \left| {(\sum\limits_{i = 1}^n {{\xi _i}} \cdot direct_{\min }^i(p))} \right| \cdot \left| {(\sum\limits_{i = 1}^n {\frac{{{\xi _i}}}{{indirect_{\max }^i(p)}}} )} \right|\)
(b) \(LOF(p) \le \left| {(\sum\limits_{i = 1}^n {{\xi _i}} \cdot direct_{\max }^i(p))} \right| \cdot \left| {(\sum\limits_{i = 1}^n {\frac{{{\xi _i}}}{{indirect_{\min }^i(p)}}} )} \right|\)
證明見論文。 定理2泛化了定理1,其中考慮了來自多個聚類的MinPts最近鄰的比率。 因此,有以下推論。
推論1:如果定理2中的分割數為1,則定理2中給出的LOFmin和LOFmax與定理1中給出的對應界完全相同。
6. 參數MinPts的影響
在上一節中,我們分析了LOF的形式化性質。對於團簇內部的物體,我們已經證明LOF大約等於1。對於其他對象,我們根據MinPts近鄰是否來自一個或多個簇,在LOF上建立了兩組上下界。需要注意的是,前面的所有結果都基於給定的MinPts值。在本節中,我們將討論MinPts值的選擇如何影響LOF值,以及如何為LOF計算確定正確的MinPts值。
6.1 LOF如何隨MinPts值的變化而變化
鑒於上一節建立的分析結果,我想到了幾個有趣的問題。當MinPts值被調整時,LOF值是如何變化的?給定MinPts值的遞增序列,LOF是否有相應的單調變化序列?也就是說,LOF是單調地減少還是增加?
不幸的是,實際情況是LOF既不單調地減少也不單調地增加。圖7顯示了一個簡單的場景,其中所有對象都按照高斯分布分布。對於2到50之間的每個MinPts值,顯示最小、最大和平均LOF值以及標准偏差。
讓我們以最大LOF為例。最初,當MinPts值設置為2時,這將減少到使用定義5中的實際對象間距離d(p,o)。通過增加MinPts值,可以減弱可達距離和LOF的統計起伏。因此,在最大LOF值上存在初始下降。但是,當MinPts值繼續增加時,LOF的最大值會上下波動,並最終穩定到某個值。
如果LOF值即使對於高斯分布這樣的純分布也是非單調變化的,那么對於更復雜的情況LOF值變化更大。圖8顯示了一個包含三個集群的二維數據集,其中S1由10個對象組成,S2由35個對象組成,S3由500個對象組成。右側是每個簇中一個對象的代表圖。圖中顯示的LOF超過MinPts的范圍為10到50。S3中對象的LOF在1附近非常穩定,而S1和S3中對象的LOF變化更大。
6.1 確定MinPts值的范圍
因為LOF值可以上下浮動,我們建議使用一系列MinPts值作為一種啟發式方法。在下文中,我們將提供如何選取此范圍的指導。我們使用MinPtsLB和MinPtsUB來表示范圍的“下限”和“上限”。
讓我們首先確定MinPtsLB的合理值。顯然,MinPtsLB可以小到2。然而,如上所述,在定義5之前,明智的做法是消除不必要的統計波動,因為MinPts太小。例如,對於圖7所示的高斯分布,當MinPtsLB至少為10時,LOF的標准偏差才穩定。作為另一個極端的例子,假設我們把圖7中的高斯分布變成均勻分布。結果表明,對於小於10的MinPts,可能存在LOF顯著大於1的對象。這是違反直覺的,因為在均勻分布中,不應將任何對象標記為外圍對象。因此,我們為挑選MinPtsLB提供的第一條准則是,它至少應該是10,以消除不必要的統計波動。
我們為挑選MinPtsLB提供的第二條准則是基於更微妙的觀察。考慮一個對象p和一個對象集/簇C的簡單情況。如果C包含的對象少於MinPtsLB,那么C中每個對象的MinPts近鄰集將包含p,反之亦然。因此,通過應用定理1,p的LOF和C中的所有對象將是非常相似的,從而使p與C中的對象不可區分。
另一方面,如果C包含多個MinPtsLB對象,則C中對象的MinPts最近鄰域將不包含p,但C中的一些對象將包含在p的鄰域中。因此,取決於p和C之間的距離和C的密度,p的LOF可能與C中的對象的LOF有很大的不同。這里的關鍵觀察是MinPtsLB可以被視為一個“簇”(如上面的C)必須包含的對象的最小數目,因此其他對象(如上面的p)可以是相對於此的局部異常值集群。此值可能取決於應用程序。對於我們實驗的大多數數據集,一般來說,選擇10到20個數據集似乎效果不錯。
接下來,我們來選擇一個合理的MinPtsUB值,即MinPts值范圍的上限值。與下限MinPtsLB一樣,上限也有關聯的含義。設C是一組“近距”對象。然后MinPtsUB可以看作是C的最大基數,因為C中的所有對象都可能是局部異常值。“近距”是指directmin、directmax、indirectmin和indirectmax的值都非常相似。在這種情況下,對於超過MinPtsUB的MinPts值,定理1要求C中所有對象的LOF接近1。因此,我們為挑選MinPtsUB提供的指導原則是,可能是局部異常值的“近距”對象的最大數量。
作為一個例子,讓我們再次考慮圖8所示的情況。回想一下,S1由10個對象組成,S2由35個對象組成,S3由500個對象組成。從圖中可以明顯看出,S3中的對象從來都不是異常值,它們的LOF值總是接近1。相比之下,S1中的對象是MinPts值介於10和35之間的強異常值。S2中的對象是從MinPts=45開始的異常值。
最后兩個效果的原因是,從MinPts=36開始,S2中對象的MinPts最近鄰域開始包含S1中的一些對象。從那以后,S1和S2中的對象表現出大致相同的行為。現在,當MinPts=45時,這個“組合”的對象集S1和S2的成員開始在其鄰域中包含來自S3的對象,因此開始成為相對於S3的異常值。根據應用程序域的不同,我們可能希望將一組35個對象(如S2)視為一個集群或一堆“近距”的局部異常值。為了便於實現這一點,我們可以相應地選擇MinPtsUB值,即小於35或大於35。MinPtsLB也有類似的論點,即相對於其他對象可以被視為局部異常值的最小對象數。
在確定了MinPtsLB和MinPtsUB之后,我們可以為每個對象計算其在此范圍內的LOF值。我們提出了一種啟發式方法,在指定的范圍內,根據最大LOF值對所有對象進行排序。也就是說,對象p的排名基於: max{LOFMinPts(p)|MinPtsLB≤MinPts≤MinPtsUB}
假設所有的LOF值都在這個范圍內,我們可以取其他的聚集值,比如最小值或平均值,而不是取最大值。圖8中的情況表明,采用最小值可能是不合適的,因為最小值可能會完全抹去對象的外圍特性。取平均值也可能有稀釋物體外圍性質的效果。我們建議使用最大值來突出顯示對象最外圍的實例。
7. 實驗
在這一節中,我們提出了在這個范圍內取最大LOF值的啟發式方法,證明了我們的思想可以成功地識別那些看似有意義但其他方法無法識別的異常值。我們從一個綜合的二維數據集開始,為它顯示所有對象的離群因子,以便給出計算的LOF值的直觀概念。第二個示例使用在[KN98]中使用的真實數據集來評估DB(pct,dmin)-離群值。我們重復他們的實驗來驗證我們的方法。在第三個例子中,我們在一個德國足球運動員的數據庫中識別出有意義的異常值,我們正好有一個“領域專家”在手,他證實了發現的異常值的意義。最后一小節包含的性能實驗表明,即使對於大型、高維數據集,我們的方法也是可行的。
此外,我們用一個64維的數據集進行了實驗,以證明我們的定義在高維空間是合理的。使用的特征向量是從電視快照中提取的彩色直方圖。我們識別了多個聚類,例如網球比賽的圖片聚類,以及LOF值高達7的合理的局部異常值。
7.1 合成示例
圖9的左側顯示了一個二維數據集,其中包含一個由200個對象組成的低密度高斯聚類和三個分別由500個對象組成的大聚類。其中一個是稠密的高斯團簇,另兩個是密度不同的均勻團簇。此外,它還包含一些異常值。在圖9的右側,我們將MinPts=40的所有對象的LOF繪制為第三維。我們看到均勻簇中的對象的LOF都等於1。高斯簇中的大多數對象的LOF值也都是1。稍微在高斯聚類之外,有幾個弱異常值,即那些相對較低但大於1的LOF值。其余七個對象的LOF值都要大得多。此外,從圖中可以清楚地看出,每個離群值的LOF值取決於相對於對象為離群值的簇的密度,以及離群值到簇的距離。
7.2 曲棍球數據
在NHL96數據集上重復實驗,計算MinPts范圍30到50的最大LOF。
在第一次測試中,在得分的三維子空間上,加減統計和罰分分鍾數,他們確定弗拉基米爾·康斯坦季諾夫是唯一的DB(0.998,26.3044)異常值。他也是我們的最高離群值,LOF值為2.4。第二強的局部異常值,LOF為2.0,是Matthew Barnaby。對於發現的大多數離群值,我們不從領域專家的角度解釋為什么它們是離群值;感興趣的讀者可以在中找到這些信息。這里的重點是,通過用最大LOF值對異常值進行排序,我們得到了幾乎相同的結果。
在第二次測試中,他們在比賽、進球和投籃命中率的三維子空間中識別出DB(0.997,5)異常值,發現克里斯·奧斯古德和馬里奧·萊米厄是異常值。同樣,他們是我們的頂級離群者,Chris Osgood的LOF為6.0,Mario Lemieux的LOF為2.8。在我們基於LOF的排名榜上,史蒂夫·波普斯特以2.5的LOF排名第三,只打了三場比賽,進了一球,投籃命中率達到50%。
7.3 足球數據
在下面的實驗中,我們計算了“Fußball 1 1998/99賽季德國國家足球聯盟”足球運動員信息數據庫的局部異常值。該數據庫由375名球員組成,包括姓名、比賽次數、進球數以及球員的位置(守門員、防守、中鋒、進攻)。從中我們得出了每場比賽的平均進球數,並對比賽次數、每場比賽的平均進球數和位置(編碼為整數)的三維子空間進行了離群點檢測。一般來說,這個數據集可以根據玩家的位置划分為四個簇。我們計算了MinPts范圍為30到50的LOF值。下面我們將討論LOF>1.5的所有局部異常值,並解釋為什么它們是例外的。
最強的離群者是邁克爾·普里茨,他踢了最多的比賽,也進了最多的球,這使他成為聯盟中得分最高的球員(“托爾施尤琴克尼格”)。相對於一群進攻型球員來說,他是個局外人。第二強的離群者是邁克爾·施約伯格。他打了平均數場比賽,但他是一個離群,因為大多數其他防守球員每場得分的平均數要低得多。原因是他為球隊踢了點球。排在第三位的球員是漢斯-約格-巴特,一個踢了最多比賽的守門員進了7個球。他是唯一一個進球的守門員,他也為球隊踢進了點球。在排名第四和第五的位置上,我們找到了烏爾夫·克爾斯滕和喬萬·埃爾伯,這兩個進攻型球員的平均得分非常高。
7.4 性能
在本節中,我們將評估LOF的計算性能。以下實驗是在一台運行linux2.2的主存為256mb的奔騰III-450工作站上進行的。所有算法都是用Java實現的,並在IBMJVM1.1.8上執行。使用的數據集是隨機生成的,包含不同大小和密度的不同數量的高斯聚類。所有時間都是掛鍾時間,即包括CPU時間和i/O時間。
為了計算MinPtsLB和MinPtsUB之間的LOF值,對數據庫D中的所有n個對象,我們實現了一個兩步算法。在第一步中,找到MinPtsUB最近鄰域,在第二步中計算LOF。讓我們詳細看看這兩個步驟。
在第一步中,每個點p的MinPtsUB最近鄰被物化,以及它們到p的距離。這一步的結果是一個大小為nMinPtsUB距離的物化數據庫M。請注意,此中間結果的大小與原始數據的維度無關。此步驟的運行時復雜度是O(n一次k-nn查詢的時間)。於k-nn查詢,我們可以在不同的方法中進行選擇。對於低維數據,我們可以使用基於網格的方法,該方法可以在固定時間內回答k-nn查詢,導致物化步驟的復雜度為O(n)。對於中高維數據,我們可以使用索引,它為k-nn查詢提供了O(logn)的平均復雜度,從而導致了O(nlogn)的物化復雜度。對於超高維數據,我們需要使用序列掃描或其變體,例如VA文件,復雜度為O(n),導致物化步驟的復雜性為O(n2)。在我們的實驗中,我們使用了X-Tree的一個變體,導致了O(n logn)的復雜性。圖10顯示了不同維度數據集和MinPtsUB=50的性能實驗。顯示的時間確實包括建立索引的時間。顯然,該索引對於2維和5維數據集非常有效,導致了接近線性的性能,但是對於10維和20維數據集則退化了。眾所周知,索引結構的有效性隨着維數的增加而降低。
在第二步中,使用物化數據庫M來計算LOF值。該步驟不需要原始數據庫D,因為M包含足夠的信息來計算LOF。對於MinPtsLB和MinPtsUB之間的MinPts的每個值,數據庫M被掃描兩次。在第一次掃描中,計算每個目標的局部可達密度。在第二步中,計算最終的LOF值並將其寫入文件。然后可以使用這些值根據對象在MinPtsLB和MinPtsUB的間隔內的最大LOF值對對象進行排序。該步驟的時間復雜度為O(n)。圖11所示的圖證實了這一點,其中計算了MinPtsLB=10到MinPtsUB=50的LOF值。
8. 結論
對於許多KDD應用程序來說,發現異常值是一項重要的任務。現有的建議將異常值視為二進制屬性。在本文中,我們證明了在許多情況下,作為一個孤立點不是作為一個二進制屬性,而是作為一個對象與其周圍鄰域隔離的程度來考慮是有意義的。我們引入了局部離群因子LOF的概念,它准確地反映了這種相對隔離度。我們證明了LOF的定義具有許多理想的性質。對於簇內較深的對象,LOF值約為1。對於其他對象,我們給出了LOF值的嚴格上下界,而不管MinPts最近鄰是否來自一個或多個簇。此外,我們還分析了LOF值如何依賴於MinPts參數。我們給出了如何選擇一系列MinPts值的實用指南,並提出了在所選范圍內根據最大LOF值對對象進行排序的啟發式方法。實驗結果表明,我們的啟發式算法是非常有前途的,因為它可以識別有意義的局部離群點,以前的方法無法找到。最后但並非最不重要的一點是,我們證明了我們的局部離群點查找方法對於索引結構支持最近鄰查詢的數據集是有效的,並且對於非常大的數據集仍然是實用的。
目前的工作有兩個方向。第一個問題是如何描述或解釋為什么識別出的局部異常值是異常的。這對於高維數據集尤其重要,因為局部異常值可能僅在某些維度上存在,而不是在所有維度上存在。二是進一步提高LOF計算的性能。對於這兩個方向,研究LOF計算如何使用分層聚類算法(如OPTICS)進行“握手”是很有趣的。一方面,這樣的算法可以提供關於局部離群點的更詳細的信息,例如,通過分析與離群點相關的簇。另一方面,LOF處理和聚類之間可以共享計算。共享計算可以包括k-nn查詢和可達距離。
附:方法復現
方法復現數據和源碼已上傳至Github倉庫( https://github.com/xzydn/anomaly-detection-example/tree/master/LocalOutlierFactor(LOF) )
算法實現參考了“我是8位的”的博文( https://www.cnblogs.com/bigmonkey/p/11052019.html )
主要代碼如下。計算結果與sklearn中實現方法計算結果相一致。
# -*- coding: utf-8 -*-
import numpy as np
from scipy.spatial.distance import cdist
from sklearn.neighbors import LocalOutlierFactor
class LOF:
"""
局部離群因子類
"""
def __init__(self, X):
self.X = X
self.D_K = [] # X中每個樣本點的k距離
self.NEIGHBORS = [] # X中每個樣本點的k距離鄰域
self.LRD = [] # X中每個樣本點的局部可達密度
self.k = None
self.LOF = [] # 局部異常因子
self.dist = cdist(X, X, metric='euclidean') # 計算任意兩點之間距離
print("X shape:", np.shape(X))
def calc_lof(self, k):
# 計算LOF
X = self.X
self.lof_init(k)
self.calc_lrd()
for i in range(0, len(X)): # 計算每個樣本點的局部離群因子
self.LOF[i] = self.lof(i)
def lof_init(self, k):
# 計算LOF初始化
self.k = k
X = self.X
self.D_K = np.zeros(len(X)) # X中每個樣本點的k距離
self.NEIGHBORS = [] # X中每個樣本點的k距離鄰域
self.LRD = np.zeros(len(X)) # X中每個樣本點的局部可達密度
self.LOF = np.zeros(len(X)) # 局部異常因子
def calc_lrd(self):
# 計算局部可達密度
k = self.k
X = self.X
for i in range(0, len(X)):
# print(i)
# x_i距所有樣本點的歐幾里得距離
x_and_d = self.dist[i, :]
index_x_and_d = np.argsort(x_and_d) # 將特征值按從小到大排序,index保留的是對應原矩陣中的下標
self.D_K[i] = x_and_d[index_x_and_d[k]] # x_i的k距離,此處假設x_and_d中沒有重復的距離,除去自身點
# self.NEIGHBORS.append(index_x_and_d[1:k + 1]) # x_i的k距離鄰域,除去自身點(這里有問題,至少有k個)
neighbors = np.argwhere(x_and_d <= self.D_K[i])
self.NEIGHBORS.append([x[0] for x in neighbors if x[0] != i]) # x_i的k距離鄰域,除去自身點
for i in range(0, len(X)): # 計算每個樣本點的局部可達密度
self.LRD[i] = self.lrd(i)
def lrd(self, p):
# p的局部可達密度
neighbors = self.NEIGHBORS[p]
rd = np.maximum(self.D_K[neighbors], self.dist[p, neighbors])
return 1 / (np.sum(rd) / len(neighbors))
def lof(self, p):
# p的局部離群因子
neighbors = self.NEIGHBORS[p]
return np.sum(self.LRD[neighbors]) / self.LRD[p] / len(neighbors)
def create_train():
np.random.seed(42) # 設置seed使每次生成的隨機數都相等
# 生成100個2維數據,它們是以0為均值、以1為標准差的正態分布
X_inliers = 0.3 * np.random.randn(100, 2)
# 構造兩組間隔一定距離的樣本點作為訓練數據
X_inliers = np.r_[X_inliers + 2, X_inliers - 2]
# 構造20個可能的異常數據,從一個均勻分布[low,high)中隨機采樣
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
# 將X_inliers和X_outliers連接起來作為訓練集
return np.r_[X_inliers, X_outliers]
def lof_sklearn(X, k):
clf = LocalOutlierFactor(n_neighbors=k)
clf.fit_predict(X)
LOF = -clf.negative_outlier_factor_
return LOF
if __name__ == '__main__':
X = create_train()
k = 20
lof = LOF(X)
lof.calc_lof(k)
print("LOF Mine:\n", lof.LOF)
LOF_skleran = lof_sklearn(X, k)
print("LOF sklearn:\n", LOF_skleran)
並嘗試對論文7.2中NHL曲棍球數據( http://inalitic.com/datasets/nhl player data.html )進行復現。
原始數據
LOF直方圖
根據LOF計算結果,可自定義閾值濾除異常點。濾除結果如下:
僅供參考。