異常點檢測python(異常點檢測給數據達標)

本文目錄一覽:

Python如何檢測惡意刷單行為

1、打開python。2、輸入檢測類的代碼。將賬號的訂單數和ip地主數量兩個變量進行異常值檢測,分析出黃牛惡意下單的行為特徵,多次重複下單,下單地址區間極短,甚至相同地址。

python異常和錯誤的區別

什麼是錯誤?

錯誤分為兩種情況:第一種語法錯誤,代碼不符合解釋器或者編譯器語法;第二種邏輯錯誤,不完整或者不合法輸入或者計算出現問題。

什麼是異常?

所謂的異常就是執行過程中出現萬體導致程序無法執行,同樣分為兩種情況:第一種程序遇到邏輯或者算法問題;第二種運行過程中計算機錯誤,內存不夠或者IO錯誤。

Python中錯誤和異常有什麼區別?

錯誤是代碼運行前的語法或者邏輯錯誤,語法錯誤在執行前修改,邏輯錯誤無法修改;

而異常分為兩個步驟,異常產生,檢查到錯誤且解釋器認為是異常,拋出異常;第二是異常處理,截獲異常,忽略或者終止程序處理異常。

從軟件方面來說,錯誤是語法或者邏輯上的問題,語法錯誤指示軟件的結構上有錯誤,導致不能被解釋器解釋或者編譯器無法編譯,這些錯誤必須在程序執行前進行糾正;當程序語法正確後,剩下的就是邏輯錯誤問題,邏輯錯誤可能是由於不完整或不合法的輸入導致,在其他情況下,可能是邏輯無法生成、計算或輸出結果需要的過程無法執行。這些錯誤通常分別被稱為域錯誤和範圍錯誤。

當Python檢測到一個錯誤時,解釋器就會指出當前已經無法繼續執行下去,這時就出現異常。

而異常它是因為程序出現了錯誤而在正常控制流以外採取的行為,這個行為分為兩個階段:首先是引起異常發生的錯誤,然後是檢測階段;

第一個階段是在發生了一個異常條件後發生的,只要檢測到錯誤並且意識到異常條件,解釋器會引發一個異常,引發也可以叫作觸發或生成,解釋器通過它通知當前控制流有錯誤發生;

Python也允許程序員自己引發異常,無論是Python解釋器還是程序員引發的,異常就是錯誤發生的信號,當前流將被打斷,用來處理這個錯誤並採取相應的操作,這就是第二個階段。

對異常的處理髮生在第二階段,異常引發後,可以調用很多不同的操作,可以是忽視錯誤,或是減輕問題的影響後設法繼續執行程序,所以的這些操作都代表一種繼續,或是控制的分支,關鍵是程序員在錯誤發生時可以指示程序如何執行。

類似Python這樣支持引發和處理異常的語言,可以讓開發人員在錯誤發生時更直接地控制它們,程序員不僅僅有了檢測錯誤的能力,還可以在它們發生時採取更可靠的補救措施。

異常檢測統計學方法

1. 概述

2. 參數方法

3. 非參數方法

4. HBOS

5. 總結

span id=”1″/span

統計學方法對數據的正常性做出假定。 它們假定正常的數據對象由一個統計模型產生,而不遵守該模型的數據是異常點。 統計學方法的有效性高度依賴於對給定數據所做的統計模型假定是否成立。

具體方法:先基於統計學方法確定一個概率分佈模型,然後判斷各個離散點有多大概率符合該模型。

難點在於如何得到概率分佈模型。首先是識別數據集的具體分佈:數據的真實分佈是否是現在手裡的數據集完全體現的。儘管許多類型的數據都可以用常見的分佈(高斯分佈、泊松分佈或者二項式分佈)來描述,但是具有非標準分佈的數據集非常常見。如果選擇了錯誤的模型,則對象可能會被錯誤地識別為異常點。其次,如何確定使用屬性的個數,基於統計學的方法,數據的屬性一般具有一個或多個,那麼在建立概率分佈模型的過程中究竟是用一個屬性還是多個屬性需要分析和嘗試。最後,當使用數據屬性很多時,模型比較複雜並且難以理解,會涉及到EM算法。

