QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3924|回复: 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
    % i0 l/ o" k2 I
    数学建模:异常检测算法. t! l6 l8 _) ^. B2 S
    一、简介 – 关于异常检测
    5 K0 ^, T3 T7 z  j! U. U异常检测(outlier detection)在以下场景:
    1 t! X$ D2 W8 h
    1 v' ^2 d/ i3 `2 f4 M$ {3 e
    1 a5 Z) j  O5 z3 h, p/ Y: F" ~/ x
    数据预处理
    ! v& v% u6 H' p' E病毒木马检测6 R4 J6 B" U- \0 t, ^$ ?
    工业制造产品检测  }9 B# X* ~) J8 t! \8 X
    网络流量检测
    2 m( N9 |) j( C3 N' D等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:8 M" x8 Q2 J3 U3 `* m5 K1 N
    . v' ?& E6 {0 t+ i/ k4 i! T9 a
    , `) l7 N5 T) O! V8 `5 T$ W
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。8 t% c4 a0 ^8 X* n  k  \. c6 L
    6 E; V5 O  v4 ]

    * ?0 y, g: ~- G1 ~以下是异常检测和监督学习相关算法的适用范围:
    ) q9 O4 N5 \4 y& y& e: Y) N: h8 k# S) u- H% X
    0 b, l. f$ p" ^! P7 w
    异常检测+ E) j  Z; n  X1 z- S
    信用卡诈骗  M! I8 t/ s* `) h: o! L2 D
    制造业产品异常检
    # h# d- V5 o- P数据中心机器异常检+ B& B% X  ~# v: h9 ?1 x) }& }
    入侵检测1 A; M5 k) C' s3 l$ w
    监督学习. h9 ^7 s. F5 A
    垃圾邮件识别4 K8 @- s2 X; {
    新闻分类( @/ T/ m. P( A$ m
    二、异常检测算法
    # L  q( J( F! K( m. v' s; A$ P) e7 S2 T. i, ~6 Z" f, p' e0 ]+ M

    3 ]2 j. x0 V2 \& U1 w3 H% k# N8 C4 V1 O

    % t  F, k/ L! F, i" _% A/ F, r% P+ P6 z! o

    / V" K" W) m  uimport tushare
    2 U7 a/ y/ u& }, I' M, dfrom matplotlib import pyplot as plt- p6 k4 ?; L1 a2 ^  ~* k
      r; k7 J! ~) z  b
    df = tushare.get_hist_data("600680")
    1 M( Z% T0 X0 F, w8 Av = df[-90: ].volume
    : [# y( [7 {; k/ ~v.plot("kde")
    ! ^. s7 r5 d7 lplt.show()2 }. C4 S8 n: ^9 M9 {( T9 B1 h
    1
    + d' ~& i$ D% _- c' j+ I4 g2
    * O0 l- g* t% t" G3 g' o3
    # V0 Z5 q2 q! r4
    9 ~+ Z5 i6 e. ]- ^4 ]5
    . t. s( G& W$ `$ |& v9 D) l64 `$ U$ Q# R7 }6 Q
    7
    1 b+ g. l. \6 V1 e0 c3 n近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)3 r1 t/ X* ~& R" i, h7 ?% l/ f
    " v1 R0 V1 q0 \) Y! t

    $ M. O1 ~& [, I) _
    + p0 {  Y7 A+ U  H$ `5 U

    , h7 d( s% J4 {% s
    7 U  G  U9 y. U: e3 M' G; P  }1 [

    8 m% F& G4 Q2 }- x8 R% e5 V7 a5 V6 U* i( Z6 s  i+ ]
    1 S0 E# Z8 s( `! t. S
    2. 箱线图分析! @1 P6 x$ V" h
    import tushare
    0 X: g7 l( l. I7 |from matplotlib import pyplot as plt# x3 X+ V: B) y% B' t# v

    " U  w  [9 A* H+ y! h6 ^! udf = tushare.get_hist_data("600680")( |+ Y7 D' |" L" c
    v = df[-90: ].volume
    7 |; o6 j; M' k8 Z- b/ Pv.plot("kde")" l- \! S6 X, ^
    plt.show(). v$ }! R8 b& \1 A0 M/ a# V, w6 h! Q
    1
    ( g9 g: k; f4 S2
    ( s& Y8 i3 A6 u  ?3; d; z0 C, [2 e- d4 q4 M3 {1 M
    41 l0 @3 h, a: ^/ R& d
    5
    * A$ Q. s2 {4 w5 A6' R( C( m+ L  @8 d+ p
    78 T* T; w" `& j

    4 i, k2 i" S0 [2 n' _

    ) E/ F, |8 @7 z2 g6 V! G大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!* K3 n5 _2 n# ]2 w

    3 A9 X9 T5 \0 k$ V2 n/ i9 K% }% m
    8 H# ]1 J9 K+ r5 i7 T6 S5 H- q
    3. 基于距离/密度
    ) C# o' f' I% D典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    7 l* R( f. Z1 f2 g6 n9 Z% R8 ^0 S$ q

    , A5 f  `. V) X  }% I; z" p# I用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    ( h3 j) k  o( R) V4 M" |
    - k# _0 N4 ~: q3 q" B# @

    1 m& f! a* E" d- R& T. ~! P( R7 x) m  Y( r
    7 B, |/ b! k  ?& w

    : S1 o" _# @2 d! t

    2 ~- c3 L4 ?. v$ @: k( L( H  n# q* M# u# e

    " z" y: x  G2 w. P0 f6 m) j4 ^4. 基于划分思想( P4 o0 w- [  j3 \$ Q
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:. G/ {# m; }9 c- V% K

    ! t: d5 n. o* N- b" l. w- v. Q

    & _) ?2 e5 P& B5 k+ B) C$ g. ^% N假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    % p+ ]1 b7 d% y% U- ?" d. g: w% I8 ?  s0 z

    9 f5 e4 Y3 F/ x这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:+ m5 F" I  D: }  H) Q; X
    ) j" f- y7 Y7 t% E2 u
    2 Q' w5 o3 h7 S; g( }
    import numpy as np
    4 o3 F; D' d. F8 p1 H  `import matplotlib.pyplot as plt% G6 n: l; J$ R0 a
    from sklearn.ensemble import IsolationForest" c7 l& j, J1 g: i5 c, u1 _

    5 F) P# n8 F# d4 D6 ^1 w

    3 m  I( Q! N; z6 `% w5 B+ orng = np.random.RandomState(42)! w& C9 m. z# J# E
    2 a6 D, L- @% T& k- U

    ! t! w* |2 E6 a# u8 m/ u! [7 ~# Generate train data- \2 h% r2 h5 }! I0 W6 R" X- l5 g
    X = 0.3 * rng.randn(100, 2): F# X% D0 J. a9 a! L/ `: O
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    ( v* V! D- W* L! a' x9 Y5 j# Generate some regular novel observations4 Q' s- g' e( F* [5 l* b
    X = 0.3 * rng.randn(20, 2)
    / F: t: R, \7 j7 ?$ IX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    ) Y3 d% G" F3 N- Q" F4 t# Generate some abnormal novel observations
      q; k2 F; y. D! B1 E/ ~X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    % w. g' v1 V" p; l+ G6 ]$ t7 {
    & ?' H/ c) G6 ~7 z* l! t
    ) G9 X* w/ M1 B* i" O
    # fit the model, k7 W1 s; o  E& v" O  o
    clf = IsolationForest(max_samples=100*2, random_state=rng), L& q5 l4 [/ T* @/ e5 s
    clf.fit(X_train). _7 t. p8 n/ b$ T+ ]9 c
    y_pred_train = clf.predict(X_train)
    , B0 Q0 J- ]4 S# e" _8 O# {y_pred_test = clf.predict(X_test)
    5 U1 f5 \+ E# ]3 w9 D% x# f8 q. Zy_pred_outliers = clf.predict(X_outliers)
      L% e/ Y% X& F- B, o
    . w  J2 b, N& c" P, C5 Y# h

    ' C, R+ u/ `7 w9 R* e& c# plot the line, the samples, and the nearest vectors to the plane% t) ?$ a! C; e: o! H; r  F
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))! K' D" ~7 T# N% l7 [) v8 Y0 I
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    5 }% s$ |% O7 k0 A5 d* V/ CZ = Z.reshape(xx.shape)
    ) E0 F* ~- G3 {
    & H1 z+ k& r) K- c$ u
    # Q8 |2 S. K! z3 ?2 n
    plt.title("IsolationForest")
    ! p  i& o1 C2 f  V3 Fplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)) e3 C; B! o. i9 V
    ( I. u+ x: L! g5 g, e

      q+ P4 i% }6 v! ^, g+ [( e- gb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')5 h, m. r; a: Y4 F. n/ G2 N
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')4 `5 ^7 {& g9 c, l7 m) b' Q
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')$ T0 c, v* H) U8 C, S
    plt.axis('tight')
    6 s( \& `, m6 l' y' w1 k& }4 Qplt.xlim((-8, 8))
    3 K! h2 h6 H! i, q' dplt.ylim((-8, 8))- U3 P, r0 y2 D+ t
    plt.legend([b1, b2, c],
    2 m+ {0 D( z4 y- R# V5 a: B           ["training observations",
    0 C% N" _; _6 W* S9 u4 h& ]" l            "new regular observations", "new abnormal observations"]," B1 _* s* y) ^/ K8 V; I
               loc="upper left")' L$ c8 x9 v' S: |0 d" O( n7 M
    plt.show()7 T( i' f: L5 y, _4 E. }1 h3 d/ l
    1
    . Z% j+ y8 O/ o; J29 x. K6 @6 W8 p  d7 S& K
    3
    / b7 Z( `* l4 u7 n! f. g. L44 T" A; n) S: k; G8 v
    5. Z& Y6 f% y8 K5 X
    6) }& N) y% M1 B7 h
    7
    7 T- \$ x, W: H) n; J8$ S+ O8 g3 ~' t6 q- `. F
    9
    + ~% D4 F% C# P10
    6 _# [) A! S  J6 F& a+ l8 V11
    7 u2 i/ D4 E+ R1 B" S12
    & w# ^! x+ N! {. w, ~13% {2 R5 P0 V( k7 y% w" X9 ]# `
    14* d/ _8 D5 {& {$ ~4 ^  ?" t
    151 s9 H7 r8 W% c. ?; z, t! D$ N
    16; d( c" e. G' k# n+ J# y+ j* b& Y# f
    179 M2 I- J( Q) G) d
    18
    . }# z+ H& S9 l7 \" o/ M" f8 _19
    + l7 z- X, \$ F# K0 x1 u3 r209 u6 P  M2 y. y8 J2 X  l& W0 }
    21
    - ]; ^% l6 s1 y/ q' y2 q( i22
    / ?1 \; A2 X6 J# H- F" _% X7 Y4 U. o# [23& N5 U6 k6 z5 c. `) f0 A# H8 e
    24
    . w; e3 K7 F3 P' J5 S' z5 c) G25
    , v. @* b; @  U1 A% t% V: X26
    5 |1 d3 Y( g# v+ V& t/ y27
    9 {6 O' r! R9 z3 C5 {28( o/ U' ~4 u( \3 T4 m7 x$ l
    29+ J, [3 b8 E" S, }
    30% s/ F, M: A2 `# ]- G5 w$ T5 _
    312 C' j4 ~& k9 H# ]; o7 Q; }% K) F
    323 p, u$ ?) b. [# J; j! r$ B
    33" v. M( g* Y$ n. `. U4 P9 s+ ^
    34
    ( s" C1 D+ U6 T358 g" v7 I6 j. j% t# [
    36: m7 _5 u, |% S2 j4 j8 Q. W
    37
    . h: h1 s, d& g9 N! Z38
    7 f# K2 g5 B0 `" f. [6 P2 P39' z# X/ `! U/ U  H4 b3 q: u6 U$ h/ G. W
    40
    ) g4 [. [3 }1 n1 S7 _* _411 f% b6 C& a1 `+ Q& u
    ( G6 _3 e, O3 B
      r, K' ]* ]/ W5 I1 @4 j
    ————————————————
    ( W' Y5 K. F3 d9 `* {" I6 D' Y" r版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 L1 I0 m- w& h& ]5 c: p
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129. q9 @; R' \# M  g# O+ G- Y
    6 }$ G- H$ b5 l& Q- j/ C8 A6 H

    4 b, Q+ B& j4 K3 Q
    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-4-13 18:18 , Processed in 0.447768 second(s), 52 queries .

    回顶部