QQ登录

只需要一步,快速开始

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

    0 |4 h6 u9 v' u1 A# i数学建模:异常检测算法
      d5 k- z) [7 w' E- u一、简介 – 关于异常检测
    / n0 M6 X$ G+ I) C异常检测(outlier detection)在以下场景:
    6 ~0 j. _* e9 Y7 `; Y0 u
    - V0 q4 \( Z7 {/ `
    2 ~' o2 m. }7 e6 V- H4 l
    数据预处理
    " s' K. e! v1 F2 N' F' q7 [病毒木马检测- w  q; Z' n- u" I& S
    工业制造产品检测5 z1 e: B4 q% }. Y  y" c
    网络流量检测0 L1 F0 y% A. X
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    0 S4 g) @$ w9 e
    8 Z, [# A9 P# {% O9 [7 }" e
    , s4 M$ L7 A8 p3 A3 J! u: Q4 U- z
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    ; ~# c7 }% E1 D$ `7 K; F2 \- }. J8 f6 S$ {1 Q- J/ l: E

    " o. t0 q, k; C* }- q9 {以下是异常检测和监督学习相关算法的适用范围:
    ' Z+ o! T/ A$ q  X( ~; J* y8 m6 m+ A& U- X

    # ?' U1 e* t& Q- p% e& F异常检测
    : ]& Q' m' J$ E3 Y; `9 u" f: ]1 t信用卡诈骗$ H/ X7 h7 b  i0 m8 j/ ], W
    制造业产品异常检
    3 Y3 o6 t' k4 h0 N数据中心机器异常检4 c! E: u3 Q9 M  y- y
    入侵检测
    ' @, ^: v) e  m  S/ Z4 f监督学习4 ]* j. F/ K) m4 O7 ~' [5 y& U
    垃圾邮件识别
    ! j5 I- q9 C- W7 y* B5 Y新闻分类. F, }8 M1 f  e9 g) L
    二、异常检测算法
      H) c' e( L8 e, S. p. ~5 L  w$ c/ h$ O5 `2 D# c: r: s/ a  l8 V7 B

    " D9 W* b1 \! [; a$ L" J! \9 C
    " |- f' j: g; m5 Y
    $ ?! H7 a6 E: k2 [7 o& f% A! S1 ]
    # e- W! L9 }8 C# e& g$ z5 Z! p
    2 I: c4 X% Q  ~
    import tushare1 B" I" b, h4 N
    from matplotlib import pyplot as plt
    7 {5 c' z/ l9 h) o/ y; A " U7 v) r: `6 F6 B. u1 h* i8 }3 N  _
    df = tushare.get_hist_data("600680")
    + ~& D0 u3 q& ?4 X, hv = df[-90: ].volume
    6 O2 C- k3 R* _$ G0 z; L. n' n* gv.plot("kde")+ h2 l4 _2 c$ W9 A
    plt.show()
    ! {: [! \! l: m/ B3 M( m  S* K9 n1
    $ d$ B9 ~# j& `: R# v2; ?: d; Z* G" _2 X" P
    3- p4 ]! t% M; Z' |- d
    4
    + v6 E3 ^' [: f2 R+ S0 ~, q6 C5
    9 N0 t- A6 p; h! Q2 v0 K/ K, L66 h# m: o- P( _
    7
    ! j: X% S0 z" Z3 Y1 u5 B近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    ) c% U. P/ @+ b' i2 H: o1 W
    0 t0 r  Z% W* P$ Y+ }( u. z
    5 E8 s9 g  U+ q$ Y  Y
      R" ~# i7 T$ u2 n6 t

    2 f( r- n7 Z* T3 J) U
    & G+ j! x- |' c! R+ T9 _+ M9 O
      G- R: H- M: ?1 e/ b; i

      G, C8 p( T# B; v" a3 U
    ' u+ W' @1 }+ T( |
    2. 箱线图分析- ^2 U7 X( I% t; Z3 T) {$ S1 b
    import tushare* a( z# ?& z# }1 m( c) _0 M" m
    from matplotlib import pyplot as plt
    2 z! b, m- x, d4 M2 Z& Q
    ' [. W. ^+ s; j/ R6 @9 gdf = tushare.get_hist_data("600680")
    2 m* r$ ?3 F$ J0 K8 Ov = df[-90: ].volume6 J) C& ]7 _2 S$ {$ w
    v.plot("kde")' X9 K- q' T0 y; `" U4 H  {7 x
    plt.show()! m4 i/ j5 s) z; e2 }
    1
    + Q2 \1 e$ J0 c6 d# o2
    : N0 i3 S5 T6 n# w2 M2 e! M& d3% c8 c& E" d9 |- P  @; B9 F% o0 ^
    4) A4 f: j, M1 ~/ Z" s+ P+ P% s
    5
    5 m4 s) j" l& U; m, W% v- u6
    / D& g0 s) T6 f7
    . U* z5 M) d& s! H% ]  F
    4 p. W1 o* K' l4 b& }. F
    ' H8 S: L+ [* v- I( M, z1 D3 W
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!# D+ v0 [: Z$ ?- ^% }

    0 }% u' c* V, \+ D" X
    , P( e1 R$ `0 d1 ~! |4 G
    3. 基于距离/密度& i. |+ ]' a* }# w+ w, r; A
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。$ r' N& j+ \0 T; Q, k2 p( w

    - M7 m9 g" z, k: s

    2 }/ \& {( h3 G! Y, ~( @0 Z用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。( I+ I& d8 v$ @+ j0 T
    ! y* X/ E& T/ v
    # a. }( k8 u8 p, C) h% o8 D

    0 K) B( ?! L) e" C# G" g. k

    % R& p" U- k" j/ n0 v- s9 i+ M' k/ i' l; T/ ]
    + `; C9 y/ w/ X7 Z5 i( Y* l
    & S& h( e% {/ V

    , ^- n  D9 g4 `& l0 U5 X- h4. 基于划分思想
    ) O% `9 [/ T% t8 F典型的算法是 “孤立森林,Isolation Forest”,其思想是:* d" k% U5 p1 @1 V6 Z8 O; z. ~; W8 u
    6 W  t* V# F) y0 w
    * x3 d+ E( G7 T8 Z$ c# Y& C
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    * X+ _* d( X/ |$ k1 \8 F" e3 N# D* t6 Q" q- }6 \% [% [; [. A

    3 G% k8 T/ a# @这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    # a2 v( h/ i  \7 Y0 Y; B/ M$ }4 j) }6 I$ `# Y; N$ L
    + G3 {$ V  j; V$ U8 e0 O$ \7 ~
    import numpy as np
    $ D  T( Y, D+ y7 R- ]( d, uimport matplotlib.pyplot as plt* u* ^0 g0 _, {: m  x/ g# ?2 _# p& f
    from sklearn.ensemble import IsolationForest$ l2 V0 T2 u$ D2 M, g

    2 e' |0 s5 d2 n; h' G& m

    6 d: B/ O4 i* Rrng = np.random.RandomState(42)( p) t( n- B8 h) m
    : }6 r  m3 p5 S' s. C" x6 f

    : N3 ^7 A3 A9 n) u0 D( N7 L# Generate train data
    1 a( Y  |) a) f% _% xX = 0.3 * rng.randn(100, 2)
      E- ~4 L5 F/ [X_train = np.r_[X + 1, X - 3, X - 5, X + 6]& `8 H8 \" B5 y8 J
    # Generate some regular novel observations( W( s" `2 `0 n2 [( J9 K0 ]
    X = 0.3 * rng.randn(20, 2)
    9 L6 e+ f$ [& W/ ?X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    - i3 L9 ~: s" K% p# Generate some abnormal novel observations, E" k8 ?4 b  k. x8 Q0 w
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    8 B7 w. ^+ e2 j4 l
    1 H% i$ F9 f5 r  x0 k( r: N

    ! V- o* }8 ?/ i5 i: m# fit the model) m9 S1 d6 d4 {+ X0 V* b$ z$ }; \
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    * Z6 L: T( Q6 C9 _  m; Uclf.fit(X_train)3 C( z+ O  g  _0 z4 y
    y_pred_train = clf.predict(X_train)* }9 H7 C; W' }0 L
    y_pred_test = clf.predict(X_test)- c' F- R1 I0 h
    y_pred_outliers = clf.predict(X_outliers)6 m, s! D# |; s

    1 U' q# \  V. Q  c* N$ Q7 H

    $ l, y- E) `8 {: Y# plot the line, the samples, and the nearest vectors to the plane
    ( H6 Y; b' ?* s. G8 C, qxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    5 G( H. S# |/ N) S( a5 ^& d' HZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    ) {* ~5 l" r0 {+ o& Q" v) LZ = Z.reshape(xx.shape)
    8 n* J: c: @, R2 Q) ]/ `: S& t
    # h- W; a! c6 }" k8 ~
    plt.title("IsolationForest")2 |9 K; Q' x( x' c/ ~* |3 r
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ! j- y  s- X0 Y0 ?% p) `( Q! V; U! }$ F) R- c' O3 S/ q/ u

    5 E6 t& G5 R5 ~4 f* \$ I  Fb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')+ D0 }1 {& T5 h) S8 b+ |9 M
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green'). H0 E1 j- D. X7 }% r7 {% v
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    % @6 s1 m0 Y; E# [# p& f6 zplt.axis('tight')
    * Z3 n4 ?* e! S% @+ H  kplt.xlim((-8, 8))
    - N  n4 @* z$ {7 \0 a0 F: b- Cplt.ylim((-8, 8))/ K* J3 v1 w8 C; W$ `% q
    plt.legend([b1, b2, c],
    * p1 z" j( d0 C- R           ["training observations",
    / H! X2 z/ v4 [( ?            "new regular observations", "new abnormal observations"],& \2 X+ t: k$ J1 n3 A( O3 i) |
               loc="upper left")+ A+ `& G0 T* u8 R9 |
    plt.show()
    , g8 x0 \3 _2 M" A1 B7 H3 N& l1
    ! ^1 S6 F0 z1 m/ q1 g0 \21 P: C" S9 D8 ~, Z3 b% |% Z: s
    31 }+ A- N0 Y1 e+ ?- }; Y9 a) ?7 D" S1 M
    40 K4 r( f" m4 [% Q
    5
    ' W5 B4 d( U% h4 l; S63 i! H' T9 `+ P" E" q: a
    7
    ' [) i9 l, `( A# M/ o0 E3 |4 `! {8
    . h& ]* A' @, V! @& ~* M9
    ! N0 J- M9 H1 M' x% n10* v& `' e( `6 H. I; Z8 J( ~
    11& g# M7 X# A+ I: t" C
    12$ k$ f8 s% Z. b6 g
    13; j$ s9 g) G7 `+ }
    147 ^$ O! e  _& A; q
    15" u- n' I* z7 O3 O1 ^5 o. E5 ?
    16+ w2 r: J9 e9 |6 E8 V
    17
    / A# C9 K- F( h. \; c+ G7 S' ~  N18
    9 m# Q. j1 F* \6 C3 Q19" D  R) N/ T3 S  L) ?4 \4 l
    20
    ' Y- D. o# z: H& ]2 Y217 g7 S  |% ?- }
    22; h8 @4 p0 f# V" r& k7 \
    23
    3 h% l# b+ \3 p4 e24
    2 a4 b# a0 t3 F$ r, b250 T/ q( j0 ]  H* P8 b
    26! e. N' n! i1 w& W1 P1 @* v4 E4 R5 @
    27
      _+ C3 C" ^. B8 |. ?( J# m# H28
    ( A9 e5 g: v  `* m9 m7 e6 z29$ e: e" A" x1 ~; O
    30
    & l8 I2 {# r# u- w5 H4 u31: [7 A  Z# t! m" Y
    32
    / L$ R$ w% @5 Z/ H9 S8 q. u33
      w6 C7 X% s5 S34  u4 x7 l$ @& |# N1 k3 Y
    35
    ) D2 j- U/ d0 A$ T& G# A36/ q9 `; u, h: U
    37" e! m; c  @4 d( d6 X
    386 d5 ^, D# r! b5 }4 C
    39
    7 o: E8 d$ l4 ?4 O40
    1 e  g! s8 F! D9 z41
    : B. {* R* w- z; U
    & P9 Q' f9 H* Y/ N. N, i8 s

    9 k* g  l$ j% c/ P————————————————
    6 ~+ p3 a4 C3 t+ A& I% m版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 D5 F8 o% _* M% K原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    . g5 m4 k8 y/ d7 ^" f) K& r- H0 H( i( P
    % s; a/ R! @4 G6 ?" `) [
    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-5 17:47 , Processed in 0.390901 second(s), 51 queries .

    回顶部