QQ登录

只需要一步,快速开始

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

    ) G, ?( ]" Z1 d数学建模:异常检测算法
    $ \5 Z7 P8 r3 X: f, A8 ~3 _一、简介 – 关于异常检测" k: {) T& G, B& i
    异常检测(outlier detection)在以下场景:1 S! @9 r2 \* p; R/ X
    / N. ]7 M2 H! m/ Q
    . Z- M' p. M1 |) Y+ n
    数据预处理* U! l: {1 G# N8 j* o
    病毒木马检测$ Y1 b# O( C, o- X+ r1 M3 y. `
    工业制造产品检测
    * z( w0 _2 z5 u  ]网络流量检测
    / B; _: c; _0 a, W等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:6 r5 N/ E3 w! h  i* }. Z) X$ f
    5 ?  K; [' y. ^: j( R0 L: q/ K

    + x$ V  q& w  d6 i5 n6 U" L, g0 a监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。: J( j! q, d5 F

    ; O4 t: Q- j# T- z9 I% H3 K

    * c4 a9 O0 y0 m1 t/ ]. e* S以下是异常检测和监督学习相关算法的适用范围:; H, j7 l3 R/ t! ]# N& V. T' }$ ]; p
    - l2 @, c1 i: U+ d+ E
    / g- A& P: g7 ]. W
    异常检测
    7 n+ ]( X8 Q, `信用卡诈骗
    1 A. i5 q, V7 r2 h& L2 \制造业产品异常检
    , A: u% L% f- p- ]; N9 a数据中心机器异常检; {6 R/ l: Y5 C+ d9 s
    入侵检测% j- R0 A4 K" x* J. @' H
    监督学习7 M  ^: J$ T3 {, I/ g! Y9 a6 k
    垃圾邮件识别
    6 R1 w8 y3 T# E4 N& G新闻分类6 p# T4 \" g4 A7 z
    二、异常检测算法
      O4 a5 _. t% {1 d; w( T6 r/ n( N
    , k' @- K+ r( j" {, |( m

    % n. z0 o! P" o4 i, |7 E! n# y/ l9 q% A2 F3 N6 ~
    5 ^( f7 C8 [. ^# O( B% j4 U6 B
    * ?5 S# ~/ O: {1 m9 M) z
    ( ]; h/ y4 b, N2 w/ Q/ O- J. c$ @
    import tushare3 K3 E+ {/ x9 F+ K7 k4 F* x* n
    from matplotlib import pyplot as plt: }1 M$ v* K" s( u3 Y% b$ O
    8 Z  t3 Q! e9 d& S$ R  P
    df = tushare.get_hist_data("600680")* r; ]5 n( ?1 j5 K* p
    v = df[-90: ].volume" k( Q. Q% D. Q1 P% u
    v.plot("kde")7 e, z& T* I* P# V% n& ^# O6 E$ f
    plt.show()$ e. ^2 _5 v$ B; S0 q3 u
    1
    - |( ?7 X! V3 j! R! R. C4 i% o2# I  J5 Z# ~5 w, t: V" M$ b
    3
    $ t) ~! p2 X: _3 s' t; A44 }. F% r; Q) Q
    5% g8 H& ]3 r  j
    6
    3 l" R  V  P1 W" B7 D7 Q  t7
    * N* `1 c4 q. E6 v5 Q8 d8 C近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    , G2 w$ n  r5 u- ]9 J. x" R4 h5 O: W' ?
    1 {+ g  ?& ?. L8 |# k! D5 k5 Y% w

    ) l9 T2 i5 ]! |* F4 H# Z
    . c9 \9 b+ H* p, V! B( \

    . e0 ^! B/ \. y# [! _! R# M

    " ^$ f& z) W2 O5 q
    $ I% C( c& i. t' s
    , N" R2 e3 S8 h6 ~) E( v0 d
    2. 箱线图分析7 R+ Y" G4 t7 v! U! s1 Y) P
    import tushare
    ) n# B1 N  G9 R6 @2 @0 G8 {from matplotlib import pyplot as plt
    6 M! i9 n( x$ i  L7 c$ u0 Y8 H
    6 M4 G) g# u+ r. K9 j6 {: sdf = tushare.get_hist_data("600680")5 o. O* }! G. w  u
    v = df[-90: ].volume
    ! K2 V! y0 D# Y0 j8 n7 cv.plot("kde")3 s+ x; x1 D/ l' A" H9 b
    plt.show()
    + l. t" |1 Y$ [3 I6 |  j: m9 s1 ]1, [; @7 R  E! a9 m9 }/ l. M1 H
    2
    . ?5 a( `8 x; F+ d3
    . i- m, K/ ?! H- C% t' o1 z0 T4
    ' X/ r: g( y% ~$ Y8 j; ^: d5
    0 r. |3 m2 E( x5 O! Q, n6
    1 M3 A. g1 k3 t& ^  |77 b7 G% H* e: R3 s8 }( b7 i$ \: k& ~
    5 q0 ~) ~* T1 K
    9 l# \: @' j" J) ?( ?5 S
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!( o: E; w- d7 h8 v  k7 z! N9 ?  h3 d

      ]0 m9 Q+ I( Q( ~. l8 Q
    % S0 }) }9 o& s" ?
    3. 基于距离/密度4 H2 b3 c7 J7 a$ l) \
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。, [& h9 x: [4 W

    0 [" {# F! ?/ N$ ~  w' w

    6 H% S( b% c6 E  @+ u* }- [用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。; U4 N  h4 P' h/ y  J2 r) ^$ Y) g
    $ U" p' n( W  Q3 Y: Z* n

    % ^3 v# R- v1 Q0 O0 i6 r# g$ _3 b% z) f; J/ }1 a" r5 w+ r+ N. E' O% n

    9 V) p# ~" ^- ^7 O
    & W. E% X- t" O; A
    0 q: o4 m9 i& V5 ]

    . [5 @1 b6 i- t

      S7 R& @3 Q' S' ?+ E+ T4. 基于划分思想2 D' R- s  e5 i! r
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:' C4 V4 j! Z; ]3 }! K6 J$ F; M9 Y

    * K5 w3 X' T" Z8 p6 E

    , n/ w2 l; L3 W3 U" y3 L假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    9 J1 E; I+ q9 [! O
    , Q0 D. w8 t% N" Q7 [
    ( {  T# v) N: n
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:  z% c* r1 \* {
    ! t* N" a" R6 f5 g

    7 n: `9 B1 {& ^import numpy as np) _+ E+ U. B9 V. T
    import matplotlib.pyplot as plt
    % y1 F% g9 Y3 hfrom sklearn.ensemble import IsolationForest
    7 n3 Z/ Q* Q& @
    7 n- L* ]6 V. B; [! Q& W$ ~

    % I& X8 W$ I' n$ _! Zrng = np.random.RandomState(42)
    * [1 j  i" @1 a* V" I& @& f( X. {2 k* ~& r1 w- L+ g7 D, T: N
    . y0 t1 Z% d. X# x, _* A
    # Generate train data
    4 X9 s; H! Y3 N( O1 tX = 0.3 * rng.randn(100, 2)4 _3 a# x/ f* [& g' B, g3 _) i( O
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    % Y/ o: S4 @  P* a- T# Generate some regular novel observations1 e7 f$ s4 \' Z0 R3 q( J3 r4 A
    X = 0.3 * rng.randn(20, 2)
      j9 f8 Z; c1 v7 ^5 ^% G; oX_test = np.r_[X + 1, X - 3, X - 5, X + 6]9 Q2 Y- Q5 @2 O& ^4 }0 I; V
    # Generate some abnormal novel observations
      p/ {* K( b3 E* T- r  W  tX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    0 y9 t$ @0 R: y4 H) T, I$ a
    2 Q( l, `# K& E* v( x2 B2 s
    ! H: y2 a* Q6 N% w  s2 a
    # fit the model0 Y9 z; a5 m4 t$ r6 B- ^. z* Z9 G
    clf = IsolationForest(max_samples=100*2, random_state=rng)! D( G% `: Y, E$ j% t
    clf.fit(X_train)* _" w; g3 J1 x5 ~! @, p
    y_pred_train = clf.predict(X_train)
    & [, ~, N9 j# I1 D& z& {0 N: A8 ~y_pred_test = clf.predict(X_test)
    # L( z/ v9 Z& d- Y4 Zy_pred_outliers = clf.predict(X_outliers)
    7 K' `& W3 x) b+ a0 j: T: I8 z9 R  G% [- O- y
    / z7 W" R9 V, R/ @' H- C
    # plot the line, the samples, and the nearest vectors to the plane& q% v# {+ D# r( @
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    ( g5 t/ Z% B+ P  g7 \! P6 H, I- qZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    ; A5 F/ f0 B) ]( E6 R5 dZ = Z.reshape(xx.shape)  k( d. C+ b+ \3 Y  r) Q, G
    1 ?0 k; P. h& V1 w6 n( B
    4 T) X4 S9 |1 s7 y1 W% f2 W
    plt.title("IsolationForest"); w) y, z/ p9 |4 N3 C+ ^
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    1 i! Y2 ]1 X7 `/ J9 j% c% n* z9 @1 e" U+ ?: T

    ; r4 I% _" V+ sb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')5 F% [, S& m9 f8 t" O$ [
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')" B) I* p0 o% i1 G' J7 D
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
      p% M; m5 A6 r( X) r/ g4 S. `plt.axis('tight')- J! g2 o1 R' f6 x3 \4 J
    plt.xlim((-8, 8))
    ' `" R5 i. w4 f7 N& q% [& C5 Xplt.ylim((-8, 8))
    ( }3 F( }% Y5 J% Uplt.legend([b1, b2, c],
    : v$ a" S) f: R           ["training observations",% T& b: q3 `' M
                "new regular observations", "new abnormal observations"],
    % h( \* _5 k) x3 j           loc="upper left")
    8 O1 i8 c) a: D( t1 Zplt.show()7 z0 D2 |! P; f: a
    1* W" v! \0 ^+ K
    2
    8 ~$ ]$ |4 f9 j5 s4 A! }3, \3 A$ O6 ]  l2 t7 e
    4; x% P: U; ^4 U3 g/ j* F: j  c4 D
    5
    # S  v1 j9 u3 J' |' _9 r6
    % J& l" ?8 ?8 c$ D0 U7$ L3 [' T1 d7 m
    8% s) \& q  H  b" p/ u+ u
    9" h6 q  \, R& x- N2 j
    10
    ) y7 E+ k) l" v/ O# I( H1 s9 K118 O; K1 l( g* g* {* |
    12
    & \4 l: L5 Y8 T' S/ g13
    ; `$ P4 z2 H, Q$ k1 }14) j$ F1 k0 A6 d
    158 a" N8 @* x/ {$ a
    16" k8 [+ s6 _2 {0 d) U5 X- y1 d
    17
    # M) W8 ^& g! H% K18# ^  ]% l0 v; w" |
    19
    $ _  G7 L; y0 W3 W3 n# Z20
    ) L( g5 i- z& e# j) w/ b21
    0 F+ j# [; }' B2 c22
    # E4 m  J4 ?3 Z1 _( K23
    0 b/ e+ N2 [7 i24
    5 I4 [7 ?) x, x, e) Z25
    - S% Y5 `: u$ t: J4 M266 f8 V$ R% m2 Z0 Q  E/ w
    27
    / ?, z% k& r2 G( v1 ?. {28
    ) S! x$ F- V! N290 A$ }: t3 }2 c1 ]
    30
    3 q5 d3 B5 }5 w2 d) \1 R31
    $ n. b. M' a9 A32
    2 W. K' K0 g+ ]* _+ q5 x( p5 `: |* M338 @6 m6 A: q- m# f$ }: m0 t# L2 a
    34
    , [( I2 j" u) D35
    ) {! y: C0 V0 m% r36
    . Y$ h7 ?5 t& g/ c) A37
    " u, o& `# W/ l  p1 A1 v38
    & B( R- l" v/ K1 X4 O7 {% U( A39
    5 _1 j1 u# ^# l3 M40
    3 e, f% v( j4 l8 ?" f41) S1 R/ ^. s: ~# s6 h# f4 t

    3 i( C! M9 F: ~: ~& A
    6 V( ~# D: ]. D0 M  g
    ————————————————
      x5 U6 D) ?. P& E版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 P, q5 U  h) M! p
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    & K# R8 f4 \  {: |
    : @$ d+ O& G& P* Y& C  x! C+ \
    % b) [" z+ R  N/ T- ?
    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-7-28 22:26 , Processed in 0.657865 second(s), 50 queries .

    回顶部