QQ登录

只需要一步,快速开始

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

    6 R% w/ z6 S, a' J6 ?3 Z) U数学建模:异常检测算法" f1 \, p1 }0 ?! r. V+ A. N
    一、简介 – 关于异常检测, x& e9 L4 ~& Q* `
    异常检测(outlier detection)在以下场景:
    . I$ J( u( q' Q
    ; I" o% @+ [! e( i# B% T& L1 @

    7 E/ o9 X) W) p' j! J数据预处理
    6 C4 O" G) u% H6 C% z7 }" ^病毒木马检测
    $ p2 i& B& s& P. r* K工业制造产品检测
    $ }5 m/ V/ q' e网络流量检测
    # L9 a$ m4 B) I( [4 Y6 Z% s, q, O等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:; X8 |) W" z" b) e9 H6 M: M3 |, x
    . e* Y7 n5 c& r# [
    . ]+ `# j3 w+ ?% M/ F, y. ^' n
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。" }) }- Q. [8 z

    6 i8 z5 ]5 o) V9 ^

    * p- e$ o1 {4 o, Z( I4 v以下是异常检测和监督学习相关算法的适用范围:5 q9 x* i$ e! G

    ' V4 B2 m1 J- ^6 F% ?( v1 A
    9 [2 ], d  R3 s' D
    异常检测
    / ?* t) o8 A6 l信用卡诈骗
    ) `& Q. G2 |/ J' V制造业产品异常检- l! U$ N5 |# w
    数据中心机器异常检
    / q; k% @5 d+ ?6 ]入侵检测
    " l7 t1 j$ B" j5 d监督学习3 M) l0 Z/ k9 n0 a* e: Q( [$ D
    垃圾邮件识别
    % T7 O; E4 {( N新闻分类- B9 F7 |; a, }2 [( a
    二、异常检测算法
    * x" h0 E9 i! {
    2 j! W7 `7 j  J0 o. Z* Z

    ) P3 u8 O2 s) m& @) m
    " s* D: x9 @+ b& i! R
    + Q& u5 p4 t  r* O2 r

    - f! p! Y& |4 x6 {6 H9 G. Y

    . N& U) M- f' ?/ Q4 S) H  C; Y# b( Iimport tushare
    3 R! c. ?2 J0 x5 ]from matplotlib import pyplot as plt
    1 I  @' f0 _6 ^3 i$ s ; K; f% X* ]9 t/ E9 m
    df = tushare.get_hist_data("600680")
      ]. D* l- d& ^+ g+ n: I" yv = df[-90: ].volume
    + k: t# o" j& G7 t) Q9 Hv.plot("kde")
    ( V! z5 u- m$ n$ ^plt.show()
    # G* _6 G) @. S- p' z10 M) Y, o3 e- a+ T# {3 u  f
    2+ u/ f8 h' S7 w4 ~; f" Q
    37 t5 j: @/ v8 C9 L3 ], i5 A/ q- y2 I
    43 @' A: R: t6 ?) M( C# j
    5
    ! g1 Z, v/ d5 V6; F6 M  k5 j$ e- F
    7
    1 K3 C2 z6 M! d& p近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    - B# j  o  \) i; D0 D7 z
    : j0 y9 e6 v3 p8 I2 o5 w6 V) Q

    / x( s- H7 H. e7 p; [! }
    " r9 A  x; N! h5 W

    ; D9 ^) B. a" u6 s3 I# ]4 H! ]6 J" Q" N! y- N/ a
    ; W4 O! i' {2 i- ]. @% K' ^8 `

    " P4 @5 {4 v2 W) {
    9 z$ Q1 v' i' u7 V0 B
    2. 箱线图分析
    + A* G; `; W+ }) timport tushare
    $ G$ `( O# p4 |/ wfrom matplotlib import pyplot as plt5 x. n% d4 J; r
    : b! ]9 V% o& P: ?  H) M
    df = tushare.get_hist_data("600680")3 l( l1 i$ i/ d
    v = df[-90: ].volume
    " t& ~& _8 W( y: Q, |v.plot("kde")
    8 c& a" `. W0 E: Gplt.show()) D+ P" f% y. n( _( y5 x
    1- a) j: I  E, p1 o, _: j
    2
    9 t8 Q5 `: z* Q6 E1 ^3, \# Q* z, Z; W' V( s7 |$ U
    4
    4 z1 g$ m; u$ z# c6 _( Z5, p! \' c/ r- i' v1 R
    62 @5 W# t9 e  T  B9 g; r( S8 M  l
    7
    $ F" W; S7 \% v8 m! s# f! ?6 r( e) }/ T& \* `
    ( ^0 U& y- Y+ O! k' \& N+ z. E
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!: e3 P& c9 X) e. D$ h* ]6 G8 E: _1 C

    + \2 F, i. |; v; I+ w

    " X/ L7 T1 |; y7 h9 H3. 基于距离/密度
      @! V* l8 T/ r, u2 u典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。" I; g" M' y* u" O% J

    2 A6 C, p3 r& |. g9 M7 {, _
    ) i7 R9 h, E5 E% I$ q  y$ t* w
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。4 p+ r* y0 c, z

    " D8 \/ \2 T2 `6 a0 q

    4 y1 L" a& N; I4 Q- R$ r. M% b& d7 A* n

    / s: a1 k1 I4 n! h' g3 Y- @: K1 {* k" t4 m$ `
    & I- x& G, I# W( J
    ; p$ ^0 @0 C5 o
    * V: b5 H& m: _, S; D4 Y
    4. 基于划分思想! x% ]  {, d- D* i2 a: g0 e. }
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:- P' w* Y/ z6 F, f/ ?( ~
    # P5 d+ L* M1 z3 }
    : f. }! x6 a: G- }3 ~' K0 G/ H! m
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    . K" i! I, Q5 e% ?$ f5 p4 ~* m5 l) i# K/ K, t
    0 s8 p2 D0 I: O/ m6 E% ~
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    2 m1 e0 Y- F2 @7 S/ @0 D3 d$ e
    8 _0 l/ v$ ^+ O" ~7 u' L
    3 U, b& }8 Q6 V$ J/ P9 z) s
    import numpy as np
      I& V( X5 m% F5 fimport matplotlib.pyplot as plt; {% ~$ _3 O+ ]6 A% C6 ~
    from sklearn.ensemble import IsolationForest- C" c4 `. n0 q0 k6 \& w- t/ U
    : ?; [6 ^2 t0 ]. D" {6 C

      c+ t7 f- T9 B+ m; t2 o5 hrng = np.random.RandomState(42); W) Y0 {( L+ Z( \. t* s

    1 Z, v0 T$ A0 V5 o0 k

    0 X2 d( r+ o) o8 Z) A+ S; C2 N' o9 h# Generate train data0 e* S7 |5 [1 ^! D: ]
    X = 0.3 * rng.randn(100, 2)1 t; g, s* E# [. U, t7 M: L
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]8 f. U# d; e3 d1 y$ {, e3 q
    # Generate some regular novel observations9 ^& _; ]$ {- X4 D) j. V
    X = 0.3 * rng.randn(20, 2)/ Y$ `  Y5 }  t& c
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]6 g+ i( A( ?$ }
    # Generate some abnormal novel observations+ X) D9 B5 `+ Y: m
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))) l* X8 U6 y! p3 M& c! k/ y& l
    4 K1 F# |' o+ L- x7 p

    " w% Y* Y( @2 {. Z0 P3 ?# fit the model
      J1 P8 t' N& B7 b4 jclf = IsolationForest(max_samples=100*2, random_state=rng)
    6 \3 h/ j4 [& Z  L5 Sclf.fit(X_train)
    - }/ B4 \8 N" X3 ^( x7 h$ J  |y_pred_train = clf.predict(X_train)
    1 ^/ e$ @% Z8 wy_pred_test = clf.predict(X_test)
    " T/ I; _1 w9 Q% p; ]. R: gy_pred_outliers = clf.predict(X_outliers)
    " e, n9 O3 n# K+ j: h& }5 K' N9 o+ U5 N( B- M, [  r2 s( |

    & Z0 d6 Z) V1 k/ A, l0 q% i# plot the line, the samples, and the nearest vectors to the plane, @' L+ ^- }9 Q- t' v1 f& U
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))% o% z% T6 h- @* u: @
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])- V9 f/ c3 f1 S; Y# q8 v
    Z = Z.reshape(xx.shape)! h' X, p  M+ l! r( w. @" \- q3 D

    ' W& l8 w) w+ a2 u& g' R6 L
    " x7 I4 T5 W! o* Y3 I0 R- G
    plt.title("IsolationForest")
    1 S* F+ f; D- e% yplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ) {7 Y* I% }6 q' I5 f: d; X% D; y9 s, q, m5 e+ O

    ' `3 _3 D9 b6 n8 B6 Zb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    8 O4 n, I" a5 a/ q/ x1 lb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    ( G4 V+ @6 [0 y, Kc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    : ]2 k8 y6 c* m/ C" u: @7 H8 Gplt.axis('tight')
    - f6 ~# k1 s7 T) w5 O7 gplt.xlim((-8, 8))
    , {2 _, k( E0 H9 x. U( cplt.ylim((-8, 8))
    # v  \- U2 F/ k& Aplt.legend([b1, b2, c],% T8 Y& {$ y1 q" Q' t" K
               ["training observations",
    % i6 p# K1 ]! }* V# W1 g            "new regular observations", "new abnormal observations"],/ X( p7 V+ t# C8 }1 q- @" r. J3 r
               loc="upper left")
    ( Y" `4 k- A+ h, w' Q# uplt.show()8 A  Y8 z7 \- k' Z- @% R
    11 c% B3 L6 x4 N6 _3 m' ]8 R
    2
    0 t! G8 A% B/ O0 \7 y+ P- d3, j1 U3 }) ]- U) I
    42 r/ C/ v* |3 I: ~6 l
    5
    + I  ]! T2 N- Z4 }* L6# I, @( M. {% i, x: Y6 e$ J4 C( Z
    7
    8 ^$ f9 {4 E9 t8- E4 `7 v) X, R0 _; p  N
    9
    6 y5 K+ w3 n1 t, m2 L' A1 E101 d) ]# q8 `+ A: E
    11' c  G& Y% L; C# P1 x2 f( W4 l  c
    12
    * h& N9 S6 B( k13/ m- g0 }8 ?% s( H0 M& y
    14; ?( w3 F2 {1 R. Y& Q6 z- w
    15
    7 Q# K, y0 {. K1 h9 }% o167 W$ K6 a( M( I; @& j
    17
    8 W1 y: n1 M6 o# J18
    ( f( W7 J0 U; Q! |8 m19' I" U8 N/ ^9 J
    20
    , r5 z+ O1 O* p: P$ D. N, B9 {21
    5 w' j" y8 r. m5 ]  i8 c2 B22
    * e$ j* K( q. N# k23
    * E9 k( J) ]  x! A" E! K4 p* M24. j- U8 g' F* v$ y
    257 T4 O- J2 X- a3 D
    263 b/ v* @4 N1 e, M* I
    27
    1 t  k/ {. n  T' L" p% I8 l28
    - ^  |2 O9 e0 W# |  Y29
    # e% b1 f6 n( B" y  M1 V' k1 O  I305 b1 k' g0 B9 n/ r) r/ I3 i
    31
    6 Y. N  ^, j3 |$ N7 m32& R! [8 f/ Q8 u5 S+ X4 x. n9 L
    33
    # J9 Q9 S/ H! f; ]6 x% _344 b& i6 H' C% N# u4 m. I& Z
    35
    2 y* `+ H$ W  r0 S* R36
    7 w9 r+ N" c! Q8 _! ~+ e8 ?4 Z& f6 y370 b2 A4 ?% _* W7 |% t( w4 `  O
    38
    ! L% q  Y6 T( P, A391 d! B" L, L# y4 N$ m; Z; a
    40
    9 l1 K* a/ m1 m* i1 X5 G* H41
    & N! }$ V6 g  u5 q/ n) C  v3 V7 x/ A. X( [8 Z
    7 o( R: z1 T" u6 H- D
    ————————————————& t$ o" J& A& u, B9 i3 t# V6 i
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 n$ Y/ {3 r& c- a  }: ]
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231294 S7 Y& `1 p# f- w
    1 G1 B; K# U0 S
    ! h: `( v) I9 j/ G' u
    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-17 09:46 , Processed in 0.414124 second(s), 50 queries .

    回顶部