QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4029|回复: 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
    : i; I9 B9 D/ g* g( d: a7 `% l2 ~
    数学建模:异常检测算法1 e2 S/ x2 x7 u" h6 \; _% s0 l
    一、简介 – 关于异常检测( A. m; l- q1 h5 @& A
    异常检测(outlier detection)在以下场景:
    8 v! ?0 k; O$ }& `
    $ Y' _% k5 [2 x
    & g  h" ?# \# a  J. r# r8 v' N2 x
    数据预处理
    ; h) l; p! B# }2 F, c1 a病毒木马检测
    $ z) t1 b& m: n1 r: C' J工业制造产品检测2 d, x2 {# e' `% a: I" U/ P
    网络流量检测# T( s7 B- x9 P6 A& _. |+ f+ @
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:/ m( P% m& @8 S: w

    2 E. V6 V0 }; G, l9 r# ~

    / o, x: i8 a1 [* u3 F, l监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。  e) x$ M* m. Q. I' X8 ~" e( k7 `
    * F1 w: |9 ]6 D3 ]/ `

    * Z3 |* T9 }1 |9 g6 j以下是异常检测和监督学习相关算法的适用范围:/ a- a; ~$ O, Z8 R$ F

    # p9 @- n: D- p( ?) _$ `( u
    5 ]) D; n. G7 ]  z% {& R
    异常检测
    " m! Z" h' {% e( ^+ C信用卡诈骗/ f. F9 K. l$ ?6 ^- s
    制造业产品异常检
    0 ^; f% |& _7 ~8 j2 t数据中心机器异常检( B# w3 o7 n& ~( H
    入侵检测
    . l! t8 q! J' {) Q. b监督学习
    * s$ L' _+ x7 s- I% W( e; V垃圾邮件识别4 X1 E1 k3 ]7 W
    新闻分类
    ! C- Z6 \. J5 B' i二、异常检测算法2 L. L* N5 M- ^  }2 b& N

    2 G( Z. j3 b' J, N! p
    . D0 O$ Y- I1 v6 n: b/ i$ o* U# N
    4 Q0 K0 Q: m' l/ U- }, H+ o) d

    4 P7 V' k, W9 K# K! N6 s. _4 S! p' T( B+ N
    : B- k& G9 Q; t
    import tushare3 `, c& t* }9 A3 O9 @" x5 M" D4 \
    from matplotlib import pyplot as plt) p) f- M3 D5 l" E) C
    0 R! y' Z3 a- w- t" V
    df = tushare.get_hist_data("600680")
    / F/ A7 z4 T; B) [9 r4 x4 S& B" [v = df[-90: ].volume2 F7 R0 x, G6 K1 H7 }2 j7 b" ~
    v.plot("kde"), S6 ^- x8 o: D+ i
    plt.show()
    & `  E/ H+ [2 K- N  G/ z. {1! I0 f& v/ y/ q. c4 j0 C. p( H
    2
    - f* G5 [7 Y+ Q( a3; x' [- u5 x/ h# \8 J7 I1 G, v9 @
    4) ~: m4 b+ x4 X% l
    50 }0 v0 v  N8 j8 _: q! W% b6 t' s
    6
    $ R% @4 i& ~+ P) l- T74 Q& |- ^. z5 B* C# }0 \
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    1 x- Q  U8 x. V; {" z+ Z
    / c" P6 V' Z0 X1 K( R) f  n" a* H
    . c* I2 O1 H: j+ B
    $ E: w. ~7 p3 B' h/ w: ]3 s2 O
    " @' H8 \/ c# o' X  i

    . `" H5 }4 b2 D% r3 Z3 _: W
    ' D8 y6 j" {7 y+ T, i

    & ]8 T' L3 }" p" e% T
    # _$ J% U) r- K3 u# n
    2. 箱线图分析
    4 _1 V4 Y# t# H; E+ `1 _7 m8 q( oimport tushare/ V# V9 S4 a8 t( ?5 L
    from matplotlib import pyplot as plt" Q2 e) b9 Z' c% @

    . z8 h9 i! a4 ^: _! z) B2 idf = tushare.get_hist_data("600680")4 C! s2 d* R7 P/ W
    v = df[-90: ].volume
    6 d; {3 l0 L3 q4 Qv.plot("kde")
      N) t: e' h4 W: s1 tplt.show()' g7 X" E+ {( P& y* n
    1
    ; D" R" k1 Z# t; F. F2: J& F3 K' I1 U) I6 z' r# j! D; a
    32 N; }4 z) H( }
    4" f! u- E( f$ |; I; s
    5
    . U3 j" O) Y9 @6 t. z* ~6 M0 O& x1 A" z6# ~9 s+ T$ _, c* @8 X- u
    71 l7 G+ `0 }! I# {( X$ v
      \& Y2 p% B0 X3 R* i* d
    % U5 I: I7 r0 r
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    8 ?2 k/ S4 T) O- f2 p2 o! ~( Z
    4 N. c6 B' `. ~/ f& z
    ' D& l" G4 J  C3 H
    3. 基于距离/密度
    3 k0 \+ j' v) k1 b+ P典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    2 a5 e* i+ p( w; {% o7 k0 ?
    - o+ C8 K! ?+ C" W' f, {3 F4 a' }
    4 W; {# D/ G" e
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    $ O: w- n  P5 S' ^, |& N9 G/ X- O% D$ Q) i2 w* W
    * e4 A3 ~1 `3 |

    % J1 k& `& N- A; K* g+ e

    8 L0 X( Q$ a% J3 U% a6 g% X2 d" E3 e/ g$ f: J3 V
    ; c" l4 b% B, n" J9 K: ?9 a
    , X  |8 @5 L; {' b# U! S0 B

    0 n: G* [# `* I4. 基于划分思想, s/ K7 d0 C8 W9 s3 E0 U( S% ~$ e
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:3 m6 E& L3 A  U1 g
    % D8 T" A5 o" S9 M; r; n

    / K- I) @! A1 L' I假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。4 z' J+ f+ p0 Y( @+ [" M. }# t
    ( C6 h# V; u8 B; q' J
    " t) Q' ?( I( o& F2 N- |
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:  y) \/ z( q, n1 i  k( }

    8 m2 W9 T5 Y2 w3 w3 w+ R9 ?3 F

    & _" r1 }. e7 _7 q- P. Jimport numpy as np9 w% V5 ], b/ Y9 p! e( T1 z" i  Q
    import matplotlib.pyplot as plt
    ; @6 k( e& H; b4 J6 q, ?0 Zfrom sklearn.ensemble import IsolationForest- j5 [+ c4 f9 L; i4 n( `4 K
    0 C; O2 u9 I) ?0 j: s
    % r6 R) U+ j" t9 D
    rng = np.random.RandomState(42)# T  u% {1 A) N
    1 T7 z$ f' B' h+ K8 Y
    # B+ b$ e' H9 d
    # Generate train data: v0 ]! v8 _  V! L2 r- B: Z- S
    X = 0.3 * rng.randn(100, 2)* Q5 ?: h  y/ w0 [8 |" {$ ~% O
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    2 V' H3 d; p2 B% G" M# Generate some regular novel observations
    ' {/ A% S3 K, A7 J/ XX = 0.3 * rng.randn(20, 2)
    / g4 L/ t. H8 l5 V' ~X_test = np.r_[X + 1, X - 3, X - 5, X + 6]1 U3 v4 Z4 R+ V' a% o& E7 u
    # Generate some abnormal novel observations' I, M1 S1 j. i! Z4 L6 D4 g3 a0 Z. q
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))) C: m2 T# _9 s* X1 `# Z

    1 j, U, P6 ], N: B4 u

    1 m# r$ P/ b" A/ V# fit the model
    : o) B+ ^, m6 F1 b. I; n. k# rclf = IsolationForest(max_samples=100*2, random_state=rng)
    . h. o# S3 H8 H( f, K. a/ Qclf.fit(X_train)
    4 l& y3 D  n$ B* `y_pred_train = clf.predict(X_train)7 v2 I6 A! K' H( h+ `4 B( p* z4 P
    y_pred_test = clf.predict(X_test)$ A- ^$ U/ a7 F5 F( L( P/ |, d1 H: G0 ?
    y_pred_outliers = clf.predict(X_outliers)
    ) o- h: o* v7 ]) h
    - h  c( u' _  e7 `$ @
    ' F& r6 I  g! Y8 w' u
    # plot the line, the samples, and the nearest vectors to the plane& T' e) o6 ^- @' Z) G) U* ?; F9 U; u
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))% r# W, Y! c6 v, Y8 R* q/ E" P
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])$ K/ v1 y' p& _5 e3 s. _; J7 P- G' T( J
    Z = Z.reshape(xx.shape): j! e# o' H: Y
    0 M+ ?4 M8 b, J) K8 R8 o

    . y' N! A) }5 r8 E0 |# w- I% V: @8 hplt.title("IsolationForest")
    ( j: {  d* v4 Cplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    : m5 {/ ~5 L, O" B
    $ ?' W2 g8 O! A6 h4 @. f
      C+ v' }( B7 h7 e6 ]
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')1 s2 P5 ^4 V1 v+ r, B5 a
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    . W6 v/ q9 c( y  t7 Zc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    1 }& X; i1 q: m: gplt.axis('tight')
    6 O. g4 u: |8 hplt.xlim((-8, 8)): w9 U+ Q8 O6 [- P7 ]1 ~0 s
    plt.ylim((-8, 8))
    1 o$ [7 P( u( \* g+ V0 [( L/ Bplt.legend([b1, b2, c],  P. |8 ^( o' [& ^' W  P
               ["training observations",6 X* P3 |/ v4 a& L1 P8 j, }
                "new regular observations", "new abnormal observations"],
    - u9 r  X  n  k3 e, {8 z0 i           loc="upper left")
    9 `) D! A# f, _plt.show()( O' o) n  ~# U* v& C
    1& F+ r: r  h5 z6 }% ~1 z
    2
    5 ?/ @/ n) W+ Z7 ?: k1 Y30 I; o9 P, I& A& w, M9 H0 ~
    4; M! B5 c# o$ N
    5
    % Y. w4 Z2 o" T5 ]1 B4 I6
    : D% h. r; Y+ @* J7$ q9 R; X' @2 C7 G
    8
    - u' i& s- X) F- N% Q9: E# L( e6 S0 H, s2 ~
    10
    + M: r2 l# W$ w; w. l11. F( o3 O8 |5 X4 x# h7 G
    12. e8 c9 W3 K7 M" k5 y9 @1 c
    13! o1 {) P: d  m* L# t( A- r
    14
    - G' B3 H( C; Z" @7 G7 E15
    + a' i8 ^+ u/ P$ @! C16
    ) m4 ]# Q( ~: j1 {  `( d. I17
    2 E5 A: e+ }5 d9 m18
    ! ~3 U5 r! i" F# P* h7 y& W, C# z1 y6 R19( O, c' ]7 y- Q' S9 n) m
    20  }- M) m1 N0 m- ~3 p
    21+ J: i# _* ^" e$ }
    22
    ' `. ~. p' l) o# w233 G9 D- y! E; l& q& D
    24
    ! y& A. J. l4 p3 u7 s* i7 P25
    $ W6 w/ ]) a  v. a, ?) p# e26
    ; a9 i) q& f$ K+ L2 \$ h. x& [27
    6 q# k0 ]' Z. _  Q280 I( Z* q3 w+ @8 A3 t
    29+ Y: I( v1 {1 W& y9 ?; P
    30
    8 j& \5 X6 G1 P31  |8 d5 X  x6 p1 G9 V0 {6 G5 f
    32
    3 h( E; `+ E! k8 j) d8 z+ z33) k& O# ~% I# J2 a8 x4 ~
    34
    8 L" D6 l/ h0 w! J% `* F% X35) C4 c4 n" N9 b# U* {
    36
    0 _3 g0 ]3 D) E1 F. ?; p% |* O37; D/ @( }! E$ E
    38# k8 e+ K1 \) o+ h6 b' S# Z
    39
    ; i  I5 }& V" V, F% j' [. H40% t5 u- a+ f3 h+ I* z
    41
    $ S8 l6 f7 p: h7 n; S4 z  T4 c: T7 j# G3 Q

    . S2 U1 L6 s& I0 m7 I0 N————————————————6 N# l# c7 V- s. u* a3 z3 K+ b& |& g
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* X: o5 x: h* m' y' z# _
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231297 C9 Y+ G$ ~8 W% {& f2 i

    0 a, k" T" H1 P0 W. @
    " [" Q; C* \: K; P/ r/ m
    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-9-13 21:26 , Processed in 1.324320 second(s), 51 queries .

    回顶部