QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4005|回复: 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

    & V$ P5 N9 m5 N( S  _数学建模:异常检测算法
    & ]( c9 Y* y$ {' m, E一、简介 – 关于异常检测% }* P. v2 K: ?) a* l# K
    异常检测(outlier detection)在以下场景:
    & x' \6 B# n* ^/ N0 W0 ~3 K6 }# I: ~7 s5 l" s2 A

    7 ?4 R0 |# i0 Z- [, Y  p数据预处理- J5 z4 V/ X& V$ g) a) l! ~  S
    病毒木马检测3 P7 i6 E; w. n/ h. @  d5 R$ R0 X
    工业制造产品检测
    4 {9 A8 G7 b3 ], i1 w) l' z  C) W+ r网络流量检测
    9 ^, ]$ f3 _1 k4 F( Z等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    + v+ \0 e  j# R, Y4 V& g0 r! Q* r) [( V& @$ F5 ?8 P3 G: E

    5 ^, Z( N% M- H  E5 q1 O6 U监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    . I' h2 Q. p* D3 a; a
    6 \) n* K6 R; ]' y3 l0 o: I
    6 X- ^$ Y7 Y5 p  ~0 c# W
    以下是异常检测和监督学习相关算法的适用范围:3 a- \# C' k5 _$ ~1 S; E; y" Y

    6 @% F0 p" x5 z4 I

    , H  j9 u: m2 M; `: z异常检测
    3 T3 z3 z5 a$ t" p* u信用卡诈骗4 d9 |/ H6 J" u' D" C# [
    制造业产品异常检: }' w! w  n/ e0 K5 a5 t' b. O6 A& l
    数据中心机器异常检
    . `7 _! @7 b# i/ z. k6 D4 x入侵检测
    * j, g1 j# F, j& q监督学习! b0 q7 ?! `! K
    垃圾邮件识别
    * a' e0 }* D+ f9 c& k新闻分类
    2 E' F9 y% J5 H  @6 N2 y二、异常检测算法
    8 }# c" N2 G4 w' |- ^
    4 {+ A1 F5 W8 z# b6 U* r/ U+ g

    4 W1 \3 d( i4 I1 B, ?5 @
    2 q0 j0 l8 i1 w9 s( j/ I& F2 K1 f
    1 ~0 }0 p; @3 r3 q4 O: D

    * V. N) @7 ^, p$ i' q% [7 m3 `
    # m- Y8 B8 v1 t
    import tushare" n- b  ~- q- N0 O; G! `
    from matplotlib import pyplot as plt1 a. M9 h  [* H% j
    1 J" c) p, Y' f+ o5 Y/ R
    df = tushare.get_hist_data("600680")
    $ ]5 U9 ]0 q. f$ w1 E$ sv = df[-90: ].volume
    5 Q8 A; ^' ?: p1 a$ r# iv.plot("kde")
    , x9 G% F# Z, @* Nplt.show()
    9 m" A' `; i6 y' M% z1 ]1
    $ E/ C6 e$ W. e; u9 \  |2
    9 ]3 V) S4 E( p, L! U! E5 g3+ u, d! ~. e# o
    4
    1 A4 P6 [2 j+ b8 A' W9 C" @5
    2 o+ c/ I# [! ^8 D( Y65 ~" u0 \" S' w5 g; e9 [
    7
    3 M; a' W0 m) A- [近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 O# F' ^9 M! s
    0 C% V( e, M/ p  d$ F

    6 R1 h4 a1 C  N+ D; M" I4 @
    & j" _* j9 l5 o" T
    " k% D7 [% W2 q

    % h0 F5 D, U* M0 }
    0 p: [% n% ^4 l9 l* d  q

    $ G& J* d2 w/ ?
    - i( R8 E% f# X, F* J
    2. 箱线图分析. _' \; ^7 y( E) K! a6 W
    import tushare
    - ^# S" f5 I% I, i6 X/ ufrom matplotlib import pyplot as plt, U+ N. j6 z& B6 y3 [% y$ B

    ' S8 u7 q; k/ p2 C; J" Tdf = tushare.get_hist_data("600680")
    ( F' Y/ h9 X! u: k$ rv = df[-90: ].volume
    2 J7 s9 w# b: ]  dv.plot("kde")# n, I9 \+ o2 o2 f2 R
    plt.show()
    ) ^# Z) x1 c; T% n1
    ' f- h, r1 z8 x4 Q; t4 F0 L6 u2
    5 V* D9 w' w. y8 C3
    2 J* X* L  y( D+ ~" g5 ^0 ~! F4
    ! J6 T7 w$ z# q! X, g0 }; K5
    8 o( @# A9 u9 h: c# R# d8 _$ `61 D$ g5 a+ a. L) e
    7: c3 I) d+ |" d  X- o
    9 f2 w# v9 s4 i: i

    % p" P- K  H2 _# a大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!) {  H+ h. B: J7 o" M
    - l* |, c5 D4 G1 c+ S& u
    # l0 d9 c% ?$ C& y* A
    3. 基于距离/密度
    # v4 P! K: K' ?4 x0 D* Z( }# D典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。! \/ \. E) G& i% p( \6 }( x

    ! @; z, p: B( H4 N3 D; \4 l

    4 h5 L" g& l+ E" h2 B; U; U用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    . }3 R) h2 E9 v
    , a: D% _4 q$ N; A* `

    2 A7 {# x. Y2 ~* x
    & F6 x& {; ?  t1 T* y3 z. B4 `( s
    5 R2 u1 x1 G) _  Q' H& W
    ) J. ]; W5 l; k( O  Q
    : n$ ~$ [' m, ]& B: `1 @
    - @# A9 X0 y6 ]% Z
    3 ?1 W& Z# o( s) w4 i1 Z# B& x4 B
    4. 基于划分思想0 i' E: C. O8 C9 U  |5 k
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:* j: |* Q$ x4 a3 j  X
    9 H0 a5 U# W' ~' Q5 p3 u
    3 z! j9 ^+ c/ t, j; E
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    + X: s  l6 x: I& B0 X# Z$ S) t  I  d1 Z7 j0 I4 ?
    4 s1 {0 E( S7 d
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:$ @% w* P) B: x8 _2 S7 w) M- }

    % H* g1 h4 {6 T8 r5 Q
    3 n& w  j: s) S/ i3 W" ^: o7 y! b
    import numpy as np- [* ?3 q) O& k( ?: y3 B. _" c
    import matplotlib.pyplot as plt
    # g/ A4 I- G3 K5 H% ?2 y6 Xfrom sklearn.ensemble import IsolationForest
    4 n1 h! t, y! W' a# A" @! L5 w* Z2 t
    3 V# x+ T7 H0 w, ~# ]$ L3 q
    rng = np.random.RandomState(42)
    4 J$ k  `, N. K$ c; d& ]
    2 n" g9 P8 E( t  E

    ( a  Q& T& U$ o: D1 g# Generate train data/ C7 F% p! H; Z$ H- v
    X = 0.3 * rng.randn(100, 2)5 Q3 S  V# T+ H
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    : C$ d$ g( _3 M4 ~# T* R# Generate some regular novel observations/ J( Q$ |4 O$ `2 g: i7 o
    X = 0.3 * rng.randn(20, 2)4 a( g- s9 G9 M* N2 D: `8 u4 z
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]- [1 i' j/ ]5 v. Z% H6 Z
    # Generate some abnormal novel observations1 r9 A7 P$ x: e+ g) _5 l6 c
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
      y: O* J. y9 z: F) D2 a. i" V" R# a$ B1 A0 m& X4 a' n

    & t7 Q9 W! m, u( o# fit the model" s2 p. E7 A! l- H
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    . Q# v( k5 w: {$ Jclf.fit(X_train)+ ^6 [- ]* `  \' A
    y_pred_train = clf.predict(X_train)' A( r9 t; e8 [
    y_pred_test = clf.predict(X_test)  a8 g5 [/ m, N# Q7 E. {
    y_pred_outliers = clf.predict(X_outliers)8 P, }6 u/ K  R* o

    " w5 j( \0 b( Q& P
    + t: X" U' }3 Z" c3 @
    # plot the line, the samples, and the nearest vectors to the plane! z6 e1 R+ \6 c- @+ Q* H9 w1 y
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))# H+ Z% C4 r7 _. r, D$ K& h
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    . A$ f& v( c' F& i$ iZ = Z.reshape(xx.shape). W8 G) B0 M+ x9 T5 M

    % E8 S5 v6 I% \% p

    / |8 ?% D( G4 D8 C5 g1 [# xplt.title("IsolationForest")/ {" @0 x8 N, Y
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    9 @3 [6 m1 u! z2 l+ P4 Q, h: h: ~5 t2 H, `4 O
    2 A. n3 W" r$ n  g8 h* M  p( H
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white'). M" q: P$ f9 J9 h/ V
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    : r  p0 E6 [( [c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')" v; A" W: X" \7 k
    plt.axis('tight')
    # S& A3 ]' Q) R" ^! g: Kplt.xlim((-8, 8))
    / ]7 i. c# s: m9 j2 a/ g5 p7 d# gplt.ylim((-8, 8))0 t4 s# h- F' f0 f9 C4 A/ ]
    plt.legend([b1, b2, c],
      }9 g8 {9 p4 N% {           ["training observations",1 {) M' g- K3 ?9 M8 L
                "new regular observations", "new abnormal observations"],! ?( ^+ U8 N/ @9 G
               loc="upper left")
    $ ?, F) l( C: k- hplt.show()
    4 [$ ^, f& ]/ C6 D9 w+ ?5 i% o  t1
    8 G5 P4 d) g, r6 ~& P9 I2: x( O+ t+ Q4 D% K$ B
    36 ]4 a. M: z2 B; o$ u
    4( O' C; H8 e- _1 C8 X( |7 M
    5
    2 d! l% N/ y( }8 s5 T/ r& C% V1 y6
    , E) G# r, Z3 \% z% Y4 e7% v$ [: ^' _" b9 a" `6 K
    87 n$ o1 J  r7 \
    9) m' A# C' b+ K& ]
    108 F! O" a( f6 A7 D2 `
    11
    ) ?3 n; \; b9 Z12
    ) b+ F+ e' v. M# B) P13# q- m& L) S. b8 R2 L% ^
    14# d' e: C1 l( G
    15
    ( a: J! n6 u9 o7 P/ `168 U- D1 ?; U! j7 a4 }
    175 E0 c. @  |. o
    18/ ]6 k( o$ j; Z  V8 N6 @' E
    19
      _1 k% R6 `2 C. z) @20
    2 C& W' J" b3 `# `$ K( j$ `0 D& P21* u6 D& V- c6 q9 t/ c
    22$ W' ^2 [4 K" y* v
    23
    2 ?5 ^( @+ |/ ]' E+ A; |' n$ p! n; X245 i1 ?1 A/ N! h/ x4 ~
    25! B1 V/ c' z  r
    26
    ) r. u: d! ], h& X; Y& q0 u4 R3 U27
    / i; ]  E2 T, m, U) \  b6 H6 I28
    , z. s: K# w' W. V29
    5 ~; i! c8 V, T30! ~1 q5 a/ z7 I
    31
    % [2 q" d' z" p- D) B9 P9 k32+ \! W' E. u1 T8 t
    33
    # O' x. k# T5 {2 c" V! v: O34
    ; h$ i1 U* a+ V/ n5 y35: ^, i* d. P+ n+ t0 `
    36
    & H8 [' i- |  S) W* d! y; f37( Y1 e) v+ g+ X3 [, p; Q0 O, N* P
    388 ~+ s4 Y; x+ b) H1 D1 A
    39
    4 o4 H9 I) \7 [+ M40: r3 ?8 [+ D" h5 A- n5 q  c8 D
    418 E2 M. [) v3 ]7 n
    " R; m/ g0 L) `3 M
    * F% G+ J) Z7 a3 e8 P
    ————————————————
    - d, z+ d+ P% v5 ]' d6 {# L版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ! P3 N5 W, a% ^. q原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129/ m4 e+ m0 Y% c1 g2 u

    1 I6 N3 t* I; n" c$ I  O
    7 L/ B0 k2 P% ~7 M' A- [5 F. g
    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 09:26 , Processed in 0.559369 second(s), 52 queries .

    回顶部