異常檢測的統計學方法,有兩種具體的方法:參數方法和非參數方法。

span id=”2″/span

假定正常的數據對象被一個以 為參數的參數分佈產生。該參數分佈的概率密度函數 給出對象 被該分佈產生的概率。該值越小, 越可能是異常點。

span id=”2.1″/span

僅涉及一個屬性或變量的數據稱為一元數據。我們假定數據分佈符合正態分佈,然後通過現有的數據得到正態分佈的關鍵參數,把低概率的點識別為異常點。

假定輸入的數據集為 ,數據集中的樣本服從正態分佈,即存在一個 和 ,使得 。這裡的 和 可以通過計算求得。

計算公式如下:

求出上述的參數後,我們就可以根據概率密度函數計算每個數據點服從正態分佈的概率,或者說離散數據點的概率。

概率計算公式為:

需要確定一個閾值,這個閾值一般是經驗值,可以選擇在驗證集上使得評估指標值最大的閾值取值作為最終閾值。如果計算出來的概率低於閾值,就可以認為該數據點為異常點。

例如常用的3sigma原則,如果數據點超過範圍 ,那麼這些點可能是異常點。

這個方法還可以用於可視化。參考箱型圖,以數據集的上下四分位數(Q1和Q3)、中點等參數,異常點常被定義為小於 和 。其中, 。

利用python畫一個箱型圖:

span id=”2.2″/span

涉及兩個或多個屬性或變量的數據稱為多元數據。分為兩種情況,一種是特徵相互獨立,一種是特徵間不相互獨立。

span id=”2.2″/span

當數據是多元數據的時候,核心思想是把多元異常點檢測任務轉換為一元異常點檢測問題。例如基於正態分佈的一元異常點檢測擴充到多元情形時,可以求出每一維度的均值和標準差。對於第 維:

計算概率密度函數:

span id=”2.2.2″/span

span id=”2.3″/span

當實際數據很複雜時,可以考慮建立混合參數模型,假定數據集 包含來自兩個概率分佈: 是大多數(正常)對象的分佈,而 是異常對象的分佈。數據的總概率分佈可以記作

其中, 是一個數據對象; 是0和1之間的數,給出離群點的期望比例。

span id=”3″/span

相比參數方法,非參數方法對數據做較少的假定,不做先驗概率分佈,因而在更多情況下被使用。

直方圖是一種頻繁使用的非參數統計模型,可以用來檢測異常點。該過程包括如下兩步:

步驟1:構造直方圖。使用輸入數據(訓練數據)構造一個直方圖。該直方圖可以是一元的,或者多元的(如果輸入數據是多維的)。

儘管非參數方法並不假定任何先驗統計模型,但是通常確實要求用戶提供參數,以便由數據學習。例如,用戶必須指定直方圖的類型(等寬的或等深的)和其他參數(直方圖中的箱數或每個箱的大小等)。與參數方法不同,這些參數並不指定數據分佈的類型。

步驟2:檢測異常點。為了確定一個對象是否是異常點,可以對照直方圖檢查它。在最簡單的方法中,如果該對象落入直方圖的一個箱中,則該對象被看作正常的,否則被認為是異常點。

對於更複雜的方法,可以使用直方圖賦予每個對象一個異常點得分。例如令對象的異常點得分為該對象落入的箱的容積的倒數。

使用直方圖作為異常點檢測的非參數模型的一個缺點是, 很難選擇一個合適的箱尺寸 。一方面,如果箱尺寸太小,則許多正常對象都會落入空的或稀疏的箱中,因而被誤識別為異常點。另一方面,如果箱尺寸太大,則異常點對象可能滲入某些頻繁的箱中,因而「假扮」成正常的。

span id=”4″/span

HBOS全名為:Histogram-based Outlier Score。它是一種單變量方法的組合,不能對特徵之間的依賴關係進行建模,但是計算速度較快,對大數據集友好。其基本假設是數據集的每個維度 相互獨立 。然後對每個維度進行區間(bin)劃分,區間的密度越高,異常評分越低。

HBOS算法流程:

推導過程如下:

span id=”5″/span

對於異常值的檢測

