QQ登录

只需要一步,快速开始

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

    ) Q( L  {* o4 B" a' h( W  y. C1 R数学建模:异常检测算法; @2 [. |- R# h+ e) Y8 l. j
    一、简介 – 关于异常检测: o4 H* Y+ A, K
    异常检测(outlier detection)在以下场景:
    4 P) E3 Y% N+ z
    ; Q2 v) A; m9 c: ^: q7 T

    2 K7 I. i+ Y7 e4 T; q5 j$ y2 `! t数据预处理* l# Z" U4 R5 y4 ?: o
    病毒木马检测
    5 N3 u- C9 M+ |3 K9 W/ B工业制造产品检测* O" d3 T9 ^4 i9 b
    网络流量检测1 E/ o  D9 |8 S- |
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    + l5 B/ \0 q3 |
      q) \0 C6 r2 u8 U

    ( X) B- n$ g$ H" g& j监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    ! {1 I7 X! _, l1 x% N# C6 z2 G. q8 |0 n" {$ K% A0 t8 V6 w

    # \& `- X9 r" F7 Z) l以下是异常检测和监督学习相关算法的适用范围:4 ^8 {5 \5 E8 A$ |

    & G' A3 o2 }4 @2 ]+ M1 P

    ( f8 Z4 S4 U" x$ d$ V$ a异常检测, Y# f0 h* {( c2 |
    信用卡诈骗
    7 ^% ]' H1 I0 r( ]" }$ N' d: M制造业产品异常检1 v) x, w3 g( t
    数据中心机器异常检' Z6 V3 P- U" E. n+ T% r2 g
    入侵检测
    + f9 k8 N6 N! D2 B, o4 v监督学习
    ' f! R6 t" x" s: C$ K- \. C/ d( H垃圾邮件识别
    7 t" m. F7 e& |/ _: u1 f新闻分类) T5 H' D3 r' V: O$ t, B1 t
    二、异常检测算法
    9 e  I" r7 n- F' l! x
    : p& g. C# z% M4 }4 ?4 W
    ; x" O, X: {/ a
    7 J/ n. o' s, c/ d' Q8 p
    7 y/ I' }' B; g. @# c

    9 Y9 C  d/ ?  q# z
    ! [7 Y& Y6 g6 L+ Q7 M& D1 x
    import tushare
    1 x6 ?) q1 G1 ]3 J" |3 ^from matplotlib import pyplot as plt* L. M5 h$ D% \$ B

    2 y( U# a5 Z$ n6 ndf = tushare.get_hist_data("600680")4 k) {  U; @* M; p. w0 l! q
    v = df[-90: ].volume
    7 I) Q" u$ t8 i- ^+ m5 L3 kv.plot("kde"); s0 q( N7 R0 s8 {0 B9 H3 r
    plt.show()$ L( x4 Y" j& h. ]' C1 O
    17 y$ Z) ]  w' z
    2( d% h; s& u) X" G5 T
    3
    9 W! p  m8 q/ O5 [6 u4
    9 m- i( Z  C- J/ M6 g( k) E5
    2 n7 `( G/ t9 J0 I! W  ^) k+ i6( Z" e/ S# S" L4 e* x
    7
    : _& l0 F8 C$ l  u6 W近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    7 y" d. v  w+ Y" }, e3 `. h& W- v( ?. r8 R) P5 ~5 J4 S9 a
    + O, D) T7 h9 A( v$ n: j( M

    2 m& X6 r$ f2 D$ }+ n8 |, X
    2 Q' n5 h; ]. b% ~
    3 o& O+ f2 ?3 S1 n6 {) A: g

    6 ~5 ]8 q: h6 b7 g6 R1 F/ b- l: A  A, A% q& D

    7 F$ b2 |8 ~# T- q' z( j2. 箱线图分析
    6 y5 U1 V* f% p( C, _import tushare
    # i8 S/ b& @. N/ z& b; s1 ~$ @, qfrom matplotlib import pyplot as plt/ t  Q( T' @' a) w4 g+ z% o% n' C2 t/ O

      K+ S, P  q0 W: _4 K7 y: cdf = tushare.get_hist_data("600680")
    - O; |& C- N4 J% I8 }% K/ I7 fv = df[-90: ].volume
    4 S" t0 c7 D/ O/ p2 iv.plot("kde")- ]  s3 H, x, B/ b, S
    plt.show()& ~% K5 j! v7 M$ O, P
    1
    5 B$ Q: [2 j* N5 C& D, p% O; x7 s2
    2 r2 j6 \  j2 ]1 p. G36 @5 R9 ^" @+ @
    4
    % F, O- p! g9 p" c' T55 z8 j  M+ t* G) k1 _
    69 I: W4 Y1 f+ ?: i+ T. t
    7
    ) R! @2 [! x* k, z7 C
    $ g, x6 ?8 t/ r- K5 Y9 h2 ]& j

    - q* d3 a! x1 X/ y/ y, G大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    # O' H/ ?: G! F# M0 o+ U+ _7 O1 x& O+ I3 Y' ~

    ' Q4 x; y! Y" z- |+ k6 L, s3. 基于距离/密度& ~# g4 o$ V0 l# r
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    : v8 @! \4 D- P! N3 ~* u
    3 q. X6 L) v/ U5 ~# E0 _$ A
    6 T; y3 r* u  r
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    + X5 v. V) W, C6 k" W! s( X
    * a8 t6 I3 U  j0 h/ U

    7 L( \/ f% A1 y% Y; M- F: L2 e
    ' w7 j  V1 Y' R& i4 p

    ) a; V  e3 v- p- n, J* a
    ; G$ f! i) N6 k  ?+ ^$ W* I+ u
    : T& W, M: C; ?  ]4 a4 m- T
    ; X. |5 \  o& O+ s* f) t# ~) _
    4. 基于划分思想
    . P  J- z$ y: `+ ]+ ^3 ~典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    $ a* f5 S+ n! \  |2 o# x- o: @: J3 w* j9 N; q7 Q1 n

    # u& B) p9 {+ B8 `9 A* J" l4 t假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。! u- p2 o6 I. S

    # h+ s2 g7 m9 ?& p# ]/ Z

    8 }6 R6 K8 u+ r9 l这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    6 C% I0 `% }- a; ~6 z  x
    - i0 B* h2 A% }/ Y  P& g7 B% R2 X
    + m  U4 h% e7 W9 u! [
    import numpy as np
    ; ~8 t' U0 a# ~import matplotlib.pyplot as plt
    $ l& l+ z2 _3 r% M3 b& e) Dfrom sklearn.ensemble import IsolationForest: Y2 H( h1 ?/ {0 d# C" Y  m4 R

    ! C' N( S9 f& A0 k# G( m, c

    " _$ ~( p3 m+ orng = np.random.RandomState(42)
      I5 U9 Q: u1 @
    # w2 ]; C$ d- K. \5 @1 }7 v

    ' R' @. M/ ^# i6 i# Generate train data8 G7 H( b: d# e3 _. g' M
    X = 0.3 * rng.randn(100, 2)/ Z+ `" Y6 ]. F7 V
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]+ U: x1 E9 u9 ^8 J9 H5 i
    # Generate some regular novel observations
    5 \" [$ C0 d2 n, T/ A( X, jX = 0.3 * rng.randn(20, 2)
    6 A6 Y* H: |$ z! I% x9 f2 z8 r. dX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    5 d; j/ ]1 ?9 R) j& Y, t# Generate some abnormal novel observations0 N' B- t; I0 `+ W5 K8 x
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))% n0 `" @4 S6 M+ ^) E

    ! H9 _) R: @+ G- c( I0 s
      M8 \6 a# q7 `8 W' {9 x
    # fit the model
    / g+ d2 s) t% w( T% j& ]clf = IsolationForest(max_samples=100*2, random_state=rng)
    4 X1 y; D6 l- G7 L) g% [clf.fit(X_train)) N4 \  u+ q& c' L& k' e% o
    y_pred_train = clf.predict(X_train)
    3 Z( ?  \: J7 x  l$ H  jy_pred_test = clf.predict(X_test)0 u$ a# o7 N' p: t; C
    y_pred_outliers = clf.predict(X_outliers)
    ! _1 V7 B  O2 S* o. I, Q- v: ]+ R0 F- V
    6 C- T1 [3 |5 b2 A
    # plot the line, the samples, and the nearest vectors to the plane
    . ?  O( }. K2 v# C% x0 k) Sxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    9 [* x& j: {$ `2 YZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])& ?: n/ O9 c* O( |' ^
    Z = Z.reshape(xx.shape)  S$ U; l1 a  l5 Z
    - D; g/ S9 v* N: N' C& x: m

    $ H' J) W1 [8 g, ?$ n  q5 ]plt.title("IsolationForest")
    - w9 e  Z! g. ?5 Y* W, nplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)9 g& H6 p9 W) s- p" q' k! P" H
    / `8 Q# q7 f8 h" O( v( X: n: |; E
    % E' ^' H/ a) J1 a1 U) o
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    ' ^5 I# c6 M9 k; R$ T$ `" Pb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    ) g; B6 b5 U$ g, @0 Ec = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    * _4 E3 F) J+ fplt.axis('tight')) `5 T1 ~  O- u
    plt.xlim((-8, 8))
    6 |6 {  M9 E2 Y( b/ Mplt.ylim((-8, 8))
    0 }! f' U0 ^  Q% O# W4 [plt.legend([b1, b2, c],8 U* |' e* T/ z4 [5 N4 r3 j. |
               ["training observations",
    $ m( H( y7 M0 ^, `# y, c9 B3 M            "new regular observations", "new abnormal observations"],2 A7 D, k) M. E
               loc="upper left")
    1 N/ K( u" I( s$ s% a6 ~* G  Fplt.show()
    . R0 U5 [$ y% }2 r5 P' J' @5 v1
    ) e: t6 d5 _: _/ o) g& O& `, @% @2
    , j$ H5 m- U4 d9 Q8 N3
    0 z8 w7 O+ \% U0 T, s* k9 x2 i: Q4
    ( |& B( Z+ ^+ w8 Y5, ^% a1 R& A% a' W, }- ?# v  ]
    60 u) O2 ]; o1 V6 _; M
    7
    + o2 u  S1 O9 L( r; Y( k$ B8; r  I! d; v) n
    99 x* i% i% e; Q3 q0 y
    10
    2 N8 i# R. _4 |% m- g; q! f11
    8 \% ?- V- v/ g12+ t9 g4 J  {- f: H9 c+ J5 t' E. a
    13
    3 D4 @3 n2 e. z( q- i14# i' [' J* w+ b
    153 ^' p2 }$ Z7 _
    16
    - F4 g0 @9 I' {& Q5 S3 S6 d1 z17
    / s& P+ ?) L) ?18
    6 o- k2 e% T4 Z- B& \7 A6 X19! X4 f7 {, Z  [# o& R9 o
    20
    5 ~/ O( g& [" r# E& ?21+ p+ o! e7 i, a5 ~$ c
    22
    - |, r8 k+ ~% B. C6 \% u2 C1 ?23
    ' W" l7 ?7 f9 R1 I( t24
    , h# \0 K- V7 `25
    7 F; t7 A0 `5 g) s26; p* p, o% d2 u
    27
    + u8 C1 c' h- V. b8 r7 K% y/ b8 ~& j28; W' C& J" D) _
    297 b& l% @( ~$ ~7 W  p! m
    30% k5 }" @# U# u5 p' u* w+ e1 M
    31
    1 U  e1 @- g4 j; y* u& C- o" }32
    9 E* J5 e3 M, H7 t4 l" f. I0 ]33
    $ S5 L  K: L+ Y& w% B6 s34
    - D4 T3 M( \6 s' x4 {. ]9 l35- m1 L3 _+ L) I: ]
    36
    4 b. b& M- C' {; u0 w. S37
    $ w5 X: c" D0 [6 ]" J38
    6 v6 a* Z# j6 A# ^6 t9 a. U: {/ [' U39* q4 H  u/ t* l# N& t, Z/ T
    40
    7 G5 s" b# v2 O3 l0 `6 J41
    $ c" G! n/ G8 u7 d+ T5 ~% d4 w) W+ P' h

    , r( v& h+ w; ?5 G1 t0 o8 T————————————————6 h- D8 c. h$ h5 Q9 x  o3 B
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 L0 p" j+ O$ ^$ E
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    : e  U8 E! t# Y4 \. o& k. s
    4 W4 f3 O, [/ N2 @+ _. ?- g2 j+ l2 \# m/ }
    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-8-4 01:43 , Processed in 0.287724 second(s), 50 queries .

    回顶部