QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3993|回复: 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
    % F" M6 X4 {9 E# @; x' q5 o
    数学建模:异常检测算法' ^  H3 Q5 A: \: K) O
    一、简介 – 关于异常检测' u- V. |) g4 t' b# {( ^9 R. U
    异常检测(outlier detection)在以下场景:" h$ u( }7 g1 n$ L  k- D
    / N( x/ q  X2 v0 ~' E3 o
    ; u# S' |, n9 r7 S( u  s0 y
    数据预处理# W- T9 T( ]* y; O7 o9 V+ s/ s% ]
    病毒木马检测, f4 H8 a+ W" x5 ^% X1 X4 h
    工业制造产品检测- o) _3 @" m, s& a4 M6 W* Y  j
    网络流量检测
    3 p7 p3 M! l2 [& K" F6 k( t9 L2 Q& j等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    * [2 N. k+ R9 _$ O" w
    ' b! P( ~+ Q  m1 O
    $ f. j+ D  x0 r& t/ K
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。* W( S) X" v# b& ]# ~# c& y. ?
    2 ]7 b; C) J1 Z% q9 r% a0 W

    % V2 U0 e; n0 A+ _以下是异常检测和监督学习相关算法的适用范围:! ~# P# n5 Q9 n- `- ^

    , N8 s) M! J4 d" g3 g

    " n* Q4 }  o5 x, a2 Y6 T+ _& P( c( W异常检测1 Y, B" H! x1 q# q
    信用卡诈骗) x* p# ]' x& ~
    制造业产品异常检* K% u2 n; v7 W
    数据中心机器异常检" i3 y( U" J& U/ W# n- L% S! \
    入侵检测
    ) ?  [& |- b* N' z3 Q3 a监督学习
    4 `8 S% F4 ]/ G9 {/ d3 d垃圾邮件识别
    7 W; k/ W" F7 Q2 i3 m新闻分类4 O$ }) s* \! v& b# S
    二、异常检测算法
    + J- N. |' V; Y  @$ K  ]
    + |! F4 n% t) }

      O; K1 i; b/ \6 C- D: W* i/ g! q  A4 ~

    $ t; U* D8 Z8 @! L! k; U( ~* e0 z4 ~! @

    8 h* Y. `% @  f  k, Timport tushare
    / Y- ^! F8 E4 Ufrom matplotlib import pyplot as plt
    % Q1 A. N0 }  q7 |# L# o   j3 z, v7 F' \# k4 I0 _
    df = tushare.get_hist_data("600680")
    ( N' v3 X, i8 X) r6 V2 u% _9 lv = df[-90: ].volume
    & p9 [# |) _8 ?9 W, R5 bv.plot("kde")
    ; p6 u% {, W+ d- f+ \9 jplt.show()  }) G3 ]9 q' P% R. [5 O
    1
      }5 X# [5 o% x5 z2- m. X7 [% n  d9 i1 f* T
    3
    . g/ c: g1 K. Y9 ~/ \: m# b1 k& I4
    ' i% W, _+ E( I5 b( d" l54 S0 E; T* i+ a5 t: F
    6
    % G; Y; A, h) e  h1 {3 ]3 \1 @7
    * y6 K& E3 B3 i# L% u7 ^近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)! @5 k! r5 F- i' R6 j
    4 z& T& X) F. y7 b
    ; x+ s) F8 E8 J7 a
    3 |) _9 X8 o. T2 f
    ( q$ ~; j) [5 L  u7 O9 g; @. Y9 w

    * I5 a2 E  p2 I) g* a" |& N  g' {
    ; Z4 C  F3 G7 y; j# \) I& _% T- O

    : n0 S7 w5 Q7 k. K' e: o* v2 x
    - o0 w# Y! U, c3 `: \
    2. 箱线图分析
    + w% }; y0 l8 @9 `3 I: g- r: \5 a6 R! `0 Rimport tushare* i- x0 w0 \/ B6 d3 v4 m, y6 }; H+ y
    from matplotlib import pyplot as plt
      g5 D$ v0 c' v  T& Q, Q. U % H4 G' d) c$ W* s6 p
    df = tushare.get_hist_data("600680")
    8 A' a0 e% s$ O4 wv = df[-90: ].volume
    , g' g  H7 h* d# P8 b: Nv.plot("kde")
    & b# W6 C/ r+ e$ U; O  b. hplt.show()
      d& P, a" O: e. b' M13 y5 M; n' r% P' }5 p0 d7 U
    2
    8 |; o2 Y# v7 f; C3
    * L; p2 P+ J  W: T5 y+ u4$ X  R( ]! Q, m8 \
    5
    - P1 O& f: {/ m/ u+ [2 T# M* G6
    1 h. Q) m' q# I7& E7 O# w2 Y6 M1 y" ^. b2 U

      v# S7 [: J: v% m
    2 P* B# J' Y  }) x" D" L
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    ' h1 _; j+ O. O1 ~# `! k! z$ A1 g0 }; d# s
    1 ^) R  G/ _1 E& G
    3. 基于距离/密度7 w- B2 j3 F, a6 _2 G. |1 e" ]% ]
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。7 b3 Z  u0 w4 `) x! z

    ( Q% O- j1 q& Z6 j4 X
    # b* k$ w/ v" ?: K- C
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。+ @3 B$ ^' M3 K# ], E: x' n

    / b! z7 W) U! L' N' g

    4 t, \. n4 R# e& {) X0 M
    ; \* q9 J6 Y' K  U1 T8 h9 [

    . C) K) @  O/ o' D4 [% [" p5 u7 O$ w6 {9 x7 d# w

    , o  m! B  g7 o
    ( A1 B7 B  J7 J+ b

    - {4 R$ B+ `* c8 C# m! k# U, \4. 基于划分思想
    8 `5 ~! [9 v, v典型的算法是 “孤立森林,Isolation Forest”,其思想是:2 o9 }# c. \& ~# _# Z
    ) I& T' h5 \2 \# [1 j) P* S

    $ Q  K: {% K0 D/ o' m假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。& F: o6 ?4 D- e( k* p: J

    ! D; O$ G' p+ {

    ' U; v# H# S" J0 P( r这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:; Q2 P- c* d- w/ }( `

    6 }9 ?4 k: X  Q- G) w1 ^

    2 `$ f* L1 @4 A' w9 z9 }7 e% dimport numpy as np$ [' ]- j* x' D5 y4 @; h# v  V* h
    import matplotlib.pyplot as plt  d4 Z0 N2 g) e$ {
    from sklearn.ensemble import IsolationForest
      ]" W9 U! _* {& n2 S! V) X
    : Z, r2 A; h9 Y: @
    , W5 H! i% U4 W1 f! p
    rng = np.random.RandomState(42)( ~) J# o/ v, |8 C5 S+ N3 Z8 G

    6 p/ Y, ?! V; ^  L+ p' c

    5 k9 Y3 x5 }4 n+ q4 I* u# Generate train data4 c0 L$ I7 B7 Q* r) n
    X = 0.3 * rng.randn(100, 2)
    ( g" `! x2 U$ k' e* ^9 zX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    ( |% M3 u$ o- X2 K# Generate some regular novel observations7 g% n# c$ F; z" H; g: y  g+ g
    X = 0.3 * rng.randn(20, 2)+ H! u5 o* r. |% |, U+ r
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    7 a, s1 p7 o3 Q0 I# Generate some abnormal novel observations5 F: L6 W+ t7 `: t
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    0 ~7 V% n% ]7 A
    ; {# w0 K, S& L' V( t7 q; R# p

    1 ^- O2 \2 c4 y! _! {# fit the model- [: y# o" I/ v3 r
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    3 b, Q. ?6 K& [: ^! x" e' T& @- fclf.fit(X_train)
    1 T1 r' n( C5 _; A2 O- g% }y_pred_train = clf.predict(X_train)6 @8 `* b# s8 X+ w- J
    y_pred_test = clf.predict(X_test)
    - p+ b; k% u8 b- p( Jy_pred_outliers = clf.predict(X_outliers)
    + N! F1 a% a2 R7 R7 S
    9 y0 y% }' S- a  L5 j
    + G5 ]5 I0 L8 H6 X
    # plot the line, the samples, and the nearest vectors to the plane! R# ~+ r( T1 _' ~' p. s
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))) q  Y: z7 s7 k; h6 A" X* M/ c
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    0 W: C8 x2 u8 K3 G' mZ = Z.reshape(xx.shape)
    * a: W( ^2 ?% z; P( s
    ! c5 M, R  ?( u3 q
    9 m. m1 W1 q* J9 L2 N0 c; q* w
    plt.title("IsolationForest")
    , B! s' v5 {" {/ cplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ' e( `) g! @7 ]; ^5 d0 V1 P) H) W% y9 }7 |' c* f- {

    ! U- q, G8 a+ q: n! H+ t" {! |( mb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    ) x2 v! o9 B3 eb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')+ Y  J  j' W  {) w( m. g: x- Q* w+ F
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')  n' T; B( w/ L8 j9 _4 Q: i  E' W# h
    plt.axis('tight')
    , d8 J5 P9 ]* v. m- P) splt.xlim((-8, 8))1 m0 [/ u3 {/ q* S* e, T4 F6 c
    plt.ylim((-8, 8))
    : b! e. @/ y$ }$ l1 ~  \plt.legend([b1, b2, c],
    & M- g; a; \% L* ]$ p% e4 v$ p           ["training observations",# ~9 A; R. ~* q9 u: Y& Q% W/ n
                "new regular observations", "new abnormal observations"],
    1 `, d6 m- U' b1 A/ y           loc="upper left"): S8 |! H" U, u! p! Z! t
    plt.show()
    ( D" v' V4 X) w0 {15 m& a1 Z/ F9 e
    2+ g; [- A, o  l. V
    3' B. x6 e7 s% N* V6 m
    4- }/ z  Z( T8 d- e
    5
    4 Q: f2 r& u6 P/ F; O* x& O6
    0 f# D. D+ {6 E2 _7
    8 B/ @0 o6 X& x8
    . U& N& C' g/ C9
    3 C% w+ T+ S9 J/ e10' |1 ?( s6 a2 A) {3 n0 `, }
    11- R) T  U/ G7 S' o( @, _
    12* d2 k9 Q9 Z" R2 O3 ^( f, O
    13) O% G! r) e2 v3 t& G; \
    14
    + f- V( j0 ~% |  j; C8 h0 P' Y; @15" X' F6 i( M! _* S
    16; V+ T5 }/ \" j  U2 a+ @2 U
    178 ~/ E8 m) L( t
    18
    ( c; [) c+ }+ G% N19
    , ]8 C  c7 K! r' G: |; s20/ a0 W( o3 w6 y+ |
    21
    # S6 Q+ Y. b0 T- `22
    # W  W' b8 r$ H; P6 O: G# \23
    - F/ S0 C2 [4 n" [) k5 M  s% [% L24
    1 N9 S! {0 M1 B/ h5 M# }7 Z) I25
    4 r0 p( E8 L, b9 \! k# O' h$ E6 M26& W; M8 N/ O# G6 S4 G2 q5 P7 E
    27
    0 o" [) v$ x1 q4 J, w" h28
    0 M7 O. g0 \/ x1 h299 b) S- j% l+ x" U( R# i' J. F6 Q% H: G* u
    30
    1 F. w  G+ g" `5 M31
    " J; m% Z2 l; R, L32
    5 j5 f0 m5 F* L2 ~, S; }$ `, B33
    ! J+ d& Z0 R3 k% A& X" z0 A34
    ! j6 O0 `, _" f3 w35  q0 r3 {% y" S) a% C8 I, e
    36
    % E+ Y; |* k: m7 @1 H37
    1 p7 ~/ B2 }! u& m' K" n. D) Q, _, {38
    & m. N' M. o5 K3 X4 W" g39% R+ `/ M2 o4 }" y' c
    406 d6 ]& k% Z8 [: g' y2 ]" I8 `
    41
    8 ?6 ~! a. U8 |  a# r4 W: a7 b, A  _: R) `
    ; |( I+ u  e4 a6 r4 r! x* Y; U6 e
    ————————————————9 C+ u- x# F& H
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ O- E- G# V# }1 p% Q9 [1 |  ?7 q
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    3 ]+ O1 `% O+ s- t
    0 A6 y, }, F8 X; G" Y
    , W3 Q& ~' e5 \1 t3 D. V
    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-7-29 01:43 , Processed in 0.672573 second(s), 51 queries .

    回顶部