【數學建模】孤立森林算法:異常檢測的高效利器

孤立森林算法:異常檢測的高效利器

文章目錄

  • 孤立森林算法:異常檢測的高效利器
    • 1 引言
    • 2 孤立森林算法原理
      • 2.1 核心思想
      • 2.2 算法流程
        • 步驟一:構建孤立樹(iTree)
        • 步驟二:構建孤立森林(iForest)
        • 步驟三:計算異常分數
    • 3 代碼實現
    • 算法優勢
    • 應用場景
    • 算法參數調優
    • 局限性與改進
    • 結論
    • 參考資料

1 引言

在數據挖掘和機器學習領域,異常檢測是一個重要的研究方向。異常檢測的目標是從數據集中找出與大多數數據顯著不同的異常點。這些異常點可能代表系統故障、欺詐行為、網絡入侵等異常情況。本文將介紹一種高效的異常檢測算法——孤立森林(Isolation Forest),它以其簡單高效的特點在異常檢測領域備受關注。

2 孤立森林算法原理

2.1 核心思想

孤立森林算法的核心思想非常直觀:異常點更容易被孤立。如下圖所示,B點所表示的數據很可能是一個異常值。
孤立森林算法

與傳統的基于密度或距離的異常檢測方法不同,孤立森林采用了一種全新的視角:通過隨機構建決策樹來孤立數據點。算法假設異常點具有以下兩個關鍵特性:

  1. 數量少
  2. 特征值與正常點顯著不同

基于這兩個特性,異常點通常更容易在決策樹的早期被孤立出來,即到達葉子節點所需的決策路徑更短。

2.2 算法流程

孤立森林(Isolation Forest)是一種無監督學習算法,主要用于異常檢測,以下是它的主要步驟和相關公式(參考資料:孤立森林(isolation):一個最頻繁使用的異常檢測算法 。):

步驟一:構建孤立樹(iTree)
  1. 隨機選擇數據集的子樣本
  2. 隨機選擇一個特征維度 q
  3. 隨機選擇一個分割值 p (在特征 q 的最大值和最小值之間)
  4. 根據特征 q 和分割值 p 將數據分為左右兩部分
  5. 遞歸重復上述過程,直到:
    • 節點中只包含一個樣本
    • 達到預定義的最大樹高度 (通常為 log?(子樣本大小))
    • 所有樣本具有相同的特征值
      構建孤立樹
步驟二:構建孤立森林(iForest)
  • 重復構建多棵孤立樹(通常為50-100棵)
步驟三:計算異常分數
  1. 對于每個樣本,計算在每棵樹中的路徑長度(從根節點到終止節點的邊數)
  2. 取這個樣本在所有樹中的平均路徑長度作為該樣本的最終路徑長度

異常分數 s 的計算公式為:

s ( x , n ) = 2 ? E ( h ( x ) ) c ( n ) s(x, n) = 2^{-\frac{E(h(x))}{c(n)}} s(x,n)=2?c(n)E(h(x))?

其中:

  • h ( x ) h(x) h(x) 是樣本 x x x 的平均路徑長度
  • E ( h ( x ) ) E(h(x)) E(h(x)) h ( x ) h(x) h(x) 的期望值
  • c ( n ) c(n) c(n) 是樣本數為 n 的二叉搜索樹的平均路徑長度的歸一化因子

歸一化因子 c ( n ) c(n) c(n) 的計算公式:

c ( n ) = 2 H ( n ? 1 ) ? 2 ( n ? 1 ) n c(n) = 2H(n-1) - \frac{2(n-1)}{n} c(n)=2H(n?1)?n2(n?1)?

其中 H ( i ) H(i) H(i) 是第 i 個調和數:

H ( i ) = ln ? ( i ) + 0.5772156649 H(i) = \ln(i) + 0.5772156649 H(i)=ln(i)+0.5772156649

  • s s s 接近 1 時,樣本更可能是異常點
  • s s s 接近 0.5 時,樣本更可能是正常點
  • s s s 明顯小于 0.5 時,樣本可能在一個密集區域

通常我們設置一個閾值(如0.6)來判斷異常點。

3 代碼實現