離群點,是一個數據對象,它顯著不同於其他數據對象,與其他數據分佈有較為顯著的不同。有時也稱非離群點為「正常數據」,離群點為「異常數據」。

離群點跟噪聲數據不一樣,噪聲是被觀測變量的隨機誤差或方差。一般而言,噪聲在數據分析(包括離群點分析)中不是令人感興趣的,需要在數據預處理中剔除的,減少對後續模型預估的影響,增加精度。

離群點檢測是有意義的,因為懷疑產生它們的分佈不同於產生其他數據的分佈。因此,在離群點檢測時,重要的是搞清楚是哪種外力產生的離群點。

常見的異常成因:

通常,在其餘數據上做各種假設,並且證明檢測到的離群點顯著違反了這些假設。如統計學中的假設檢驗,基於小概率原理,對原假設進行判斷。一般檢測離群點,是人工進行篩選,剔除不可信的數據,例如對於房屋數據,面積上萬,卧室數量過百等情況。而在面對大量的數據時,人工方法耗時耗力,因此,才有如下的方法進行離群點檢測。

統計學方法是基於模型的方法,即為數據創建一個模型,並且根據對象擬合模型的情況來評估它們。大部分用於離群點檢測的統計學方法都是構建一個概率分佈模型,並考慮對象有多大可能符合該模型。

離群點的概率定義:離群點是一個對象,關於數據的概率分佈模型,它具有低概率。這種情況的前提是必須知道數據集服從什麼分佈,如果估計錯誤就造成了重尾分佈。

a. 參數法:

當數據服從正太分佈的假設時在正態分佈的假定下,u±3σ區域包含99.7%的數據,u±2σ包含95.4%的數據,u±1σ包含68.3%的數據。其區域外的數據視為離群點。

當數據是非正態分佈時,可以使用切比雪夫不等式,它對任何分佈形狀的數據都適用。根據 切比雪夫不等式 ,至少有(1-1/k 2 )的數據落在±k個標準差之內。所以,有以下結論:

計算得到:通過繪製箱線圖可以直觀地找到離群點,或者通過計算四分位數極差(IQR)定義為Q3-Q1。比Q1小1.5倍的IQR或者比Q3大1.5倍的IQR的任何對象都視為離群點,因為Q1-1.5IQR和Q3+1.5IQR之間的區域包含了99.3%的對象。

涉及兩個或多個屬性或變量的數據稱為多元數據。核心思想是把多元離群點檢測任務轉換成一元離群點檢測問題。

– 卡方統計量的多元離群點檢測 :正態分佈的假定下,卡方統計量也可以用來捕獲多元離群點,對象 ,卡方統計量是: , 是 在第i維上的值, 是所有對象在第i維上的均值,而n是維度。如果對象的卡方統計量很大,則該對象是離群點。

b. 非參數法:

構造直方圖

為了構造一個好的直方圖,用戶必須指定直方圖的類型和其他參數(箱數、等寬or等深)。最簡單的方法是,如果該對象落入直方圖的一個箱中,則該對象被看做正常的,否則被認為是離群點。也可以使用直方圖賦予每個對象一個離群點得分,比如對象的離群點得分為該對象落入的箱的容積的倒數。但這個方法很難選擇一個較好的直方圖參數。

注意 :

傳統的觀點都認為孤立點是一個單獨的點,然而很多的現實情況是異常事件具有一定的時間和空間的局部性,這種局部性會產生一個小的簇.這時候離群點(孤立點)實際上是一個小簇(圖下圖的C1和C3)。

一個對象是異常的,如果它遠離大部分點。這種方法比統計學方法更一般、更容易使用,因為確定數據集的有意義的鄰近性度量比確定它的統計分佈更容易。不依賴統計檢驗,將基於鄰近度的離群點看作是那些沒有「足夠多「鄰居的對象。這裡的鄰居是用 鄰近度(距離) 來定義的。最常用的距離是絕對距離(曼哈頓)和歐氏距離等等。

一個對象的離群點得分由到它的k-最近鄰的距離給定。離群點得分對k的取值高度敏感。如果k太小,則少量的鄰近離群點可能導致離群點較少;如果K太大,則點數少於k的簇中所有的對象可能都成了離群點,導致離群點過多。為了使該方案對於k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。

