QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3930|回复: 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
      {& M6 I' ]/ d, y
    数学建模:异常检测算法. K- M9 [) a$ T/ Y
    一、简介 – 关于异常检测/ s5 m* ]8 B9 j  a
    异常检测(outlier detection)在以下场景:
    ! o/ i1 }( U/ J: n6 G- [" _4 `' H# x# f! @5 S- ?2 M

    + q2 n/ K( Y; Z6 c数据预处理
    / u$ E9 I! b2 d病毒木马检测
    0 K) j7 ]. u8 K* Z0 }工业制造产品检测
    . b  i# |$ ^" u/ `2 K# K5 a, ]网络流量检测
    $ M7 _; ~4 u5 ~7 p等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    * T# b; A; X0 q. m9 V1 A8 ^  c! J
    0 w, f( W$ d+ p/ J
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。+ s3 n- u) L+ R5 ~

    , _  }4 Z$ W9 ^% g- z
    & O- p/ r0 [# s; c$ e8 p' R3 F
    以下是异常检测和监督学习相关算法的适用范围:$ Y( f% k$ N, U+ _" v
    - z* o" i! w5 k; m! f  L5 N% j

    & T/ B) m. N; k4 \0 k7 M; c& p异常检测
    " ]- w# G; F/ b/ W' ?+ Z信用卡诈骗/ E0 r3 i0 G6 V+ w- {
    制造业产品异常检
    " _3 d! Y, Y2 F* {* M9 ^数据中心机器异常检
    # h' X+ w+ |& M9 W/ Y入侵检测
    , `4 X: r) c  \* u* O3 c9 q5 H1 ^* V监督学习
    9 e1 a4 E7 W- a( y2 e+ j, N/ u垃圾邮件识别
    & m5 ^% W8 z( C) m新闻分类
    " X# F3 L0 E7 [' F1 {$ j: S; E( j二、异常检测算法
    1 Y. v% u6 |+ v, ~6 o0 A/ G2 H1 ^9 n  B# y
    * j1 t* I# ^- g5 c$ ~7 s0 t) e6 e' W

    ; |5 ?' f/ Z/ U0 k* v- ]. p

    $ f1 }. x) e5 _
    9 u. N: ?% F" o$ w4 ]2 G8 m

    / M) g4 F# U2 h* B+ Gimport tushare* |4 K& }, |5 n9 h
    from matplotlib import pyplot as plt- g; |  I' M! L8 M8 j& j: M
    2 m1 k) E7 v  U9 V+ l
    df = tushare.get_hist_data("600680")* p1 ^0 O" O$ D0 M% ]- J& e
    v = df[-90: ].volume1 H6 @2 k: P) J# r: e* }3 i$ F
    v.plot("kde")
    9 M. p. a- j* X! eplt.show()
    + V1 D# a/ s  z% s12 X0 w1 Z8 t; E" O* ]6 @, C
    2
    7 u1 ]1 d8 f5 z+ p2 O# i3 \7 k. O34 T/ F3 r7 F3 c! J: }) \; L3 H
    4% @  I8 N0 x7 B; V. q; Y" Z  O- [! a
    5
    ' J! p" ?4 x7 z  h6
    0 B. ]- _$ \& T8 z' T$ H. n9 F1 Y7 o' |7  u" K6 L  _: d, [  _, U
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)6 b6 P6 l% h( z) f9 E% e
    7 K2 d/ C. o. T9 s( u; I9 \

    ; X0 o6 n/ L/ e! }! e
    0 @$ f/ v- J% E1 H7 w' m

    $ H: I! X# C* y4 U5 v6 A3 l' q1 @! F5 D' K. @# E

    9 x# y: m+ l" B% d; |
    ; D( I! Y- J# m  O  c. v, U* n

    0 [7 Y) Q4 ~" U2 J  K: ^2. 箱线图分析
    6 ?' q' e# S8 _$ U/ o3 Fimport tushare
    $ I+ t0 Y$ q1 X( Efrom matplotlib import pyplot as plt+ m& B9 r3 a: d4 [. v" V2 D4 _

    # |% M& f5 w5 Cdf = tushare.get_hist_data("600680")
    # O% [9 O; O) W) T+ d0 Gv = df[-90: ].volume
    * x% `" A5 z" _% n& b, E+ Fv.plot("kde")$ G' c- m' o2 F. H
    plt.show()% y# W, N' j4 B* }/ m
    1
    & P0 X4 S5 s8 b0 H2
    0 Q# N6 V9 E+ e  J. q3$ F0 o! S" Q  i1 {, m3 c, \
    4
    8 j" `0 ^2 Y7 y$ s. o8 ~5
    0 u. K( }3 `3 h6
    1 r& |8 W/ ?0 O( R73 W$ B6 S0 H" k( U' p# m) p
    & s7 K* x# d6 j) [
    ' Z5 M& O) _$ @( f* X. u$ s4 D
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!2 {1 o' D! j; Y& t* c0 M  i$ ^, u

    : f. h! Z  A3 a6 S6 ^0 J9 t
    ; @8 L2 u# h: n. g% c3 U7 t
    3. 基于距离/密度
    # E4 h$ A, {7 G3 l& d+ ]2 {3 P+ |典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。) l& q6 D3 v0 P, m5 G6 Z; e
    $ c5 J- j3 A; O6 t7 w- ?1 C
    1 Q) M2 W& R7 g5 r5 i7 ^" V( B- g
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    6 t: ~0 J5 F* |6 p+ Q; @1 A4 g  V8 E) O; ?' k
    / t! R+ q2 y7 {" s: x
    - K, f. U, e6 A$ i5 }

    1 c: ?( S% g' H3 b% b0 r
    7 Z: i5 a7 W* x

    0 X0 l. e7 {( ~# E/ T( Q0 t7 k4 C8 N1 S

    $ R# z/ i1 u& u9 W6 F4. 基于划分思想
    : R7 J. b' y# N. t1 L& W典型的算法是 “孤立森林,Isolation Forest”,其思想是:. j( p) w0 R0 W, a- J# V
    % k# p+ T+ j+ p" O# @
    - e. C6 c" K$ i/ x
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。) l8 D! G- ~# i4 B

    ; p% o% m7 T7 [% ^; V! S7 K& r

    8 H+ u  @+ t( o2 B# {& {" [9 }8 L1 a# W这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:7 v/ W( Z# j) K9 T% e* h
    : h) f  S3 R1 C4 t) ~& h
    ! h2 T% D3 f. N+ p
    import numpy as np
    ; k9 o6 O+ G$ i7 d8 k0 V  q0 B4 t$ Dimport matplotlib.pyplot as plt
    " A. ]8 d6 K, e$ o2 d$ v  rfrom sklearn.ensemble import IsolationForest9 `$ U8 Q8 p4 f" R1 r* P

    & g0 O/ @* `7 l4 o' d7 d- l
    : B: W3 j/ M, u
    rng = np.random.RandomState(42)6 w2 [# t8 y  {6 G9 W( k' S4 B
    4 a+ y# o& x8 w* ^
    7 d( _- `8 H& z& d" q/ c% t+ a
    # Generate train data, a* D, P- `, }2 Y& D
    X = 0.3 * rng.randn(100, 2)- m# o: L7 S7 r4 ^) ?
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    4 R5 m/ `# e7 O% P3 o2 o6 T. P# Generate some regular novel observations
    : L+ c6 t2 ~' |" V0 s( t* lX = 0.3 * rng.randn(20, 2)
    % Z' |9 B% r  W, K, A" b0 x) mX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    4 r7 g6 h! p3 m! c# Generate some abnormal novel observations
    & ?. r3 D, [- bX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
      e, K- D" p. Z. K: j* p1 F* v: G3 \* l# k, q. S1 \7 A

    / G) m  W/ V9 \3 \# fit the model1 K3 l4 L2 Q; @- P4 Z) u3 j' z6 U
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    9 ?6 P* {8 e) H3 l6 G' oclf.fit(X_train)7 R; H- I5 Q! p. S% p5 w0 w$ a- X
    y_pred_train = clf.predict(X_train)3 ?9 s; u& N& Y( H& O9 S
    y_pred_test = clf.predict(X_test)
    8 Q) M- ~& G: l5 _2 X: E7 P$ ~0 Py_pred_outliers = clf.predict(X_outliers)
    ' m+ ?5 O: R5 u0 f  @8 N$ L- R, w- B) E% S+ d% }
    " H  }& I% \- x' Z- {' u2 R
    # plot the line, the samples, and the nearest vectors to the plane
    2 r4 X/ w+ E& ]* `xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    & G6 i2 D* C. c" R) m2 l/ D1 fZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    ) Q/ V, j3 s4 f( Z" hZ = Z.reshape(xx.shape)- }# K5 _  Y. P7 P$ N5 n
    6 U9 |8 ?4 T, A; y' j% J! {
    4 I  b$ Z: w2 b- W& S+ `
    plt.title("IsolationForest")8 K8 X: l, _3 ~8 U% M5 l7 A& X7 I2 Z
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)  {9 ]- Q4 c+ D) P* s, \
    1 S" p3 K  M/ o, f! \. z
    & X2 _  V1 H2 N- O
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    ( z: l* ~7 D! N) c3 xb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green'): O- g5 B& o- y1 ?$ ]9 [9 V! N" k; n
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')4 L8 L" z9 H& R0 j6 p6 F
    plt.axis('tight')1 ]! j6 P3 {4 j5 C. z1 j
    plt.xlim((-8, 8))
    ' U- u% \+ A* V: Bplt.ylim((-8, 8))
    , F( F) K0 k9 _& xplt.legend([b1, b2, c],
    2 C/ y4 o3 W7 k! s9 B% R           ["training observations",; }2 ?( `6 `, D& p; Y& {2 Q2 U8 @
                "new regular observations", "new abnormal observations"],; y! {3 `  X7 v1 J, v3 h! K0 @% E
               loc="upper left")2 g2 I% g: \& M1 l& W! c$ Z* q
    plt.show()0 E$ \4 e; }6 Y/ J& w. v* _0 k
    1
    ' F. x: X( k5 o, \' b) J) F2 n, J, T2# S$ l- _# j+ D- {1 S# t0 p
    3
    6 m, V- Y) T. A5 ?4 u) h4
    % M( z% B# A. B. {9 m5- i# d7 ^  B, c3 I$ j
    6
    / B. y9 ?0 U- u7
    ) u9 w, z8 x/ t9 S! u& k' k89 E5 i' F( V/ U0 e2 e* P
    9  M3 K  J5 F& L. m/ `; b
    10
    : [. g1 c; Q( r1 C/ h# \11& ?9 q7 K" b( `6 l; Z  [
    124 Z5 \) y, I+ P
    13
    9 n3 F. Q  f5 D/ }14
    2 L) O1 Z/ ^: F1 E8 x15: x( B2 S/ Y' @0 e0 y* n
    16! O/ o- f+ p: _
    17
    # {/ j1 g" ~/ n180 [2 B  n$ n& F
    19& L" D3 R7 t* P% u" R2 _+ U
    20
    7 a( S6 F+ {" f( h1 L# S4 P21
    2 e0 r5 d# T/ d' [0 ^8 {22
    7 }  B6 r# }% C7 J& n! I23
    $ h! [+ ^: o- n# L! c. G! D+ L24
    3 a$ H: b- f7 s8 d25
    0 |9 G) r1 [' O26$ ]% J- `* E- a8 ?0 W2 G6 Y: m
    27' j$ V, W4 q6 u8 X6 D2 H( y: w  d
    282 g8 S4 ^: b4 x- T! j3 |3 u# z
    29
    : z0 t) n+ [; g6 W3 v30, a' Z' d( n7 ^/ @8 N4 J
    31
    2 X$ }/ ^! A. J- `! N7 J32% ?/ O7 U7 y$ o, C+ _
    337 P1 s" ?9 d$ F' S) U$ m: P
    34
    + X0 V9 j) r8 Q9 G4 C5 D1 t: Y1 N35/ ~# V( s( M% l! o3 D
    36
    1 v5 x1 L* E4 t* D# e+ ~! M# v37
    . t. {8 i$ `( T/ A38( f, E$ N1 u1 q( f9 y
    39
    ( R5 x' w/ a2 v+ e6 A40. o( p7 G, H7 k
    41
    & A( i8 x2 Q% T+ x, K% v
    ) Z5 |) Z3 S# w- U6 [

    / T# R4 C. L8 ?————————————————  d; d* h  I1 }/ w  }" A$ m
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 v8 S% Q1 [) C* S" [/ `
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    2 @& w# b; p* h( R% X- ?/ M- }
    * }3 `5 {8 n2 a7 b6 F  D. h0 O% M4 D0 Y3 {
    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-21 06:18 , Processed in 0.304946 second(s), 51 queries .

    回顶部