最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)異常檢測LOF算法的示例代碼

 更新時間:2022年03月16日 14:39:55   作者:Python數(shù)據(jù)科學(xué)  
這篇文章主要為大家介紹一個經(jīng)典的異常檢測算法:局部離群因子(Local Outlier Factor),簡稱LOF算法。感興趣的小伙伴可以跟隨小編一起了解一下

大家好,我是東哥。

本篇和大家介紹一個經(jīng)典的異常檢測算法:局部離群因子(Local Outlier Factor),簡稱LOF算法。

背景

Local Outlier Factor(LOF)是基于密度的經(jīng)典算法(Breuning et. al. 2000), 文章發(fā)表于 SIGMOD 2000, 到目前已經(jīng)有 3000+ 的引用。

在 LOF 之前的異常檢測算法大多是基于統(tǒng)計方法的,或者是借用了一些聚類算法用于異常點的識別(比如 ,DBSCAN,OPTICS)。這些方法都有一些不完美的地方:

  • 基于統(tǒng)計的方法:通常需要假設(shè)數(shù)據(jù)服從特定的概率分布,這個假設(shè)往往是不成立的。
  • 聚類方法:通常只能給出 0/1 的判斷(即:是不是異常點),不能量化每個數(shù)據(jù)點的異常程度。

相比較而言,基于密度的LOF算法要更簡單、直觀。它不需要對數(shù)據(jù)的分布做太多要求,還能量化每個數(shù)據(jù)點的異常程度(outlierness)。

下面開始正式介紹LOF算法。

LOF 算法

首先,基于密度的離群點檢測方法有一個基本假設(shè):非離群點對象周圍的密度與其鄰域周圍的密度類似,而離群點對象周圍的密度顯著不同于其鄰域周圍的密度。

什么意思呢?看下面圖片感受下。

集群 C1 包含了 400 多個點,集群 C2 包含 100 個點。C1 和 C2 都是一類集群點,區(qū)別是 C1 位置比較集中,或者說密度比較大。而像 o1、o2點均為異常點,因為基于我們的假設(shè),這兩個點周圍的密度顯著不同于周圍點的密度。

LOF 就是基于密度來判斷異常點的,通過給每個數(shù)據(jù)點都分配一個依賴于鄰域密度的離群因子 LOF,進而判斷該數(shù)據(jù)點是否為離群點。 如果LOF>=1 ,則該點為離群點,如果LOF≈1 ,則該點為正常數(shù)據(jù)點。

那什么是LOF呢?

了解LOF前,必須先知道一下幾個基本概念,因為LOF是基于這幾個概念而來的。

1. k鄰近距離

在距離數(shù)據(jù)點P最近的幾個點中,第K個最近的點跟點P之間的距離稱為點P的 K-鄰近距離,記為 k-distance (p),公式如下:

點O為距離點P最近的第k個點。

比如上圖中,距離點P最近的第4個點是點6。

這里的距離計算可以采用歐式距離、漢明距離、馬氏距離等等。比如用歐式距離的計算公式如下:

這里的重點是找到第k個最近的那個點,然后帶公式計算距離。

2. k距離領(lǐng)域

以點P為圓心,以k鄰近距離dk(P)為半徑畫圓,這個圓以內(nèi)的范圍就是k距離領(lǐng)域,公式如下:

還是上圖所示,假設(shè)k=4,那么點 1-6 均是鄰域范圍內(nèi)的點。

3. 可達距離

這個可達距離大家需要留意點,點P到點O的第k可達距離:

這里計算P到點O的第k可達距離,但是要以點O為中心,取一個最大值,也就是在點P與O的距離、距離點O最近的第k個點距離中取較大的一個,如圖下所示。

p2距離o遠,那么兩者之間的可達距離就是它們的實際距離。如果距離足夠近,如點p1,實際距離將被o的k距離代替。所有p接近o的統(tǒng)計波動d(p,o)可以顯著減少,這可以通過參數(shù)k來控制,k值越高,同一鄰域內(nèi)的點的可達距離越相似。

4. 局部可達密度

先給出公式。

數(shù)據(jù)點P的局部可達密度就是基于P的最近鄰的平均可達距離的倒數(shù)。距離越大,密度越小。

5. 局部異常因子

根據(jù)局部可達密度的定義,如果一個數(shù)據(jù)點跟其他點比較疏遠的話,那么顯然它的局部可達密度就小。但LOF算法衡量一個數(shù)據(jù)點的異常程度,并不是看它的絕對局部密度,而是看它跟周圍鄰近的數(shù)據(jù)點的相對密度。