從基於密度的觀點來說,離群點是在低密度區域中的對象。一個對象的離群點得分是該對象周圍密度的逆。基於密度的離群點檢測與基於鄰近度的離群點檢測密切相關,因為密度通常用鄰近度定義。

定義密度

一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數 。如果該距離小,則密度高,反之亦然。

另一種密度定義是使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等於該對象指定距離d內對象的個數。 需要小心的選擇d,如果d太小,則許多正常點可能具有低密度,從而離群點較多。如果d太大,則許多離群點可能具有與正常點類似的密度(和離群點得分)無法區分。 使用任何密度定義檢測離群點具有與基於鄰近度的離群點方案類似的特點和局限性。特殊地,當數據包含不同密度的區域時,它們不能正確的識別離群點。

定義相對密度

為了正確的識別這種數據集中的離群點,我們需要與對象鄰域相關的密度概念,也就是定義相對密度。常見的有兩種方法:

(1)使用基於SNN密度的聚類算法使用的方法;

(2)用點x的密度與它的最近鄰y的平均密度之比作為相對密度。使用相對密度的離群點檢測( 局部離群點要素LOF技術 ):

一種利用聚類檢測離群點的方法是丟棄遠離其他簇的小簇。這個方法可以和其他任何聚類技術一起使用,但是需要最小簇大小和小簇與其他簇之間距離的閾值。這種方案對簇個數的選擇高度敏感。使用這個方案很難將離群點得分附加到對象上。

一種更系統的方法,首先聚類所有的點,對某個待測點評估它屬於某一簇的程度。(基於原型的聚類可用離中心點的距離來評估,對具有目標函數(例如kmeans法時的簇的誤差平方和)的聚類技術,該得分反映刪除對象後目標函數的改進),如果刪去此點能顯着地改善此項目標函數,則可以將該點定位為孤立點。

基於聚類的離群點:一個對象是基於聚類的離群點,如果該對象不強屬於任何簇。離群點對初始聚類的影響:如果通過聚類檢測離群點,則由於離群點影響聚類,存在一個問題:結構是否有效。為了處理該問題,可以使用如下方法:

對象是否被認為是離群點可能依賴於簇的個數(如k很大時的噪聲簇)。該問題也沒有簡單的答案。一種策略是對於不同的簇個數重複該分析。另一種方法是找出大量小簇,其想法是(1)較小的簇傾向於更加凝聚,(2)如果存在大量小簇時一個對象是離群點,則它多半是一個真正的離群點。不利的一面是一組離群點可能形成小簇而逃避檢測。

根據已有訓練集檢測新樣本是否異常

異常檢測根據原始數據集的不同可分為兩類:

novelty detection: 訓練集中沒有異常樣本

outlier detection: 訓練集中有異常樣本

異常樣本:

數量少,比較分散

novelty detection和outlier detection的區別:

Sklearn異常檢測模型一覽

5.1 奇異點檢測(Novelty Detection)

奇異點檢測,就是判斷待測樣本到底是不是在原來數據的概率分佈內。概率學上認為,所有的數據都有它的隱藏的分佈模式,這種分佈模式可以由概率模型來具象化。

5.1 離群點檢測(Outlier Detection)

不同與奇異點檢測是,現在我們沒有一個乾淨的訓練集(訓練集中也有噪聲樣本)。下面介紹的三種離群點檢測算法其實也都可以用於奇異點檢測。

如果我們認為,可達密度小的目標樣本點就是異常點,這樣未嘗不可。但是,LOF算法更進一步。

LOF可以用來判斷經緯度的異常。

使用python進行異常值(outlier)檢測實戰:KMeans + PCA + IsolationForest + SVM + EllipticEnvelope

文章引用: 數據挖掘:數據清洗——異常值處理

誰有孤立森林python代碼

你好,下面是一個孤立森林的源代碼, 他是根據周志華老師團隊提出的孤立森林算法,用於進行異常點檢測。

from random import sample, random, choice, randint

from math import ceil, log

#from utils import run_time