下面是使用Python和scikit-learn庫實現孤立森林算法的示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
from sklearn.datasets import make_blobs# 生成示例數據:正常點和異常點
n_samples = 300
n_outliers = 15
X, _ = make_blobs(n_samples=n_samples-n_outliers, centers=1, cluster_std=0.5, random_state=42)# 添加一些異常點
rng = np.random.RandomState(42)
X = np.vstack([X, rng.uniform(low=-4, high=4, size=(n_outliers, 2))])# 訓練孤立森林模型
clf = IsolationForest(n_estimators=100, max_samples='auto', contamination=float(n_outliers) / n_samples,random_state=42)
clf.fit(X)# 預測結果
y_pred = clf.predict(X)  # 1表示正常點,-1表示異常點
scores = clf.decision_function(X)  # 異常分數# 可視化結果
plt.figure(figsize=(10, 7))
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
plt.colorbar(label='預測結果:1為正常,-1為異常')
plt.title('孤立森林異常檢測結果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()

算法優勢

孤立森林算法相比傳統異常檢測方法具有以下優勢:

  1. 高效性:時間復雜度為O(n log n),適用于大規模數據集
  2. 無需密度估計:不需要計算點與點之間的距離或密度,減少了計算開銷
  3. 適應高維數據:不受維度災難的影響,在高維空間中表現良好
  4. 無需假設數據分布:不需要對數據分布做任何假設
  5. 易于實現和使用:算法簡單,參數較少

應用場景

孤立森林算法在多個領域有廣泛應用:

  • 金融欺詐檢測:識別異常交易行為
  • 網絡安全:檢測網絡入侵和異常流量
  • 工業監控:發現設備異常運行狀態
  • 醫療健康:識別異常生理指標
  • 質量控制:檢測生產過程中的異常產品

算法參數調優

在使用孤立森林算法時,以下參數需要特別關注:

  1. n_estimators:森林中樹的數量,通常100~200棵樹已經足夠
  2. max_samples:每棵樹的樣本數量,默認為’auto’(256)
  3. contamination:數據集中預期的異常比例
  4. max_features:每次分割考慮的特征數量
  5. bootstrap:是否使用有放回抽樣

局限性與改進

盡管孤立森林算法表現優秀,但它也存在一些局限性:

  1. 對于具有不同密度區域的數據集,可能會將低密度正常區域誤判為異常
  2. 在處理包含大量不相關特征的數據時效果可能下降

針對這些問題,研究人員提出了一些改進版本,如Extended Isolation Forest和SCiForest等。

結論

孤立森林算法憑借其簡單、高效、可擴展的特點,已成為異常檢測領域的重要工具。它不僅在理論上具有堅實基礎,在實際應用中也展現出了強大的性能。對于需要進行異常檢測的數據科學家和工程師來說,孤立森林無疑是一個值得掌握的算法。

在實際應用中,建議將孤立森林與其他異常檢測方法結合使用,以獲得更加穩健的檢測結果。同時,針對特定領域的數據特點進行參數調優,也能顯著提升算法性能。

參考資料

  1. Liu, F. T., Ting, K. M., & Zhou, Z. H. (2008). Isolation forest. In 2008 Eighth IEEE International Conference on Data Mining (pp. 413-422). IEEE.
  2. Scikit-learn官方文檔:Isolation Forest
  3. 周志華. (2016). 機器學習. 清華大學出版社.

本文介紹了孤立森林算法的基本原理、實現方法、優勢特點及應用場景,希望能對讀者理解和應用這一算法有所幫助。如有問題,歡迎在評論區討論交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77961.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android面試八股文】Android系統架構【一】

Android系統架構圖 1.1 安卓系統啟動 1.設備加電后執行第一段代碼:Bootloader 系統引導分三種模式:fastboot,recovery,normal: fastboot模式:用于工廠模式的刷機。在關機狀態下,按返回開機 鍵進…

jvm-獲取方法簽名的方法

在Java中,獲取方法簽名的方法可以通過以下幾種方式實現,具體取決于你的需求和使用場景。以下是詳細的介紹: 1. 使用反射 API Java 提供了 java.lang.reflect.Method 類來獲取方法的相關信息,包括方法簽名。 示例代碼&#xff1a…

DeepSeek和Excel結合生成動態圖表

文章目錄 一、前言二、3D柱狀圖案例2.1、pyecharts可視化官網2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、動態調整數據 一、前言 最近在找一些比較炫酷的動態圖表,用于日常匯報,于是找到了 DeepseekExcel王牌組合,其等同于動態圖…

探索 .bat 文件:自動化任務的利器

在現代計算機操作中,批處理文件(.bat 文件)是一種簡單而強大的工具,它可以幫助我們自動化重復性任務,工作效率提高。盡管隨著編程語言和腳本工具的發展,.bat 文件的使用頻率有所下降,但它依然是…

PyTorch與自然語言處理:從零構建基于LSTM的詞性標注器

目錄 1.詞性標注任務簡介 2.PyTorch張量:基礎數據結構 2.1 張量創建方法 2.2 張量操作 3 基于LSTM的詞性標注器實現 4.模型架構解析 5.訓練過程詳解 6.SGD優化器詳解 6.1 SGD的優點 6.2 SGD的缺點 7.實用技巧 7.1 張量形狀管理 7.2 廣播機制 8.關鍵技…

【C++】特殊類的設計、單例模式以及Cpp類型轉換

📚 博主的專欄 🐧 Linux | 🖥? C | 📊 數據結構 | 💡C 算法 | 🌐 C 語言 上篇文章: C 智能指針使用,以及shared_ptr編寫 下篇文章: C IO流 目錄 特殊類的設…

探索 Flowable 后端表達式:簡化流程自動化

什么是后端表達式? 在 Flowable 中,后端表達式是一種強大的工具,用于在流程、案例或決策表執行期間動態獲取或設置變量。它還能實現自定義邏輯,或將復雜邏輯委托…… 后端表達式在 Flowable 的后端運行,無法訪問前端…

【Lua】Lua 入門知識點總結

Lua 入門學習筆記 本教程旨在幫助有編程基礎的學習者快速入門Lua編程語言。包括Lua中變量的聲明與使用,包括全局變量和局部變量的區別,以及nil類型的概念、數值型、字符串和函數的基本操作,包括16進制表示、科學計數法、字符串連接、函數聲明…

符號速率估計——小波變換法

[TOC]符號速率估計——小波變換法 一、原理 1.Haar小波變換 小波變換在信號處理領域被成為數學顯微鏡,不同于傅里葉變換,小波變換可以觀測信號隨時間變換的頻譜特征,因此,常用于時頻分析。 ??當小波變換前后位置處于同一個碼元…

android contentProvider 踩坑日記

寫此筆記原因 學習《第一行代碼》到第8章節實現provider時踩了一些坑,因此記錄下來給后來人和自己一個提示,僅此而已。 包含內容 Sqlite數據庫CURD內容provider界面provider項目中書籍管理provider實現邏輯用adb shell確認providercontentResolver接收…

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注冊中心2.CAP理論3.常見的注冊中心 二.Eureka介紹1.搭建Eureka Server 注冊中心2.搭建服務注冊3.服務發現 三.負載均衡LoadBalance1.問題引入2.服務端負載均衡3.客戶端負載均衡4.Spring Cloud LoadBalancer1).快速上手2)負載均衡策…

