QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4001|回复: 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
    9 |. L* H6 O& ^
    数学建模:异常检测算法
    & L2 w5 g" a: }4 K: |- N6 a一、简介 – 关于异常检测" l4 @# g+ }9 ~$ f/ t
    异常检测(outlier detection)在以下场景:  }$ O0 n, J7 p# n
    / o/ r$ H' |" i, @# T" S

    $ t, t3 b6 v3 i. U3 t数据预处理
    * a* ]8 _4 U/ l# E. H, X& p  \病毒木马检测
    . a9 ~: Q) V) U, j: h; N" {工业制造产品检测
    1 t4 H" @& e+ m$ z4 f- j6 V网络流量检测$ Z1 g/ v- I$ F$ ^4 l* B' U
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:* [: d0 t  ~6 ?

    $ u" a; f+ e& V; Z* K4 J0 f8 G& ~
    : L3 M2 I( T  n+ ~# O" |$ }6 r
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。0 ]% r6 @! F5 R8 s* {. o; P4 B

    6 ~" l: A: O, w* P7 z( g

    . b  W$ n( I8 ?) a& L) O以下是异常检测和监督学习相关算法的适用范围:
    , M8 r$ i& z8 b9 p4 ^) b( C- }! H% L8 ?% I1 y" X% O

    ; F: x" d8 l: S2 j异常检测- D1 x4 ]+ p; p' _5 W4 A
    信用卡诈骗  a% u* t# D" }
    制造业产品异常检
    ( W$ U; h1 [8 Y' d4 ^  J数据中心机器异常检$ k% C6 }* g& K$ l; Z& J/ Q
    入侵检测. `% a/ [) Y1 N  x/ |0 |* I
    监督学习
    / ^9 B+ I( o6 d' H$ a7 a7 t垃圾邮件识别) C* E6 W% Y, m
    新闻分类& x) I4 H4 f6 e* }( p, B
    二、异常检测算法
    / p# ]$ x; J4 ]/ G; m. `7 O- Y) E+ q; r3 [! \* k: g
    4 y+ Y' i1 b# y
    ' o5 f' S. Q* j6 ?

    " V2 F) _9 @+ n& A, ^& W: p
    % o: X# t# [/ z8 f1 {

    ' E* s6 ^3 P5 ?7 Eimport tushare
      t( Z( ~) J9 @) \; @# r% ifrom matplotlib import pyplot as plt# A$ F! s) m% @- \! }

    + i& D' d9 g: [2 pdf = tushare.get_hist_data("600680")
    4 x9 W2 f( o1 o. `% ]v = df[-90: ].volume. y! O& v0 @. U$ V0 f1 f4 s# F
    v.plot("kde")
    6 Y4 C% P# B, dplt.show()4 d2 R& E7 U& [: Q; b9 Q( ?
    1
    ! p: d7 Y2 i3 u29 l# f' k$ s% x5 Y$ s6 d3 ^
    3
    . x/ a# X9 E2 ^5 I& b7 i, d4" N" z8 U( M: L7 {* p: T1 [+ O
    5
    8 h5 h$ {) b& f6
    + t) X5 l6 d! t/ ]( _# H0 ]7
    ) y% S# P2 X  L! F7 |0 ?2 q近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)' F$ G; f- a/ G7 H% h1 ^' J/ Q# B
    ' \1 q( b' r$ K2 R  r  O3 W. q
    1 N) q7 Q) a8 N8 o
    ! Q. M. d: y5 c1 i9 g. Y/ V$ {

    ) L1 S% U, H) w, p8 g5 J# \9 B# X0 ]. G

    * a' _. `9 M/ D4 `5 X* N& w( Q" c/ T+ g3 H. d

    5 q  U) ?( m  I5 ?4 q) c" J. q1 m2. 箱线图分析- J5 k) d" f( b- F; ~
    import tushare
    % O3 e5 @2 p+ Bfrom matplotlib import pyplot as plt
    * K2 s, I3 K  `' D( _
    4 j' G5 Q( k  E- f) @df = tushare.get_hist_data("600680")
    % k3 \! q. Y; r* I. U. h: A( I6 ]v = df[-90: ].volume7 u, E7 p6 v& l" c4 a3 x9 `
    v.plot("kde")5 q  ~9 |' r" x" A2 ]0 }5 Z. C
    plt.show()
    ' ^' \3 E! f* C- w1% I! n6 k4 a) B: A$ a' @, L% w
    2
    ! n8 K' s% _$ S$ _8 `8 ]3# T/ M1 x9 g' n- ]- ]
    4
    # m9 i4 M$ H% \5
    ! T9 K4 V; Q- ^* B* d& r# G6  U2 _4 V( E2 v9 f+ N) o1 B
    78 {" C0 u/ e2 ?. @: ]

    + W0 g' y7 |2 Y# X

    8 f' e; O1 i* k& L7 Y$ M4 l大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!$ V, I2 R, e$ f) k* F

    ) b+ S$ h6 P: v& E# L

    1 h  @  d& j# j7 s/ ]5 a. }3. 基于距离/密度/ m( O* Y* Q0 s* X% `  I
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    : j+ x% x; s4 t/ h6 b
    - _/ [9 ^% B) R- {+ q
    - v7 C, l2 q# ~7 ~
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    6 b; }  e4 \7 n/ A$ m# `9 f" c+ g# b8 ^) l0 M* ]( i( M6 i

    # j/ Y) N; Y, c* {8 L, S/ ~! Q) m- V! A' q! @' I6 i. d/ v, W

    - Y# p; g6 @8 t1 w2 g' y2 i
    ; T+ D* m& @( a

    # a& a! {- b7 D. v% s5 ^9 P2 k1 X+ a* T8 H1 E) ?% D$ T0 f; h

    ( E7 k/ V- H5 q7 F. [4. 基于划分思想
    6 j! g2 A7 O/ P1 O) B8 e3 p典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    ' v2 w/ D; ]# M" z8 u, g$ E- z) n
    8 T; l: n) o3 |$ _7 ?) l4 |
    ; P) c: k* ~) h0 \
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。# `, _1 p) [' B  q

    0 }1 l) \0 f. s% A6 `& }9 w) ?
    / R9 g  V2 D( ]+ P( _
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    * H% ?$ }7 M. l+ S" G/ Z* K. z0 s; c$ Q6 |3 @* V2 w* i( Z6 }
    ( [- m5 p. H$ B% l( l
    import numpy as np
    ! Q+ j7 B& d1 ~import matplotlib.pyplot as plt. ~% D; m% y8 q9 P
    from sklearn.ensemble import IsolationForest: z7 {* h& M- B' x0 K, v7 |

    0 s& v) U& b) H9 t4 `

    - ~% N, B: ]  _/ g) c9 b2 Srng = np.random.RandomState(42)
    3 a* |, Q9 t: U: e/ g' Y# g% g/ y
    1 d3 B7 N: E3 C6 C

    / t" p! A1 N% y7 A1 ?) f# Generate train data- M4 Q# M6 n9 U. U: i3 p
    X = 0.3 * rng.randn(100, 2)
    9 a- z8 P- C# G4 jX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    - h! N( R; M% j# Generate some regular novel observations+ w; ^0 w1 t2 U1 d$ Z5 B3 x1 Q& Q8 P
    X = 0.3 * rng.randn(20, 2)% q2 k9 X7 p# h. U% y* _
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]" ^( R1 N+ s+ _; I# i* Z
    # Generate some abnormal novel observations
    4 I% d. b  h, `4 mX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))- A! Y7 i1 I" b5 Z- Z! \- g: ?' v3 T
    , g1 ?; K7 R+ r2 Y% T- P

    2 N! }" ?( H/ ~; g# fit the model
    ) _" l* H9 x7 o9 n  ^# g! tclf = IsolationForest(max_samples=100*2, random_state=rng)+ ]/ u3 G# m8 n3 w: l- f8 ]+ V
    clf.fit(X_train)
    6 [! f5 [9 H! z* K- `* R! Gy_pred_train = clf.predict(X_train)
    - }! \1 c" C+ T. ?1 X( Oy_pred_test = clf.predict(X_test)$ D; f  k1 ^- G; A6 S+ I: u' D
    y_pred_outliers = clf.predict(X_outliers)( x9 P! c% Q4 k# }1 |

    5 c  \& W2 Z, @  b% `
    # v- L4 a+ M1 C4 g
    # plot the line, the samples, and the nearest vectors to the plane
    9 ?: G3 S4 ^' [/ J. I- R; ~xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))* e5 Z( p5 C6 s1 Z1 t: B# B, f
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    ) e7 b& x* R5 e+ FZ = Z.reshape(xx.shape)3 _7 K/ f8 r& @% K  p

    0 w1 p" N( [# g* E4 }* X' U

    - V- f2 \! K# Vplt.title("IsolationForest")
    - Z6 i$ y4 @& O( Q$ uplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)7 y3 C& I: f/ E1 j" e6 r

    ) m( Q2 z0 u. }5 O0 [
    9 X' t2 f4 b4 `0 \! l
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    . J: P$ e& O+ v/ _* }4 o9 y5 Hb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    % W* v7 l, }  sc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    * U) a, N" g9 f/ \' f1 N8 Pplt.axis('tight')
    - C  M0 P' Z9 Tplt.xlim((-8, 8))/ Z, L1 Y% {' X! n. Q+ D. M0 m: ~
    plt.ylim((-8, 8))
    % R7 q0 x+ R) u/ F5 Aplt.legend([b1, b2, c],
    % l$ v' M. `8 U: O1 J* I           ["training observations",
    ' P  ^5 w9 k. R: U9 [            "new regular observations", "new abnormal observations"],
    # ~' R( f- g' b: P           loc="upper left")* c7 z3 b! n6 \! o% t8 J
    plt.show()" M. [' R% _& I# z" U+ `/ `
    1
    * o$ D3 R' R$ e/ O/ L2) n7 K2 L! u6 ~$ N
    3
    # W1 l* r5 a; D! y9 z. L& L, ~5 [. i4
    ' N6 a* l( A3 b5
    * m( c) k6 U- i' h0 P6
    8 _% i3 }/ @5 X7
    . c9 O/ @" M/ W: d82 N+ g' a8 _: }) Y
    95 ^, Q' E8 h; `6 `2 M6 }: G. l
    104 M" z/ h- t7 P9 O$ {+ O( y7 ?# ~
    118 t4 v+ y* f2 B( F' ]2 u
    12
    & ~/ X9 M# s7 o% ^: T4 e0 P$ w/ v13! k2 Y# Y0 ?6 l/ ^% _# v- _$ G! B: {
    14
    1 N5 I5 k1 U; t' U" t4 y4 b: n15# J3 y/ H+ E/ M) s) c
    16
    0 ?0 t8 o+ w7 k- L; S17
    ! s6 o) Y" ^7 B' Y18
    3 K8 q- }( S  B) i19
    0 f5 H; y" H% A200 q: h0 ]5 e, F3 L% ]
    21- D% r9 U" k* R% g
    223 e2 [' u  e9 q# P0 `" B* |3 ]
    23+ Y: K  Y- a& @6 T4 y% l% Q
    24
    ! j8 n1 m& `6 P! b; S25
    + ^( B4 I8 m0 N2 D" `  ^; E26! H7 B  c; z+ p* w/ v/ {" f
    27
    - f6 r6 Y4 L( T9 n3 \' g6 t! ~: H28
    ( ?" C7 r1 Q: F29
    & i. D& d. g4 v4 {& K30' n9 s: Q1 h/ z5 z# y& i5 ~
    31
    6 }, p  J! q8 z+ g* `6 n320 b0 z; J( f5 V0 m
    33! e6 V# j2 V* Q" Y
    34
    , q: N. R4 B/ z  }) H: d: l5 K3 d35
    3 M5 d& M; E5 _. Q" M# \& p+ T365 T; K" x. `+ |- p4 `7 L. b, w
    37
    & @! }2 a! h- g5 r3 y0 t% v3 }  W38
    ; q8 O7 u+ |  o" X/ C6 @39
    2 L2 x; l  Q2 r9 a8 G% G40" H* N  X$ d- Q, l: t
    41
    3 [8 F& t* g/ Y5 p( t& |
    + @+ k& e* m* u) z# z

    , E, v8 I" K& S————————————————, i$ V' G: B4 @# r- H& `6 r
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 c& |8 s) i8 ~+ b1 o1 f
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231293 c2 m2 i7 n0 u/ k& |

    " E6 Q) n( t# q: n& y& m
    % \7 g9 U" Z' z0 b2 r2 g
    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-1 05:04 , Processed in 0.330769 second(s), 50 queries .

    回顶部