class Node(object):

    def __init__(self, size):

        “””Node class to build tree leaves

        Keyword Arguments:

            size {int} — Node size (default: {None})

        “””

        # Node size

        self.size = size

        # Feature to split

        self.split_feature = None

        # Split point

        self.split_point = None

        # Left child node

        self.left = None

        # Right child node

        self.right = None

class IsolationTree(object):

    def __init__(self, X, n_samples, max_depth):

        “””Isolation Tree class

        Arguments:

            X {list} — 2d list with int or float

            n_samples {int} — Subsample size

            max_depth {int} — Maximum height of isolation tree

        “””

        self.height = 0

        # In case of n_samples is greater than n

        n = len(X)

        if n_samples  n:

            n_samples = n

        # Root node

        self.root = Node(n_samples)

        # Build isolation tree

        self._build_tree(X, n_samples, max_depth)

    def _get_split(self, X, idx, split_feature):

        “””Randomly choose a split point

        Arguments:

            X {list} — 2d list object with int or float

            idx {list} — 1d list object with int

            split_feature {int} — Column index of X

        Returns:

            int — split point

        “””

        # The split point should be greater than min(X[feature])

        unique = set(map(lambda i: X[i][split_feature], idx))

        # Cannot split

        if len(unique) == 1:

            return None

        unique.remove(min(unique))

        x_min, x_max = min(unique), max(unique)

        # Caution: random() – x in the interval [0, 1).

        return random() * (x_max – x_min) + x_min

    def _build_tree(self, X, n_samples, max_depth):

        “””The current node data space is divided into 2 sub space: less than the

        split point in the specified dimension on the left child of the current node,

        put greater than or equal to split point data on the current node’s right child.

        Recursively construct new child nodes until the data cannot be splitted in the

        child nodes or the child nodes have reached the max_depth.

        Arguments:

            X {list} — 2d list object with int or float

            n_samples {int} — Subsample size

            max_depth {int} — Maximum depth of IsolationTree

        “””

        # Dataset shape

        m = len(X[0])

        n = len(X)

        # Randomly selected sample points into the root node of the tree

        idx = sample(range(n), n_samples)

        # Depth, Node and idx

        que = [[0, self.root, idx]]

        # BFS

        while que and que[0][0] = max_depth:

            depth, nd, idx = que.pop(0)

            # Stop split if X cannot be splitted

            nd.split_feature = choice(range(m))

            nd.split_point = self._get_split(X, idx, nd.split_feature)

            if nd.split_point is None:

                continue

            # Split

            idx_left = []

            idx_right = []

            while idx:

                i = idx.pop()

                xi = X[i][nd.split_feature]

                if xi  nd.split_point:

                    idx_left.append(i)

                else:

                    idx_right.append(i)

            # Generate left and right child

            nd.left = Node(len(idx_left))

            nd.right = Node(len(idx_right))

            # Put the left and child into the que and depth plus one

            que.append([depth+1, nd.left, idx_left])

            que.append([depth+1, nd.right, idx_right])

        # Update the height of IsolationTree

        self.height = depth

    def _predict(self, xi):

        “””Auxiliary function of predict.

        Arguments:

            xi {list} — 1D list with int or float

        Returns:

            int — the depth of the node which the xi belongs to

        “””

        # Search xi from the IsolationTree until xi is at an leafnode

        nd = self.root

        depth = 0

        while nd.left and nd.right:

            if xi[nd.split_feature]  nd.split_point:

                nd = nd.left

            else:

                nd = nd.right

            depth += 1

        return depth, nd.size