這樣做的好處是可以允許數(shù)據(jù)分布不均勻、密度不同的情況。局部異常因子即是用局部相對密度來定義的。數(shù)據(jù)點p的局部相對密度(局部異常因子)為點p鄰域內(nèi)點的平均局部可達密度跟數(shù)據(jù)點p的局部可達密度的比值,即:

LOF算法流程

了解了 LOF 的定義以后,整個算法也就顯而易見了:

  • 對于每個數(shù)據(jù)點,計算它與其它所有點的距離,并按從近到遠排序;
  • 對于每個數(shù)據(jù)點,找到它的 k-nearest-neighbor,計算 LOF 得分;
  • 如果LOF值越大,說明越異常,反之如果越小,說明越趨于正常。

LOF優(yōu)缺點

優(yōu)點

LOF 的一個優(yōu)點是它同時考慮了數(shù)據(jù)集的局部和全局屬性。異常值不是按絕對值確定的,而是相對于它們的鄰域點密度確定的。當數(shù)據(jù)集中存在不同密度的不同集群時,LOF表現(xiàn)良好,比較適用于中等高維的數(shù)據(jù)集。

缺點

LOF算法中關(guān)于局部可達密度的定義其實暗含了一個假設(shè),即:不存在大于等于 k 個重復(fù)的點。

當這樣的重復(fù)點存在的時候,這些點的平均可達距離為零,局部可達密度就變?yōu)闊o窮大,會給計算帶來一些麻煩。在實際應(yīng)用時,為了避免這樣的情況出現(xiàn),可以把 k-distance 改為 k-distinct-distance,不考慮重復(fù)的情況?;蛘?,還可以考慮給可達距離都加一個很小的值,避免可達距離等于零。

另外,LOF 算法需要計算數(shù)據(jù)點兩兩之間的距離,造成整個算法時間復(fù)雜度為O(n2)。為了提高算法效率,后續(xù)有算法嘗試改進。FastLOF (Goldstein,2012)先將整個數(shù)據(jù)隨機的分成多個子集,然后在每個子集里計算 LOF 值。對于那些 LOF 異常得分小于等于 1 的,從數(shù)據(jù)集里剔除,剩下的在下一輪尋找更合適的 nearest-neighbor,并更新 LOF 值。

Python 實現(xiàn) LOF

有兩個庫可以計算LOF,分別是PyODSklearn,下面分別介紹。

使用pyod自帶的方法生成200個訓(xùn)練樣本和100個測試樣本的數(shù)據(jù)集。正態(tài)樣本由多元高斯分布生成,異常樣本是使用均勻分布生成的。

訓(xùn)練和測試數(shù)據(jù)集都有 5 個特征,10% 的行被標記為異常。并且在數(shù)據(jù)中添加了一些隨機噪聲,讓完美分離正常點和異常點變得稍微困難一些。

from pyod.utils.data import generate_data
import numpy as np
X_train, y_train, X_test, y_test = \
        generate_data(n_train=200,
                      n_test=100,
                      n_features=5,
                      contamination=0.1,
                      random_state=3) 
X_train = X_train * np.random.uniform(0, 1, size=X_train.shape)
X_test = X_test * np.random.uniform(0,1, size=X_test.shape)

PyOD

下面將訓(xùn)練數(shù)據(jù)擬合了 LOF 模型并將其應(yīng)用于合成測試數(shù)據(jù)。

在 PyOD 中,有兩個關(guān)鍵方法:decision_function 和 predict。

  • decision_function:返回每一行的異常分數(shù)
  • predict:返回一個由 0 和 1 組成的數(shù)組,指示每一行被預(yù)測為正常 (0) 還是異常值 (1)
from?pyod.models.lof?import?LOF
clf_name?=?'LOF'
clf?=?LOF()
clf.fit(X_train)

test_scores?=?clf.decision_function(X_test)

roc?=?round(roc_auc_score(y_test,?test_scores),?ndigits=4)
prn?=?round(precision_n_scores(y_test,?test_scores),?ndigits=4)

print(f'{clf_name}?ROC:{roc},?precision?@?rank?n:{prn}')
>>?LOF?ROC:0.9656,?precision?@?rank?n:0.8

可以通過 LOF 模型方法查看 LOF 分數(shù)的分布。在下圖中看到正常數(shù)據(jù)(藍色)的分數(shù)聚集在 1.0 左右。離群數(shù)據(jù)點(橙色)的得分均大于 1.0,一般高于正常數(shù)據(jù)。

Sklearn

scikit-learn中實現(xiàn) LOF 進行異常檢測時,有兩種模式選擇:異常檢測模式 (novelty=False) 和 novelty檢測模式 (novelty=True)

