QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4003|回复: 0
打印 上一主题 下一主题

数学建模:异常检测算法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-16 15:24 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    ( n3 `0 |& d0 u
    数学建模:异常检测算法
    ( N. ?) A# [  a% a- [: f一、简介 – 关于异常检测4 _& B% y' W' u8 D% Y
    异常检测(outlier detection)在以下场景:
    . [/ s; Y6 H6 |" W5 `0 n# ^$ N/ m  _/ G) ], ?& R
    ; N& R! ?. u7 g
    数据预处理9 n4 j7 _: B6 d3 W* ?  o+ S
    病毒木马检测
    $ Q0 Z* h$ O* O" h8 V工业制造产品检测) t! I" J8 Q% v. m- w
    网络流量检测
    % p! s! s/ a% ?% f等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:% B" A. D2 u; Q, `8 q* c. |

    ! i* i* g4 F, b5 J& ~6 u

    ; U4 _  e7 v. \" ?! N监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。: ]7 G1 Q5 v3 k' N; N
    2 F: x+ Q2 a9 Z% T( p7 B# R: I
    ' z0 C; Q: `7 v; ]' T6 A5 r1 o* i2 a8 B
    以下是异常检测和监督学习相关算法的适用范围:( e8 j) r* O5 L! O. X

    1 f1 |7 C$ d# _) U' M

    , ]$ @2 F- ?5 q7 P' d异常检测& K- a9 ?. C* i! o( G) q
    信用卡诈骗
    $ _7 o- x3 M0 v2 q% V7 q) i制造业产品异常检# C9 y% e$ v; t3 @! x- d
    数据中心机器异常检
    6 O( H/ G7 u& U入侵检测
    # X) M, n; T: ?8 e- Q) q& ~7 J$ T监督学习
    ( I2 h/ y4 H, K  X  Z; A# r+ l垃圾邮件识别( _3 P2 P1 I  U1 {
    新闻分类
    ; F1 A' S8 o7 \  z* b# g, L二、异常检测算法
    8 C3 A3 s$ d& K" A6 ?% o
    6 T5 F) I0 i9 t" r
    , N3 r" Z) q4 M4 V' N
    5 r: [; d7 i6 j/ C! G. L

    ! d9 m# Q- W( M1 P
    5 k8 J( {: S+ ?5 ?' G( o* E

    5 w2 T9 v4 l% d! Z: p. Vimport tushare
    5 I' y% }/ u; k9 H3 c, J' ^, V( ffrom matplotlib import pyplot as plt
    7 ?( ^) J7 I- P# z, ~- a4 X2 g
    " V$ L9 Z9 N" ~! s) K/ r. \df = tushare.get_hist_data("600680")/ W3 U( Z- r+ c# S% I! P' `
    v = df[-90: ].volume
    ; s2 A7 a0 \0 W8 ]v.plot("kde")
    7 j$ X3 ~; ^9 Q1 ^0 D0 s0 Mplt.show()) }) h8 J6 d  g: i
    1
    2 e4 x! c' Y7 U0 y2" g0 Q# s) t9 K# M! C, J9 [
    34 X* d  Z, L% R) m# }
    4
    . @: Z2 a+ \4 u( r" j1 f5
    * x; `* a0 C# z% E; W% J, O! s6+ C5 s6 o( S! V8 ]" k' G
    7
    / j! `8 C  c/ |8 k2 d! P/ O近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    % Z- c4 s  @( u' J: `) k
    2 j+ ?( T2 K$ b; d: |  O3 u
    * Y7 K% _0 \3 x; z( X  A
    1 m$ Z* x$ k8 g/ L. `% l' W

    ( S3 O1 B5 R6 x" o  d! o2 Y: j! F7 n+ m* Y: F* ~3 O; j

    5 ~& r/ g8 F9 v% c# n8 G6 _& a9 I' f: G: @' R* K
    % o3 e( D. s% y( I5 l
    2. 箱线图分析
    & f( l# y( j$ x3 L! y) H7 eimport tushare
    . H! I  G8 B. g9 U: L0 ^( c$ ffrom matplotlib import pyplot as plt) k. }! E# e' J( y. o. L3 ?( w- W
    % c% Y0 p. t$ g
    df = tushare.get_hist_data("600680")
    # z1 @5 u' u9 V3 O* X! I; Cv = df[-90: ].volume
    % U' a' Q+ \/ ?3 K% E6 Lv.plot("kde")
    , N% N! y  H, Gplt.show()3 S- `* e/ n) Y7 L, n
    14 i% `2 s% d0 ~( W; |- R
    22 T. d7 J7 u$ m8 J. Q7 ]" ?
    3. x/ h6 E! |/ l! f8 \) N, R" i% ]0 l
    4
    ) o* G' P1 ]' B4 T( Q5
    # d" G4 D/ D. E) |( X! z6! o% y1 b7 |8 K6 b& v2 e! q9 R
    7
    # V$ O( a# l) ?3 |" l9 _- o. E4 \, b* Z9 L3 X

    4 L1 f+ b5 [7 ^  e" |, b$ e大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!5 Q- _% H1 a0 W7 h4 a' e

    $ e0 c* P0 p) C+ p5 O
    % m% Z  S6 I/ O$ z( Q- u
    3. 基于距离/密度
    ; y& G4 m* F% J* T) d3 a典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。3 e# r4 e- _4 O/ ]+ t  [$ F
    " O$ |( E! [& k* x/ ], l% ^# H
    & Z2 S/ l+ L/ r
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    4 d  R) X6 X  u3 S* D  i
    3 J% H8 k; l; M# Z/ v% K- M
    8 I2 B4 q% l, S! S
    3 d6 S) I! b" T7 U+ R
    + v4 ^& d* E+ d4 Y1 G+ `
    ) D  y2 d+ V+ V0 x6 @0 N% K

    - f  ^' p+ {9 ]" I- K$ w8 ~
    * l$ h0 ]9 q( u  S$ Z' Q
    % t8 x+ w' {$ c% E6 i  a1 z% m
    4. 基于划分思想
    & b8 s2 a  f4 J  \0 r+ G& Z4 Q: E典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    2 |# w" ]6 s  i3 q7 `
    $ f: h. A- I/ O& r4 k* x

    ( i4 s- A  }. |5 f6 C假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。4 `7 s' g( q4 V. n
    , l4 w' p& m1 a7 [% i. U/ k

    5 y4 |: b: O  E5 _* j$ A这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    5 @+ i- D% O9 B5 K  R: [$ G& J; |/ F

    / N+ I" F0 h, P, j( g- ximport numpy as np
    5 K) G% g6 U/ C/ E* rimport matplotlib.pyplot as plt
    - g! T4 F7 {3 }) w. b# q1 Kfrom sklearn.ensemble import IsolationForest
    . G# N) t6 F* r- ~" {" M/ r5 C
    + j' N- @1 l8 Q$ l

    # d6 j9 N# K+ c$ j6 _5 Mrng = np.random.RandomState(42)! H3 V7 ]1 f3 h3 l  g5 ^

    $ e7 o' E: ], e2 R# U

    & ~' t* H; b5 i) o4 e9 Z6 @# Generate train data' f! y4 x* L+ k- Q' w7 A) r
    X = 0.3 * rng.randn(100, 2)* C2 a2 n! N8 |" I9 @0 z* \" z
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    . S' e, ~- x, P5 l; ]: @8 C+ y# Generate some regular novel observations
    5 J. o% ]+ i' t. vX = 0.3 * rng.randn(20, 2)
    : W$ P! W! H1 J. I5 g( r5 G  KX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    7 V& Z8 j+ B$ a% v# Generate some abnormal novel observations$ B0 L9 }2 d7 [# m" W
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))$ w- o% q2 O: p$ L3 {. j, o; n. P, S+ s

    , B0 f2 }, u0 i) j! V- k$ {
    1 ~, G/ p0 ?* h$ |8 @
    # fit the model
    6 \- Z& ^3 u( m8 V5 @. x' pclf = IsolationForest(max_samples=100*2, random_state=rng)* j; M8 P, |6 `6 c  S: E8 v8 a  v: ^
    clf.fit(X_train)
    % X- N! J# F. K9 P& Q& qy_pred_train = clf.predict(X_train): U" H0 p% W1 v
    y_pred_test = clf.predict(X_test)
    / v) h. n5 ^5 Z* s9 F8 q: H% Uy_pred_outliers = clf.predict(X_outliers)
    ( d' T6 M; x: G* ~9 D. [; D8 k8 D% q5 a# `1 u# H2 n( f4 J
    5 G# P; X5 v3 [  t1 v5 f
    # plot the line, the samples, and the nearest vectors to the plane& @& t5 g. M; j% z0 G3 Q  G
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    - l. @& k# o% d2 y) @0 V% v1 vZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    - f* U- X: e% `6 ]4 [Z = Z.reshape(xx.shape)
    ' g  U0 J, X) B& V! ^1 H( q% ]" {+ G* k

    1 r6 T% P$ q8 A% J: a" Kplt.title("IsolationForest")
    $ a! f5 h, j. A. W1 F1 c; iplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    7 Y0 p9 @6 Y( M8 z+ X6 N" X6 g& i/ M$ H+ r) s$ @1 r0 X) B6 ?
    . N# }2 Y9 _0 @4 J$ w3 ^
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')0 n  {  p# A% I- F
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    : u# j- E1 A# K6 ic = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    ( W3 H! K% |1 ~! |5 X7 s/ bplt.axis('tight')
    2 u5 e, ?! C2 Q% \3 o0 f6 xplt.xlim((-8, 8))1 v6 h' E: M' S2 `7 W$ |
    plt.ylim((-8, 8))
    ( S  a" o0 Z& ~% W$ Nplt.legend([b1, b2, c],/ ]8 h1 P- b1 u1 x4 z# u/ h' a
               ["training observations",7 U9 X) E) j1 }+ d' i
                "new regular observations", "new abnormal observations"],' x. l0 p) T  m3 u) ~
               loc="upper left")
    ) t6 G7 q) O5 }4 c, E( cplt.show()
    - R* C1 ?% p9 C2 P1$ r$ x% B. W4 U' S. e3 E
    23 N5 v  R/ {0 w, Z
    3* O! [5 z6 E+ U( \6 W( o" l
    4+ _3 M1 n: a% W" H% i2 b0 a
    54 n5 k$ k- M2 X) j
    6. J5 \% u# P5 ?5 A* n% ?. K2 p
    7& K3 i: k3 |* _; k4 J
    8" x: ~+ o  L) Q) ^; z
    98 K: \+ L1 E. w7 c( P: t
    10/ o( \" h6 U$ Q- P
    11
    % F7 Y5 F# ]! g( D12& N+ I, v  m+ @9 F1 d; V
    13& @' j- z/ i  s. F8 j: I$ Y
    14
    3 t; ?8 {- C3 [/ w0 e; j. \5 E3 B15
    . b6 j+ W  B8 h16
    % c, A1 |# S/ z. N2 j170 _1 m  z3 B& R/ t8 b; F& Y* j( r
    18; s( J) r' D- K8 V2 c, d+ H& @
    19% o3 U1 {8 T2 |4 j. Y2 ?8 Z) W# e
    20/ W+ _9 \8 D3 e/ E- Y7 G) `
    21& d! b% T; E! g$ u
    22
    # v2 c7 {4 y7 T$ ]# |* T6 o: y23; C" ?% q3 v, i& f1 C+ U/ x8 t
    24
    & V2 ^: K$ z6 a! z' ?25# M3 Y6 Q3 I5 G& s
    26; q7 n' T* f8 \9 N
    27
    : X4 ^; L# v! k# k2 @$ [+ t28
    4 q1 H' @/ h9 N# e* G5 w29
    ! G  U: ]& u- F30
    7 b; @% X& L3 e8 y4 |# o+ f( Y' f31
    ' J! z! F. |/ S- B  j  @3 e) k, h. [327 D, F) P( p& p5 \: p
    33
    2 R3 X0 a1 N! ~4 l# @3 r34  D0 q; [3 V: Z2 y
    35( ?8 v; a5 A; |; P" E. d
    36. H- |5 r( L  N. M" a8 w
    37
    ! b4 n0 X. e) w4 i! X" u! {38
    " B& L; X# j" X5 T+ R- ?39" F8 P! w3 o: a8 ]* l" N
    40
    , Y8 y! y8 z; `: [/ @3 K41. r! ^# o4 ?7 ^& r. o
    ( I  D9 c: Y. X, V/ a. O; z
    3 c+ F. c1 d$ y& d' ~
    ————————————————+ l& T# V5 e2 G+ S4 S4 Y( X! P: s
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# @. Y& ~: |) M. i
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    * Z+ J+ ~1 t2 O3 a; k3 T; S5 s; A3 Z1 @

    % M4 [/ m! d% L' {1 F# [
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-3 04:14 , Processed in 0.343264 second(s), 50 queries .

    回顶部