【開關電源】關于GaN反激電源開關噪聲

文章目錄 0 前言1 設計信息1.1 設計需求1.2 原理圖1.3 電源表現 2 原因分析3 橫向對比TI UCG28826 (GaN)采購的普通QR反激變換器 4 總結 0 前言 筆者原計劃設計一款省電的,效率尚可的,穩定的2路輸出反激電源,用于系統…

DOCA介紹

本文分為兩個部分: DOCA及BlueField介紹如何運行DOCA應用,這里以DNS_Filter為例子做大致介紹。 DOCA及BlueField介紹: 現代企業數據中心是軟件定義的、完全可編程的基礎設施,旨在服務于跨云、核心和邊緣環境的高度分布式應用工作…

mybatis mapper.xml中使用枚舉

重點:application.propertis配置類 #TypeEnumHandler 這個類的包名,不是全路徑 mybatis.type-handlers-packagecom.fan.test.handler兩個枚舉類: public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…

鴻蒙生態:鴻蒙生態校園行心得

(個人觀點,僅供參考) 兄弟們,今天來淺淺聊一聊這次的設立在長沙的鴻蒙生態行活動。 老樣子,我們先來了解一下這個活動: Harmon&#x…

【速寫】多LoRA并行衍生的一些思考

遷移學習上的一個老問題,怎么做多領域的遷移?以前的邏輯認為領域遷移屬于是對參數做方向性的調整,如果兩個領域方向相左,實際上不管怎么加權相加都是不合理的。 目前一些做法想著去觀察LoRA權重矩陣中的稠密塊與稀疏塊&#xff0…

【Delphi 基礎知識 44】接口interface的應用

目錄 1. 前言2. 接口有哪些優勢2.1. 實現多態性2.2 實現多重(解決單繼承限制)2.3 解耦代碼(依賴注入)2.4 便于測試(模擬接口)2.5 跨語言互操作性(COM支持)1. 前言 總結為一句話就是:接口只告訴你要做什么,而類會告訴你應該怎么做 下面是最簡單的接口實現 typeIMyIn…

09.傳輸層協議 ——— TCP協議

文章目錄 TCP協議 談談可靠性TCP協議格式 序號與確認序號窗口大小六個標志位 確認應答機制(ACK)超時重傳機制連接管理機制 三次握手四次揮手 流量控制滑動窗口擁塞控制延遲應答捎帶應答面向字節流粘包問題TCP異常情況TCP小結基于TCP的應用層協議 TCP協…

NLP高頻面試題(五十一)——LSTM詳解

長短期記憶網絡(LSTM)相較于傳統循環神經網絡(RNN)的核心改進在于通過引入記憶單元(cell state)和門機制(gating mechanism)來有效緩解梯度消失與梯度爆炸問題,從而更好地捕捉長距離依賴關系 。在其網絡結構中,信息通過輸入門(input gate)、遺忘門(forget gate)和…

SpringCloud組件—Eureka

一.背景 1.問題提出 我們在一個父項目下寫了兩個子項目,需要兩個子項目之間相互調用。我們可以發送HTTP請求來獲取我們想要的資源,具體實現的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 舉個例子&#x…