QQ登录

只需要一步,快速开始

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

    1 N5 k$ c6 I& }- b$ S; ?  Z( @( T, Z- a数学建模:异常检测算法+ F/ T* `" w/ S6 L
    一、简介 – 关于异常检测# ]5 e0 O/ p5 Q4 q2 k
    异常检测(outlier detection)在以下场景:
    # `) e4 y1 K. J4 v% y# W1 I( W6 e  P8 ^; d9 G3 }8 q0 w2 t4 }

    ! B! f9 I9 q- ~; J: @$ l数据预处理
    * u, F# s9 t7 S" B% S+ J5 o病毒木马检测
    . o8 j# \6 a7 ?; x* @! q工业制造产品检测
    7 ~5 W; p2 Q% s( ~- b, r7 Y- ]网络流量检测) k$ T. ^3 U7 C& h
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:/ T% B5 g3 _4 c2 }
    & e% S0 b. t0 i! ], u  B
    6 ^, j# |" o9 C+ i8 T' B7 b
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    % e. e6 |+ l% R. p# p  p5 s) \% B1 R/ v& x" T

    5 w! h* y7 T; M: \/ k以下是异常检测和监督学习相关算法的适用范围:
    9 E9 J5 _% z+ B, e7 }; p( p( v# y' L+ f: q( ]. i0 |. [% y. u

    * c6 N4 s: R4 s) }6 G- M异常检测
    : O$ X# m( r8 A/ D. H2 X4 s+ l信用卡诈骗
    ' S* d2 L5 W$ i4 G) z/ L制造业产品异常检
    # t- K$ f  p% n- d0 @0 H数据中心机器异常检
    - I4 k0 r8 B* q入侵检测/ e( X4 V6 a! e9 b& L
    监督学习
    . O8 o" }' n4 y0 f垃圾邮件识别" _' y" F; c  |- w6 n
    新闻分类/ A, z. z# |, w2 |* c' g
    二、异常检测算法
    3 Q7 `* B1 }7 a+ ~. _: h8 [, J9 h% {& _* I* f1 y" a5 _& a( M

    5 l7 c* L# V* }, {% C9 [+ |& s+ d$ o9 _) n

    ; g0 X1 t7 S2 l/ a" p( P  F" s. g' s! c* T+ |! y" g

    5 l0 I2 {; B. s& o. S1 Y' Himport tushare& q- z8 f( H- |& B- G) y
    from matplotlib import pyplot as plt, Z, Z/ {& P9 C( S! \2 P; U

    9 c( a! K8 Z% k- w6 fdf = tushare.get_hist_data("600680")
    ) o0 I0 g( n) S! O: _6 ]5 t' dv = df[-90: ].volume
    % Q6 x+ A9 a2 k6 j1 cv.plot("kde")$ z$ ?5 S0 J- P! P( @% T
    plt.show()
    ) b! S, v& {# X! j" R. V1
    ) T+ p* F! H1 }- q2
    0 G9 Z1 C1 w4 _, I  k39 E8 l/ H& P2 b8 I& ]* d8 h( q
    4) y3 u& x# A% d- k4 O
    5
    ! r$ {/ i) s( ^; x  y6
    . ?" A  N) h) S3 ?4 @8 b78 q' A. t7 R& h, R
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    . `! |1 \2 O2 ~! \( h. s0 T8 R: J" N* x1 \$ o: I& S
    - k3 M8 w  I6 N4 e% s2 E' k# Z
    . W! B1 z2 Y( Q$ _
    5 ^  f9 {  T' H+ K

    7 i! w0 V3 V; M4 B1 r& i+ h, Q
    + S  V2 E9 }2 s' P2 \

    * B# ^# w1 p$ u9 w$ h. s9 s
    + M/ L! W- X- x3 e1 @
    2. 箱线图分析/ S- v  v' X' }6 M) W
    import tushare- v/ e3 j4 Y* Y3 M0 O
    from matplotlib import pyplot as plt5 q$ x  O4 W& O; A# o9 u2 `

    ) |( Z1 h# k+ ]; F0 T0 F; adf = tushare.get_hist_data("600680")
    " W5 K7 {1 A/ A# j2 k3 u) A, L( Xv = df[-90: ].volume# g" o, B: q6 C
    v.plot("kde")
      }$ L+ L- }/ x/ kplt.show()+ J1 ^/ e- y; F% |! o. f
    1
    - M1 y9 g' d& ^$ a) C* n2
    ; L% n* `$ D2 D/ \1 v2 V( [' [7 p3
    % Q6 k3 {# x5 Q6 K4
    2 A# z7 _# e4 E" |, q. G. J5 u4 R5
      [: h4 R9 J& @! a5 _- l, o! |; u  k6! x1 G5 @+ w+ T
    7
      f8 C4 W) ~! i; H) r  Q% @# v! h+ C  u1 u

    7 t$ A: K, P; @. p# B, M# Q% R大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    0 K# S9 Q+ ^2 X# r
    ' i4 d/ F4 w: x7 t$ B2 c; }& f
    $ z, z9 ?5 }. P$ ~5 x
    3. 基于距离/密度
    : Q5 j6 e$ Q& B典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    ) ?+ s/ {# }' m
    - a0 F. i8 m) K& T: b

    6 l; z+ d  T* ?- _% K) ]用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    ; r$ E% m, u& z) [: M
    9 z/ x( F( I$ W! w

    0 m9 f2 H9 u  F- t6 F1 w/ `
    # ]3 n8 {+ Z! ]$ N8 O) l" K3 k
    % ~  M$ ^( o. ~9 }) G* X; k$ P7 V. ?
      i6 p8 N- L8 {* s" U2 t% Y: ]. W( }

    " }; Y+ b7 C/ i8 t% ~( v3 E% I3 `8 I/ G- H
    ' G- C+ I/ |9 G1 O: M0 p
    4. 基于划分思想
    # @( K( t  X& i典型的算法是 “孤立森林,Isolation Forest”,其思想是:  H4 ^3 L6 N; d

    % O9 ?# R7 Q) `! m* _( \( ~  x
    * Y$ P# D$ m0 x; f
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    5 g; _3 Z+ ~7 F4 U  y) f5 X  \4 P' _; O* Z/ @/ M( S0 F$ F

    ! t0 v3 s: |9 |6 j) c4 ^" V/ _& g这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    + ^8 ?8 [" D% o4 y- e! X# w( D9 L+ K  B
    9 u/ G# E0 h5 W8 ?, V5 l
    import numpy as np( {; _4 ]7 u* D4 G$ c+ i% N) Y# y
    import matplotlib.pyplot as plt
    5 T6 D$ ~7 \1 A3 }* Q4 I( N" afrom sklearn.ensemble import IsolationForest
    ) _* t) f1 S# W4 ]' k% z! c/ [! Q  ~, D1 n0 P

    / n; c: y! B9 }% J" prng = np.random.RandomState(42)$ E' t: w3 G7 ?
    9 ~9 j! l( S, v+ Y% v+ u

    ( Y0 k+ }8 d4 f3 {/ Z# Generate train data- p2 ?0 p5 L# U8 q5 x! D5 {/ n
    X = 0.3 * rng.randn(100, 2)
    5 d9 U$ V* ?% y2 ~: @) I. CX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    , r9 j! X! j9 C9 V# Generate some regular novel observations" |1 g) a  B# ]+ ^. g& U( N; j& T
    X = 0.3 * rng.randn(20, 2)
    , g1 W3 l! p1 V8 ~  H* LX_test = np.r_[X + 1, X - 3, X - 5, X + 6]7 w# h1 O- i1 W* }6 y! q
    # Generate some abnormal novel observations
    . ]% p7 y( y& kX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    ' M3 p+ u  g/ x5 j# V( B7 Y  w5 G
    : }0 E0 t& ~3 c6 r4 Q9 Q

    * d% H, B/ @! ]2 X. h1 o, J# fit the model
    8 h/ |  a6 s' sclf = IsolationForest(max_samples=100*2, random_state=rng); D- D3 e- ?' C# t. M4 c
    clf.fit(X_train)
    4 Q( M' r: I2 ]$ Uy_pred_train = clf.predict(X_train)" M$ r4 |$ F4 p; k  l
    y_pred_test = clf.predict(X_test)
      G  ]) I0 @5 {: Ty_pred_outliers = clf.predict(X_outliers)7 p' e3 i  Q0 d
    , u, e2 g0 K% ^- Z2 t% h

    $ F7 ?9 \" F  \# plot the line, the samples, and the nearest vectors to the plane/ O2 [! q. M( i* ]* w
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))& t( ^6 m' o& O6 \  f
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])+ W! A" ^* R# C! }& ]/ O( O
    Z = Z.reshape(xx.shape)2 r! e; ^% h( j+ Q' U  f

    2 v! o) g( r/ O
    # q! ]% n- _) `& l8 l8 Z
    plt.title("IsolationForest")
    + [1 ^0 m3 A5 Jplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ) z8 \. j  S$ `$ \/ q8 `( _0 G6 A" P+ @

    8 X4 f  D$ q8 r$ T9 F0 @b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    % l4 E1 D5 B! y- i% [* pb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')$ f/ q# a/ H% X; v+ q( ?
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    7 z6 }: |* W: Xplt.axis('tight')/ e  }' l2 p/ w1 p
    plt.xlim((-8, 8))/ l% k% D8 B& N# J2 g6 o' \' i
    plt.ylim((-8, 8))5 Q1 f1 m4 ]) g; ^- Y  x* M
    plt.legend([b1, b2, c]," i! y* e) t* P, \) s0 A  e0 o
               ["training observations",
    * M6 r/ ]1 l! ^            "new regular observations", "new abnormal observations"],- ~2 F) M- U' D' D
               loc="upper left")( T' R+ s1 f4 O0 D1 H4 z* L2 ~
    plt.show()
    6 Z! U- c, U1 r; s1- h4 Z2 d8 z. l4 R% Y# w
    2
      i  C+ h) Y' I' X" j9 A3
    * Z8 z2 M  s9 B+ i/ ?- x4
    + _0 H  V! r: @% [* Z5+ B* M2 A5 L5 a4 e) g: p% u
    6
    9 p2 X1 `& i& D! c# `7
    , X4 Q* O# Q% ?4 }! z  w8
    5 i* ~# N$ c+ @9
    5 |) z! x: |0 E* |! n1 h10
    , `3 T! [4 G9 E( O0 O3 ?: K8 u11
    ) u" W* m9 u/ q4 O  a' a2 }0 O12
    1 ?1 T4 ]- t8 ^' k& c- q13
    ' s# @) r/ M/ U0 z0 q14
    / A7 R4 r& i' c, B15
    * Z+ T$ l& a* A2 `5 r$ F16# u9 L- Z/ M$ e0 d
    17
    . f! s1 r; Z% |% S  v8 b. }18
    # K: P7 O6 ]) p# p; A1 F192 d3 Q' C5 ?+ d, _9 R. k
    207 `3 u) I! w5 o1 A4 p
    21
    ; s* h7 w! L4 W' J4 z. G22; [5 h: W9 o3 V" W7 d" v( O& m
    233 C0 ^$ h6 J3 i8 {& O
    24% A  A' n7 v! h/ Y, e
    252 J1 D2 v6 w6 ]+ ?* A3 j: F
    26
    9 I4 |. h. O. v  I, _27
    $ o' c. y8 `& K28( S3 M' K0 R3 G. k. R
    29' M6 f; Y" j! J3 W# B$ d# Y
    30* W1 w, t/ Z! t4 P& x& i# ^4 h# B
    310 H. O: m+ ?+ o8 `& R0 n* q
    32
    # V3 ^4 \. e6 C) d6 ?4 I, K' I33; y) `' F7 U. y7 Q& s2 P4 i0 X
    34* y% \% f) Y% r- V6 |+ f( n& ^
    35) A! m; ^" |0 o0 q5 E
    36
    " L* d5 x" ^' w( g% i37
    ; R" }/ _) D, F" g, i* s; C386 \$ k$ U. ]( L% f1 J
    39
    . Y  L- G8 G0 C, R- D40$ @4 v2 g* F' c- d, e
    41
    : n* v; I# l8 M
    ) n7 ?6 K, {' O0 Q5 Z9 q0 X+ ~

    ( M, C" N  W4 g+ N————————————————! _0 {. z3 X2 e
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ U  O' C2 v# a( x/ f! C
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    ) C  m+ a1 E; P# M' _3 a
    8 _2 ]7 G* v6 I& _; `2 d9 V  h+ D2 G' |# c, S# f& L) z
    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-5-27 04:03 , Processed in 0.331077 second(s), 51 queries .

    回顶部