QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3948|回复: 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
    ) x% @. C# s9 U: H, L1 l+ z
    数学建模:异常检测算法* Q. W4 h/ A' Q: ]( G6 l- H
    一、简介 – 关于异常检测
    0 T& U7 J2 ?9 w! W异常检测(outlier detection)在以下场景:
    " e$ A( k) r2 s* a: {) X& Y, D& S' v
    ; Q6 P4 b1 x, ^6 x. Y; b' e
    数据预处理
    8 m0 G& m" R# {, F6 R病毒木马检测
    5 `: S0 C7 V1 s; }, ?! T工业制造产品检测
    + x8 i9 c( t( A2 G$ r) F网络流量检测( J' O1 w1 U& s% u% l
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    & A3 [4 k7 S( G8 _# y% K0 Q  J- l9 C- @+ J: M% {# h
    1 Z! i% M; B7 J+ @1 Q
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。  y  f( K) k8 M5 C; r8 k2 `! d

    0 ]  X0 e6 S/ k3 t' r- u

    7 e5 r+ T/ j3 h" a以下是异常检测和监督学习相关算法的适用范围:4 Q9 z& a1 Z/ h, k4 q

    ) b" b- @0 @5 b# ^4 a/ P# F

    $ F! H; N4 j3 o3 V异常检测2 ^3 k7 k- [  ]+ U& c) o
    信用卡诈骗
    * J8 L  i# {. n7 M制造业产品异常检
    . Z& J5 K$ l! G. J3 A" G数据中心机器异常检
    8 O* @, P6 e" W: I7 k+ L入侵检测
    5 s: `# z5 L* z# }# l! J) Z监督学习
    7 P1 Y/ G# D* S0 x2 v7 I2 }2 j垃圾邮件识别4 @: _4 G! _! i
    新闻分类1 h% o! |- [9 F2 x' A5 R
    二、异常检测算法
    7 i* S3 U2 H1 U% c6 A; B: y9 z" }
    ' r6 G+ i* M3 q

    ( R' D" ^8 B: [8 n/ d- w8 z! u% F1 V. w7 o
    7 \6 J  U9 ]" ]$ @- f6 v

    9 j) b  X/ g; y- M

    - X  q4 A4 n, J, s: k+ \% Mimport tushare
    ' f# h7 W' n+ m2 Nfrom matplotlib import pyplot as plt4 E, Q; h0 }, N" Q( D: D

    3 ?+ P4 }& {' g1 ndf = tushare.get_hist_data("600680")% L6 X& x3 U; J& J  u" h
    v = df[-90: ].volume
    4 f0 T+ X0 T, i9 s8 Y% T7 W0 P. g9 uv.plot("kde")3 d5 @9 ^7 g2 s6 o
    plt.show()
    6 q, z" ^! ^+ w, b1. k0 O3 B4 x9 Y
    2
    . u' G+ R8 |* C: k5 E" K34 D3 A; B7 M6 s* s/ s! w) d
    43 |# A+ P  w6 [9 Z' G
    5- X2 r- H2 [3 g" P. U3 K
    6
    + F6 u, _, ]  ~8 g* M7: z9 q( v) }( V* f6 W( ~
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    6 v  o* v& D; T! u  z
    2 y6 R4 C3 I! @+ S; A, f# d8 Y& t

    " s8 J/ W1 d9 G1 q$ m
    9 _, e: h  L5 \9 \
    ( `+ W  |% ^, p1 P
    # |8 E! Y9 \: i( g, E

    ) C$ Y9 c; M* a5 `( F) g1 w, f3 B: @8 N4 l' k) \; J
    - T& ]7 m: ?/ Z! |
    2. 箱线图分析0 L2 N) n# d! N. _; P- H
    import tushare0 T2 q/ [: U7 j" m( o* O* ~* F9 _
    from matplotlib import pyplot as plt; v5 C3 y, Q6 e/ [% T! W0 @1 q: p
    ( ^) a6 x0 P* m7 @9 ~% D2 t+ w
    df = tushare.get_hist_data("600680")) P8 ~4 C1 `. V' D2 }8 T
    v = df[-90: ].volume' C3 u8 Y" x* U' |  v
    v.plot("kde")$ W  N4 |: R* {7 ?- m$ t6 F/ T/ T
    plt.show()
    2 o) b  a+ g7 v, @* N+ W14 Y1 }3 n4 m3 Y9 D( u$ e; \9 M
    2
    " _8 h5 i, s, @6 l+ D% u7 A9 x3
    * Z5 E! I* S: j% r4
    # W: {: k( O. K+ ^& ]2 u$ f3 ~+ k0 [5
    & `+ v6 _, @" q% I" [& [6* Z! N" {3 ?* ]# @7 s' M
    7( F1 ?6 l$ P7 g. c# g1 T
    2 P3 }2 M- g2 H6 q) k4 ?

    ; G" Q7 [$ }2 f3 ?9 S3 [大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    ; Y* v7 w- j1 D. ]- d2 Y6 k6 ~2 p( x4 G2 k2 ?+ S; l
    ) w( c$ {! S* F4 }6 [- A
    3. 基于距离/密度
    " @" n* X; D0 B8 ^' L% j* ~" M8 J; d典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。: ~& u3 f$ l" d* [: t
    & F+ t1 N! o1 g8 M
    " R$ {( V) o- T
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    + {' t( g* d$ g; }7 a+ k* O$ n  H+ t

    * s& O; X# z" r$ ?9 }/ p* `0 v7 M. t
    5 w1 ~  L$ i7 C" G8 N$ Z. {

    7 R5 F2 n" f) S7 F. Z

    1 p; O# s( E. B
    ; ?' I& o6 l6 ^
    : l& a! Q; O9 H" Z1 O& B4 Q
    4. 基于划分思想3 b0 H+ K: g$ D6 p" ~' e
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:3 |, [# y! U  S, d, \
    - T/ t6 f: r) O  i
    ; S, Q2 v  U, a  R' L- R1 O# d% `
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。0 k7 B+ g' i' k8 U

    / C+ y# q7 k, G5 K  Q" w

    . Y9 Q- _! j3 H% L这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    # @: A4 B6 X, |+ [$ B' l. x' M+ H5 O& N- N+ A8 o' R3 ?
    7 U% @0 [! v% ?, N+ y5 s
    import numpy as np
    & c' p& z8 W/ c& k6 @import matplotlib.pyplot as plt
    6 k. i( ~+ y8 J  Ofrom sklearn.ensemble import IsolationForest
    . F9 F$ B% `( B8 R( h& ~
    9 b" i1 r# O7 G: y
    $ M$ g9 V! g/ C0 c% I5 v2 a
    rng = np.random.RandomState(42)# e- L! V6 w8 X7 k8 q$ _- A2 l2 @6 b
    ' |# I& u' h2 a9 z: r1 s- s, G
    5 }$ L& o; u% H) M# t
    # Generate train data; x2 g4 R: G! w9 w: p3 L+ q$ m3 ^2 h
    X = 0.3 * rng.randn(100, 2)+ Q# B" A. z6 R8 T% E
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    + T" ?( r* S9 [. P- J# Generate some regular novel observations
    4 t+ P1 c( W, {& ?: d% dX = 0.3 * rng.randn(20, 2)
    ' F% b, j2 D5 e. V# dX_test = np.r_[X + 1, X - 3, X - 5, X + 6]4 Y2 q' w- @) Y7 c' b
    # Generate some abnormal novel observations
    - H" t9 n) q+ q+ gX_outliers = rng.uniform(low=-8, high=8, size=(20, 2)); F6 d! z8 n. z( Y) z

    $ Q% a/ C; U; Y7 j0 Y7 O  r
    ( O" M! r5 U( {: H  l( _
    # fit the model
    , B/ d9 c, `7 ~clf = IsolationForest(max_samples=100*2, random_state=rng)
    * t8 V/ R. F# C2 h; c7 P' Dclf.fit(X_train)
    8 p9 \+ w) N/ t7 K: E* sy_pred_train = clf.predict(X_train)  e5 t* E; f8 a! s1 @, q9 y
    y_pred_test = clf.predict(X_test)* u7 J3 ?9 g4 E3 C# B9 T' R
    y_pred_outliers = clf.predict(X_outliers)
    # Q7 a7 A% d- r3 c5 K6 z* L6 _/ k- W* X3 j/ C3 A( F3 r3 F
    % r& Q; f1 N" U- b) w% y& C( i1 P
    # plot the line, the samples, and the nearest vectors to the plane
    ( m, ]8 `5 ^* K  {, Q5 R% j3 Hxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))% Y  k& t9 |- }' |
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    9 U3 g' n8 R4 C; YZ = Z.reshape(xx.shape)
    " r$ q3 u" k! K5 f' ?/ @6 M: t
    , c3 I1 C2 [2 Y( t
    3 s- ^) I+ i8 a
    plt.title("IsolationForest")
    9 ^1 s" d0 w& w' w9 \plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    & r( {( t/ X% A) n" s1 q5 ^4 ]5 j0 C8 _2 j

    % O8 ~% V5 a3 db1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')- ?1 e2 }/ ~$ _( Y+ ?$ |
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    % G2 v' j- P  t+ C3 hc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    % R3 D& ^, X2 ?  l: V0 S9 aplt.axis('tight')
    ' }, i4 z6 E. I6 L; l% oplt.xlim((-8, 8))! W. _/ E; l  a( A! j
    plt.ylim((-8, 8))# S8 f4 D+ E: Q1 U2 {
    plt.legend([b1, b2, c],/ m. b7 ]7 L6 W- T
               ["training observations",' D: Y* m) o  e/ b0 Y; \2 J
                "new regular observations", "new abnormal observations"],+ W, S# B% q) P: v9 O+ q
               loc="upper left")
    ! m' d+ M- n5 hplt.show()
    . b6 ?% A$ n* {& ~8 Q: d) D  S1
    5 p% ~% T- O' v  H" q+ J2
    ' Q- l7 w8 Q9 k8 F3
    5 L* }7 ], E; C( b0 k+ T48 @0 {+ s" F5 H7 \0 k
    5
    # y4 y" `$ U& D67 A; S, B6 P+ C) z4 A
    7
    $ ?7 [# W. Q1 L6 V8
    + R6 E9 \& I3 K  a) A9
    ! S4 {; e; m3 r8 `' ?9 d10: z+ \" g6 G/ B8 ?
    11
    0 x0 A3 M% v: t& Q- X2 p  T12
    # _: ]8 a6 y1 g* o4 P# i  e13
      \# J; a% J8 e3 K, @, s6 L6 K+ b) i14" U7 p3 N4 {0 Y
    158 [$ ]* I3 ^: v* }! o
    167 y( m& y6 p  P( J! u. O
    174 X4 T' Q( x. g0 \- n
    185 m7 X6 O! m+ Q: Z$ R, V' w
    19
    9 I% n9 |6 s7 _- y% r! r8 G20
    5 p( }2 b$ X7 G( }21
    8 k" a3 U  m7 Y" s5 O  Q. Q22
    1 H7 G6 E, H- t' ^8 g: I: y  ], o8 X23
    + g9 ]6 j: w# l$ D" X24$ |# p5 S2 @5 B/ \) x
    25* H9 u: V' E7 Y/ U
    26
    $ C& s6 t' D# H4 C/ |; k27
    ) e0 d8 x1 O6 o* p; r' Q; Z282 W' x. x7 K, g( }
    29
    ) {# z/ D1 g" Z) U+ l  r" @5 H30& Z3 w: L! f" U( M! W
    316 B/ X/ }# ~1 M$ Y" `  r/ n
    32* }3 a% r& m! }! X
    33
    2 s9 U2 z( B7 L# A8 {9 {34
    3 m, U  v. X  H7 h' D3 I2 _) U* q35
    ( a6 W/ F. t0 e& D" {3 h) |; x36
    / J) O1 P' @3 B37
    # q5 X2 }) l' L' Z  f2 Q. U( Q38
    + \0 J) e3 j' z, }39
    2 y( C9 E  T. j3 S# o40/ v$ Z/ {! K( y2 x' |" R
    41
    + p" f, F6 G7 F* t# K9 Z3 S
    7 h% z* ?2 [' ?: O

    ; v' Z- B( j- P0 H————————————————% ^  K- ]# s/ w4 c3 M
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 l5 j- P& ]4 }3 t! U0 q# Y: f, X9 O原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    ( X) K( d3 J4 N4 Z5 K
    3 `" M7 C0 [& e5 `- K/ |5 F4 Z. [5 W$ B
    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-26 20:10 , Processed in 0.410707 second(s), 51 queries .

    回顶部