在異常檢測模式下,只有fit_predict生成離群點預(yù)測的方法可用??梢允褂?code>negative_outlier_factor_屬性檢索訓(xùn)練數(shù)據(jù)的異常值分數(shù),但無法為未見過的數(shù)據(jù)生成分數(shù)。模型會根據(jù)contamination參數(shù)(默認值為 0.1)自動選擇異常值的閾值。

import?matplotlib.pyplot?as?plt

detector?=?LOF()
scores?=?detector.fit(X_train).decision_function(X_test)

sns.distplot(scores[y_test==0],?label="inlier?scores")
sns.distplot(scores[y_test==1],?label="outlier?scores").set_title("Distribution?of?Outlier?Scores?from?LOF?Detector")
plt.legend()
plt.xlabel("Outlier?score")

在novelty檢測模式下,只有decision_function用于生成異常值可用。fit_predict方法不可用,但predict方法可用于生成異常值預(yù)測。

clf?=?LocalOutlierFactor(novelty=True)
clf?=?clf.fit(X_train)
test_scores?=?clf.decision_function(X_test)

test_scores?=?-1*test_scores

roc?=?round(roc_auc_score(y_test,?test_scores),?ndigits=4)
prn?=?round(precision_n_scores(y_test,?test_scores),?ndigits=4)

print(f'{clf_name}?ROC:{roc},?precision?@?rank?n:{prn}')

該模式下模型的異常值分數(shù)被反轉(zhuǎn),異常值的分數(shù)低于正常值。

以上就是Python實現(xiàn)異常檢測LOF算法的示例代碼的詳細內(nèi)容,更多關(guān)于Python LOF算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python3使用requests模塊爬取頁面內(nèi)容的實戰(zhàn)演練

    python3使用requests模塊爬取頁面內(nèi)容的實戰(zhàn)演練

    本篇文章主要介紹了python3使用requests模塊爬取頁面內(nèi)容的實戰(zhàn)演練,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • Django重設(shè)Admin密碼過程解析

    Django重設(shè)Admin密碼過程解析

    這篇文章主要介紹了Django重設(shè)Admin密碼過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python sorted排序方法如何實現(xiàn)

    Python sorted排序方法如何實現(xiàn)

    這篇文章主要介紹了Python sorted排序方法如何實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Tensorflow 多線程與多進程數(shù)據(jù)加載實例

    Tensorflow 多線程與多進程數(shù)據(jù)加載實例

    今天小編就為大家分享一篇Tensorflow 多線程與多進程數(shù)據(jù)加載實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python?數(shù)據(jù)類型中的字符串和數(shù)字

    Python?數(shù)據(jù)類型中的字符串和數(shù)字

    這篇文章主要介紹了Python?數(shù)據(jù)類型中的字符串和數(shù)字,Python3中有六個標準的數(shù)據(jù)類型,Number、String、List、Tuple、Set、Dictionary,加先來我們就來看看這幾種數(shù)據(jù)類型的具體相關(guān)介紹,需要的小伙伴可以參考一下
    2022-02-02
  • python中urllib.request和requests的使用及區(qū)別詳解

    python中urllib.request和requests的使用及區(qū)別詳解

    這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • django 獲取字段最大值,最新的記錄操作

    django 獲取字段最大值,最新的記錄操作

    這篇文章主要介紹了django 獲取字段最大值,最新的記錄操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 三個520專屬Python表白代碼分享

    三個520專屬Python表白代碼分享

    快到520了,這篇文章主要為大家介紹了三個520專屬Python表白代碼。文中的示例代碼講解詳細,感興趣的小伙伴快跟隨小編一起動手試一試
    2022-05-05
  • Python實現(xiàn)句子翻譯功能

    Python實現(xiàn)句子翻譯功能

    這篇文章主要介紹了Python實現(xiàn)句子翻譯功能,涉及urllib庫的使用等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 關(guān)于tf.nn.dynamic_rnn返回值詳解

    關(guān)于tf.nn.dynamic_rnn返回值詳解

    今天小編就為大家分享一篇關(guān)于tf.nn.dynamic_rnn返回值詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論

晋宁县| 吉林市| 开江县| 马山县| 随州市| 红安县| 临西县| 三明市| 年辖:市辖区| 资讯 | 客服| 兖州市| 临夏县| 酉阳| 兴海县| 安徽省| 津市市| 承德县| 偏关县| 手游| 岳普湖县| 乐昌市| 开远市| 庆云县| 灵川县| 江都市| 辽宁省| 潼关县| 韶关市| 绥滨县| 大田县| 紫阳县| 沾益县| 桐乡市| 蓝田县| 绩溪县| 离岛区| 都江堰市| 正宁县| 靖江市| 松潘县|