class IsolationForest(object):

    def __init__(self):

        “””IsolationForest, randomly build some IsolationTree instance,

        and the average score of each IsolationTree

        Attributes:

        trees {list} — 1d list with IsolationTree objects

        ajustment {float}

        “””

        self.trees = None

        self.adjustment = None  # TBC

    def fit(self, X, n_samples=100, max_depth=10, n_trees=256):

        “””Build IsolationForest with dataset X

        Arguments:

            X {list} — 2d list with int or float

        Keyword Arguments:

            n_samples {int} — According to paper, set number of samples to 256 (default: {256})

            max_depth {int} — Tree height limit (default: {10})

            n_trees {int} —  According to paper, set number of trees to 100 (default: {100})

        “””

        self.adjustment = self._get_adjustment(n_samples)

        self.trees = [IsolationTree(X, n_samples, max_depth)

                      for _ in range(n_trees)]

    def _get_adjustment(self, node_size):

        “””Calculate adjustment according to the formula in the paper.

        Arguments:

            node_size {int} — Number of leaf nodes

        Returns:

            float — ajustment

        “””

        if node_size  2:

            i = node_size – 1

            ret = 2 * (log(i) + 0.5772156649) – 2 * i / node_size

        elif node_size == 2:

            ret = 1

        else:

            ret = 0

        return ret

    def _predict(self, xi):

        “””Auxiliary function of predict.

        Arguments:

            xi {list} — 1d list object with int or float

        Returns:

            list — 1d list object with float

        “””

        # Calculate average score of xi at each tree

        score = 0

        n_trees = len(self.trees)

        for tree in self.trees:

            depth, node_size = tree._predict(xi)

            score += (depth + self._get_adjustment(node_size))

        score = score / n_trees

        # Scale

        return 2 ** -(score / self.adjustment)

    def predict(self, X):

        “””Get the prediction of y.

        Arguments:

            X {list} — 2d list object with int or float

        Returns:

            list — 1d list object with float

        “””

        return [self._predict(xi) for xi in X]

#@run_time

def main():

    print(“Comparing average score of X and outlier’s score…”)

    # Generate a dataset randomly

    n = 100

    X = [[random() for _ in range(5)] for _ in range(n)]

    # Add outliers

    X.append([10]*5)

    # Train model

    clf = IsolationForest()

    clf.fit(X, n_samples=500)

    # Show result

    print(“Average score is %.2f” % (sum(clf.predict(X)) / len(X)))

    print(“Outlier’s score is %.2f” % clf._predict(X[-1]))

if __name__ == “__main__”:

    main()

異常檢測(二)——傳統統計學方法

統計學方法有效性高度依賴於給定數據所做的統計的模型假設是否成立。

異常檢測的統計學方法的一般思想是:學習一個擬合給定數據集的生成模型,然後識別該模型低概率區域中的對象,把他們作為異常點

例如:正態分佈的3個 之外的點為異常點,箱線圖中超過2個Q的點為異常點

根據如何指定和學習模型,異常檢測的統計學方法可以劃分為兩個主要的類型:參數方法和非參數方法

參數方法 假定正常的數據對象被一個以 為參數的參數分佈產生。該參數分佈的概率密度函數 給出對象 被該分佈產生的概率。該值越小, 越可能成為異常點。

非參數方法 並不假定先驗統計模型,而是試圖從輸入數據確定模型。非參數方法通常假定參數的個數和性質都是靈活的,不預先確定(所以非參數方法並不是說模型是完全無參的,完全無參的情況下從數據學習模型是不可能的)。

僅涉及一個屬性或變量的數據稱為一元數據。我們假定數據由正態分佈產生,然後可以由輸入數據學習正態分佈的參數,並把低概率的點識別為異常點。

假定輸入數據集為 ,數據集中的樣本服從正態分佈,即 ,我們可以根據樣本求出參數 和 。

求出參數之後,我們就可以根據概率密度函數計算數據點服從該分佈的概率。正態分佈的概率密度函數為

如果計算出來的概率低於閾值,就可以認為該數據點為異常點。

閾值是個經驗值,可以選擇在驗證集上使得評估指標值最大(也就是效果最好)的閾值取值作為最終閾值。

例如常用的3sigma原則中,如果數據點超過範圍 ,那麼這些點很有可能是異常點。

這個方法還可以用於可視化。箱線圖對數據分佈做了一個簡單的統計可視化,利用數據集的上下四分位數(Q1和Q3)、中點等形成。異常點常被定義為小於Q1-1.5IQR或大於Q3+1.5IQR的那些數據。

用Python畫一個簡單的箱線圖:

涉及兩個或多個屬性或變量的數據稱為多元數據。許多一元異常點檢測方法都可以擴充,用來處理多元數據。其核心思想是把多元異常點檢測任務轉換成一元異常點檢測問題。例如基於正態分佈的一元異常點檢測擴充到多元情形時,可以求出每一維度的均值和標準差。對於第 維:

計算概率時的概率密度函數為

這是在各個維度的特徵之間相互獨立的情況下。如果特徵之間有相關性,就要用到多元高斯分佈了。

在許多情況下假定數據是由正態分佈產生的。當實際數據很複雜時,這種假定過於簡單,可以假定數據是被混合參數分佈產生的。

在異常檢測的非參數方法中,「正常數據」的模型從輸入數據學習,而不是假定一個先驗。通常,非參數方法對數據做較少假定,因而在更多情況下都可以使用。

例子:使用直方圖檢測異常點。

直方圖是一種頻繁使用的非參數統計模型,可以用來檢測異常點。該過程包括如下兩步:

步驟1:構造直方圖。使用輸入數據(訓練數據)構造一個直方圖。該直方圖可以是一元的,或者多元的(如果輸入數據是多維的)。

儘管非參數方法並不假定任何先驗統計模型,但是通常確實要求用戶提供參數,以便由數據學習。例如,用戶必須指定直方圖的類型(等寬的或等深的)和其他參數(直方圖中的箱數或每個箱的大小等)。與參數方法不同,這些參數並不指定數據分佈的類型。

步驟2:檢測異常點。為了確定一個對象是否是異常點,可以對照直方圖檢查它。在最簡單的方法中,如果該對象落入直方圖的一個箱中,則該對象被看作正常的,否則被認為是異常點。

對於更複雜的方法,可以使用直方圖賦予每個對象一個異常點得分。例如令對象的異常點得分為該對象落入的箱的容積的倒數。

使用直方圖作為異常點檢測的非參數模型的一個缺點是,很難選擇一個合適的箱尺寸。一方面,如果箱尺寸太小,則許多正常對象都會落入空的或稀疏的箱中,因而被誤識別為異常點。另一方面,如果箱尺寸太大,則異常點對象可能滲入某些頻繁的箱中,因而「假扮」成正常的。

BOS全名為:Histogram-based Outlier Score。它是一種單變量方法的組合,不能對特徵之間的依賴關係進行建模,但是計算速度較快,對大數據集友好。其基本假設是數據集的每個維度相互獨立。然後對每個維度進行區間(bin)劃分,區間的密度越高,異常評分越低。

HBOS算法流程:

1.為每個數據維度做出數據直方圖。對分類數據統計每個值的頻數並計算相對頻率。對數值數據根據分佈的不同採用以下兩種方法:

靜態寬度直方圖:標準的直方圖構建方法,在值範圍內使用k個等寬箱。樣本落入每個桶的頻率(相對數量)作為密度(箱子高度)的估計。時間複雜度:

2.動態寬度直方圖:首先對所有值進行排序,然後固定數量的 個連續值裝進一個箱里,其 中N是總實例數,k是箱個數;直方圖中的箱面積表示實例數。因為箱的寬度是由箱中第一個值和最後一個值決定的,所有箱的面積都一樣,因此每一個箱的高度都是可計算的。這意味着跨度大的箱的高度低,即密度小,只有一種情況例外,超過k個數相等,此時允許在同一個箱里超過 值。

時間複雜度:

2.對每個維度都計算了一個獨立的直方圖,其中每個箱子的高度表示密度的估計。然後為了使得最大高度為1(確保了每個特徵與異常值得分的權重相等),對直方圖進行歸一化處理。最後,每一個實例的HBOS值由以下公式計算:

推導過程:

假設樣本p第 i 個特徵的概率密度為 ,則p的概率密度可以計算為: 兩邊取對數: 概率密度越大,異常評分越小,為了方便評分,兩邊乘以「-1」: 最後可得:

1.異常檢測的統計學方法由數據學習模型,以區別正常的數據對象和異常點。使用統計學方法的一個優點是,異常檢測可以是統計上無可非議的。當然,僅當對數據所做的統計假定滿足實際約束時才為真。

2.HBOS在全局異常檢測問題上表現良好,但不能檢測局部異常值。但是HBOS比標準算法快得多,尤其是在大數據集上。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/130235.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論