QQ登录

只需要一步,快速开始

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

    % Q3 P! J6 ^) }( q" P. |数学建模:异常检测算法0 Z0 }  D7 M9 ]
    一、简介 – 关于异常检测; ?- C( b  ^& E7 g! @+ }/ M
    异常检测(outlier detection)在以下场景:
    3 @$ y3 K1 E+ J$ i2 A! F) X' I" u/ l: a2 E! r3 E( G; w) m7 [, W

    . s/ |+ @/ c3 J数据预处理
    2 L' N7 Q2 u( u) I" b) v$ k! y7 `病毒木马检测
    4 \% L7 D  S9 n. A* y* u7 D# e工业制造产品检测
    0 ?1 @2 Q' z$ {) y) a( @9 B+ X网络流量检测
    " g- N4 u( g+ t$ V+ D等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:' o- e, j0 u) C3 P5 t0 w, G1 J

    6 \% Y: Y1 {. p% }- v

      s6 L, b2 c  @; t监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。. r& O2 K- ?) ?
    & r; Y) m! Q3 h; h, d
    : S& ?0 a9 k+ t: }
    以下是异常检测和监督学习相关算法的适用范围:# M- `6 X1 t1 g9 T3 w: \

    0 h  j" N8 r5 K: d

    4 |9 O1 |$ T, x6 T* a. J2 X2 Z异常检测0 F. e- c7 C0 I0 p/ r
    信用卡诈骗
    $ @9 S# [) D, T8 T: q制造业产品异常检
    ! U1 R& b8 Q) {5 v0 m0 d数据中心机器异常检
    3 r. G. l3 K% J& i7 R/ {- w8 A* @& ^入侵检测
    " ]4 b6 F6 v3 l6 c& X# j/ j8 Q" G& O监督学习
    , \: D. m) z: n1 r) @! `1 Q垃圾邮件识别
    ( U" B' D( x9 _2 q4 D新闻分类
    # e+ m5 o: @- a9 C3 m; x! f二、异常检测算法
    # T5 L/ E- @! U
    2 E/ m; v0 W" R
    1 J) g7 k( p& _0 s  T; ~0 C
    / t& k3 o% L/ o: e

    8 \$ k/ ^9 m# S& @2 M2 K5 r. J1 [3 ?/ K
    ; j- }' e9 V! c& \
    import tushare
    6 C# c/ m' m; z- k6 gfrom matplotlib import pyplot as plt
    ) j) [6 I# W, V6 U3 C 5 q5 o& g) Y; B- f- r
    df = tushare.get_hist_data("600680")
    , ~' P7 h8 T  j4 ?6 _0 tv = df[-90: ].volume
    # G& ~9 C; K- E/ N* y4 zv.plot("kde")
    ! E6 X/ K$ g* g! k# \" x( s& Y7 ?plt.show()
    0 N; ]- k' s2 d. U- r. c1
    # _8 E; }8 _$ n) R4 |2
    ; ?. s9 f) @# r" z3; z! w9 q; R) b* {7 z, _8 l
    49 Z1 y( ~  E) j8 H* B% i% _2 Q
    5
    3 g4 i# R0 D3 V' |1 A, l6 j6
    + X: p2 N3 h% p& f. b  `4 {77 b3 G; ?$ J0 S' ?0 g! S. n
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    6 B+ f# F" Z$ N% f: {" k+ `
    + c7 U" d4 n3 ?& g8 P/ \" Q2 n

    ) z6 J+ x5 K: J' i
    ) L7 H$ u# a/ l7 B7 R! C

    1 i8 G5 d6 H7 y7 Q: f/ `; i
    # H5 z" d0 L3 Z+ {

    # g! N& J; x4 m: q. p) u; B
    - q9 h, L3 ]0 a+ p6 B
    ' V% M% ?+ {% N5 b: z; g
    2. 箱线图分析' w3 n, T" ~9 }4 i9 l" `
    import tushare4 D0 x- o" X6 s: t9 z3 s6 z( r) M
    from matplotlib import pyplot as plt  I# w( V) L# V8 U
    . }9 B& v/ y! ~
    df = tushare.get_hist_data("600680")! P; H5 |. F- d
    v = df[-90: ].volume9 s9 _6 T1 k. j6 g, |! B
    v.plot("kde"); O% C$ Y. j6 k/ k" i2 e+ i  [, d
    plt.show()1 Y' `" J+ X; }% ?. T9 J
    1- O$ ~2 c: v: z  x0 i7 d- z
    2
    # }9 h2 P* b  W( B3# E2 H6 [* c, U
    40 B& G" w5 b6 W8 y0 \$ N
    5
    ; A4 ^1 a6 S. \! @$ l& g  M1 Y# E6, K6 o& r7 e) x' u) g5 T" K
    7
    ) z8 i3 [2 S  @4 A" M
    2 i) N5 ]+ H+ b
    ) a- {* ?; S3 W* k& C' G1 t1 j
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!# |2 M3 d! K! n. k
    - x- _* {+ l( I5 `

    ) r# h* P3 p( {3. 基于距离/密度4 w& ^9 X- e, W. Z+ ?
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    ( G6 b5 A: V1 M3 A: [* r. M# l& T
    * b3 O% Q2 i  P) U& v( @8 ]1 V' j7 x
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。& c+ F6 J* e/ ]/ w, P; e
    * U! z4 u1 \! Q) t. \

    2 o' b' e! s9 T/ z0 e7 ^+ Y
    1 x9 n* L) v9 c. w8 A1 A
      Q9 s& [1 \6 N) \6 ?& u& B  L
    ; v- @4 ?: Q3 }3 w! ?/ g
    : }5 m! Q! y, Y  H/ |# ^& C
    ( n$ y; e! |: @7 S

    , {4 s$ t( w9 @; G4. 基于划分思想
    " C/ N, Y6 ?2 E$ b4 P, n( E9 @典型的算法是 “孤立森林,Isolation Forest”,其思想是:/ L  M( y  X" X

    4 j7 |7 k: t& D+ N

    $ I( j. r0 a$ ?* u% G  ~8 V' ~! ]假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    ! _0 A1 C8 E  S/ c1 p: U! @" G7 }
    , |2 i9 P: R" P3 }2 |1 h
    7 U8 c: u) X* }( O& p2 x
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:& f+ v$ \* ~! x/ l: O" }
    % A3 @- L/ ~! n

    + H" v( C( d3 d- d3 @& o) w2 G6 @) zimport numpy as np+ G2 L; P$ {8 S$ ^$ w' P
    import matplotlib.pyplot as plt1 G, V0 }1 N2 f( H# _
    from sklearn.ensemble import IsolationForest3 w: K  U6 F! K* g
    8 S4 |$ E+ g7 C& C0 N+ ^6 C

    / k+ x$ I+ N/ W/ l- t% R" brng = np.random.RandomState(42)
    1 [3 W- I9 R* X* v  `  G# g; x
    : F9 l9 F. `* F9 K# j9 @
    : m( Q) p' p- R0 a; E
    # Generate train data
    ' Z! U; H! _7 A$ [1 H' S; gX = 0.3 * rng.randn(100, 2)
    4 l( ~+ K: B* L) D. V9 Q# [3 wX_train = np.r_[X + 1, X - 3, X - 5, X + 6]9 f# f* {; E7 t8 S! ]: W. i$ T
    # Generate some regular novel observations
      h& d; `. c* C" c% }' ~" V) FX = 0.3 * rng.randn(20, 2)
    6 I  J9 e( C$ T4 T: IX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    & l2 q1 A  i" ]7 j( E# Generate some abnormal novel observations
    , u9 b+ _8 @) p# _2 l" bX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))8 `+ q! U* s. H; b  D
    $ ]( A8 x5 O" w
    ; v9 T+ g7 I, Z. o( w& R% i# {* |, U# V
    # fit the model4 G3 |7 h& G5 E& I
    clf = IsolationForest(max_samples=100*2, random_state=rng)1 c. z  O+ e: \
    clf.fit(X_train)
    / \* g( M' T2 C6 \7 y* `y_pred_train = clf.predict(X_train)
    : c2 p! i0 N' v# @y_pred_test = clf.predict(X_test)2 S" ?  M/ J3 N" O* a# b! o0 W% r
    y_pred_outliers = clf.predict(X_outliers)$ r8 X; ^. F8 l" g
    ) l) W0 |1 l) N4 X0 C

    * r5 K! g+ J6 \# plot the line, the samples, and the nearest vectors to the plane
    % @, `  s6 u, `6 W+ L1 `9 exx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))" O2 x6 Q1 H- Q9 H! {/ z8 g2 ^4 x7 T0 V
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])+ @6 G. {8 b8 E: x) v6 z
    Z = Z.reshape(xx.shape)
    & z6 e8 u; y' A/ F( k# ?5 ?
    * f$ H. Z% D9 k, w0 v+ R& G* U' D

    5 D- P+ r( ], A; j$ ]' e" fplt.title("IsolationForest")4 g9 I0 ^! Z! r
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    - j$ u' P6 ~' R" t$ g
    / P- I$ z- p  u1 a* g2 c
    1 Y- l. [% M( S& X8 q
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    6 l8 J6 _  W/ B+ A7 L, nb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    % R, c) C9 {, [: e1 }  a, d. d2 nc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    , ?! Z* A$ H) K4 h7 mplt.axis('tight')
    5 z# @9 _# Z; a) W8 `  o+ M2 zplt.xlim((-8, 8))% D( F& A! |* ^# p/ B
    plt.ylim((-8, 8))' G: Y' ]( I! c
    plt.legend([b1, b2, c],
    0 b; ]) F/ ]& ^9 c, K           ["training observations",
    % ~$ @0 f3 [7 T5 ?# @* r% V; z            "new regular observations", "new abnormal observations"],
    3 a) T( K& i( n           loc="upper left")
    ) W( L& C4 Y5 x0 m, M$ Z+ dplt.show()( N! H+ P& N' ^7 J- r6 [$ b$ d
    16 v! M( c  @) T( o
    29 y3 u2 ~3 K" Y+ _1 d+ L/ g
    34 P" f9 ?/ z  l8 `  E, J
    45 L$ v: z$ Q) ^# t( P+ j* j
    5! {# u2 e5 ?: `7 C, ~1 m
    69 M/ V6 K$ \* ^* [+ S( J
    7
    ) _8 P+ |+ B& I* a4 A88 T' ]$ E: Z3 U2 q
    91 O7 G4 b+ y1 s
    10
    ' F! I# z0 k) x- ]! `1 l, a112 d- N  j4 ?5 E7 \( \
    12
    - {) Y' Q% @0 n! U' i8 W13
    + [" q" M& \9 [! j14
    # Q- S8 F; w& T# J4 C15: |( i4 u9 x3 y
    16- v- ^4 r# j  K8 H
    17
    2 R6 ?* p8 I: p5 Y: r1 |+ \18; ~% M( e; R" s9 w6 ~. k& ]  |
    19
    ' y0 ?; ^9 D% p8 D; U& G20- f& q4 g" w4 t4 d
    21
    " h# n- Q( d# L/ o8 s6 r22( e9 R* A) C5 n
    23/ m# q% T3 I: {6 ^1 K
    24
    , `$ p! m; ?, r" G/ K1 o2 V25
    " q0 N2 c; D( k) D1 ~26
    . c: g% u- T# B# K8 q. Z27
    . N5 z- @% z0 ]5 C, d, i$ M28) y& E4 ?5 d  @+ P) S7 S! t. p
    29
    . f/ h* T6 c4 \30
    0 D9 }: K" X) F; G5 f' R2 f! k9 M31
    " p: m5 \  q3 n3 J! m9 E3 C9 t32
    : J$ Y& l. V+ s7 o) Q33/ o! s4 {, ?9 w* M5 v" ^
    34! @1 ]: `1 n  U
    35
    ' o! w7 V( R( K2 \7 W8 }368 ]1 g, ~7 @! R3 Q
    37
    9 Q, S$ ~; [; N0 @! d$ c" C38
    $ W- q6 p" }9 ]2 U% J1 Z  C3 n39
    1 _4 s4 |- g# Y' r+ S! }5 G40
    - {) b, w  a: @, u9 A+ Z41
    . e! u2 ]7 a$ L& Z) M1 W4 ~
    5 p" U; O* A! L, t

    & T/ O- P( a% G+ [  t# U————————————————
    / c; u- L' J8 B- n+ y8 U版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 B2 K  X3 ^+ q5 x# a
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    , j% ?' @) l* d: i4 ~7 H& L
    4 X/ D( ^, K/ z$ c% @/ }/ K. ^
    % P3 n4 a% O7 u1 l
    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-6-16 17:16 , Processed in 0.432098 second(s), 51 queries .

    回顶部