QQ登录

只需要一步,快速开始

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

      l  ~8 k5 ~5 C  [$ X8 s$ P. o; w数学建模:异常检测算法
    " l' ?5 \: f, w+ D* {一、简介 – 关于异常检测4 f+ G" s5 f/ Y% b; ]4 ~7 y
    异常检测(outlier detection)在以下场景:' I1 H& a6 h$ S3 O+ P) D" v. f

    4 P, }2 w) z* q  C! U6 B

    / z8 ^* p- d! t2 g+ g. F) G4 a* {% c数据预处理$ k  @5 F: |6 l7 \  Z
    病毒木马检测; q* C0 d7 d8 u' o4 x  e; N
    工业制造产品检测
    $ V, Q/ v+ A: I. T网络流量检测4 S, B$ ?" G( j
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:7 M% I2 ~* c- D: u/ v; `
    9 ^  z# a3 H4 Y. Y: G; k

    + e( D* o0 c4 V2 f1 M4 Z/ @监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    6 c7 W; L0 |7 l- \# c& }6 k3 C$ |1 r9 f7 L( t2 W6 M' F. U1 O

      o5 @& n9 v; S2 B: P以下是异常检测和监督学习相关算法的适用范围:
    ; j' y; U' V; M. ], Z: W1 b* n  h0 s' ~" Z3 j% I
    7 p. I% z3 L" n. {$ H
    异常检测
    3 r4 P( |! q+ ~& t信用卡诈骗" n! \; z, a" r1 D8 ^
    制造业产品异常检3 T! [$ e! M& t& O0 W8 E
    数据中心机器异常检1 Q" f+ O5 q/ j; h, {$ |
    入侵检测
    + {% N; j: C' J. w  M监督学习
    1 k7 V% P- U2 t4 Z$ M垃圾邮件识别: f6 K& m# u: o; I0 p9 t+ S! h
    新闻分类9 u0 l8 Z& E; C3 d9 ]
    二、异常检测算法% P% a# c/ ]0 G" G

    6 Q# ]  s' y* R! P5 L' f8 U
      M) c+ |4 q+ J' {0 F
    1 z4 N% J% y5 O' U8 `% S  |6 t: m" f
    3 z; q% D: v( C6 W) a' W, A
    3 {/ @8 d9 R  `% J3 _0 g! P2 G5 Y
    / v% D1 F: {2 }
    import tushare2 \& q0 F& o; E+ L
    from matplotlib import pyplot as plt! c$ v% o& ~  g) Z. o
    6 X% `' r  ?# `% c
    df = tushare.get_hist_data("600680")
    " S( }- j! l8 \, M- fv = df[-90: ].volume% G3 W) v3 j) U* R) {
    v.plot("kde")/ U* L; i* m) |. E9 J
    plt.show()4 N0 y9 }& N3 Z" `; L  ~  `
    1; M& \# r3 y9 {1 `+ u
    29 ^; C' y6 u0 d1 V
    3
    % D$ b( X2 m, w# Q- W7 B4
    * p4 b, p# l5 }) C/ R* v57 D3 |  w$ a: \0 S1 V0 ]6 q7 y
    6
    8 t4 F7 M% s2 `8 m7 R7) [' A. K4 W- ]0 d- H5 u+ M# T0 Y
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    6 T9 h$ X, Z4 h7 u$ O+ e# M; ^: ^5 c# O  q* @1 }

    ) J5 H# x: U. ]( h- t) ?$ V1 f4 [# f& d

    / f( k' F. ^; y$ I3 |9 ?  Q
    $ _7 j7 s7 s& d1 q. [) H

    4 k* C* y, l- |$ E  Y6 U# Q) K% a. W$ b/ N; m

    2 x" B2 M1 j  r! v2. 箱线图分析
    ; E1 N0 q( x5 z% a0 P( |# k8 g8 |import tushare7 V: `/ h% m- d4 l
    from matplotlib import pyplot as plt
    $ |' b1 c' U- p9 A/ D3 x- L8 _3 X
    : J8 G5 z% _# Qdf = tushare.get_hist_data("600680")+ F5 ?/ }2 x# A2 ]; i
    v = df[-90: ].volume
    " J8 r, C" B' o3 {8 \v.plot("kde"); ]0 F; T) D! T2 N" {' F5 v$ l. ~
    plt.show()4 J$ _* K/ X* c# h3 I. W
    1" @2 h' S0 a5 x4 w0 L9 Q- q3 q
    2
    0 H4 ]+ }/ x$ k/ `* e0 d! ~- Q38 {' f) `3 }, `# ^. b- x
    4, |# r0 E3 R7 O! I! S
    5/ ?) `% k4 P* [* J, i
    6; R, c) g$ L# a
    70 {8 m$ V7 m& K* P$ q8 S

    1 l! J% o1 }8 ^% {# p; H0 D
    ; C  t0 b# _  M! s0 r& S
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!3 }7 \$ l- ?/ o/ }

    . [* @+ D. m, t0 P- l" X

    " _0 K, K/ [- b3 \  S0 u3. 基于距离/密度
    * m; E# a$ b0 X- O) m典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。' I" q" L' M* H' ^  g! R
    ' a( j! j, F8 ^% F; _, g; e

    + H( @, p" k2 u" E0 H) l" M$ y用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    : ~/ E% C- t6 N! F7 m& j4 p/ I8 ^# e3 t6 T+ O

    3 G6 ^! i5 H5 G5 A/ |
    9 f! r# w! y! d6 w7 S  {

    % X& s* d: b$ K7 V7 l9 e7 f; F! M$ O

    3 j, S+ V) C8 d9 K- \
    ' }5 Z; [$ D! I& m* R- M5 e

    # c6 W. e( A4 Y4 h4. 基于划分思想
    4 y  C4 d6 q+ E& n典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    ' S  S! ?2 O& R- V
    & X6 Q7 a: W! u& e
    3 v5 s0 n6 }/ q) W6 m. e
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。2 ~+ H+ F& `- U  h
    7 O/ e6 s/ l" Z+ Y  h
    8 Y0 L+ c; o- L- E
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    ( ]8 C0 g/ K3 m3 O) `5 |$ d
    & [! m# b5 q  P# b* Z
    / T9 L6 W! b8 N3 C: }* ~0 P! [2 f
    import numpy as np( L- ?. i: q8 S: M2 u9 v
    import matplotlib.pyplot as plt
    + ^" @0 G- R$ w4 S6 rfrom sklearn.ensemble import IsolationForest
    ) L0 X6 r+ l4 c, c) \) V7 t7 E1 C( R6 x+ U

      \& x7 _. M6 d" ^rng = np.random.RandomState(42)
    ; A4 G; L. r) T2 |9 D8 r' j( G0 t
    - F) [6 M; q# p8 F/ s/ h; F8 r2 p& b
    9 L4 G9 h5 [9 i9 K- _
    # Generate train data
    ) t: ]  d! A0 J. g8 [  |/ `X = 0.3 * rng.randn(100, 2)
    / j; ~: Z. y. X2 O: Y, p! oX_train = np.r_[X + 1, X - 3, X - 5, X + 6]( R" ^% K  k0 r# `* X0 E
    # Generate some regular novel observations
    # R4 Z, j- x" r% W# Q- Y/ TX = 0.3 * rng.randn(20, 2)
    & t: E2 ^, [$ H: LX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    0 g/ E; D8 s+ J# Generate some abnormal novel observations
    $ F0 T! c. r7 a# I' b8 P  y8 ^X_outliers = rng.uniform(low=-8, high=8, size=(20, 2)); i  L! m7 S2 `1 [  b! |5 A: l
    7 k' j$ C' s/ U1 y4 {( P
    . R' ^) M8 d1 B* R
    # fit the model. m" Z# |/ p0 p* I. o
    clf = IsolationForest(max_samples=100*2, random_state=rng)* G4 d  {; X# p- U, b- T" @
    clf.fit(X_train)
    # B8 P$ p' n9 q5 y' iy_pred_train = clf.predict(X_train)
    5 O# p9 h8 O/ S8 w1 yy_pred_test = clf.predict(X_test)
      |* H& x- y! `3 J7 G! m5 @: Zy_pred_outliers = clf.predict(X_outliers)8 {& I+ _* W" z. h" t

    % O# q' d* R8 X4 r1 s
    0 d5 x& A. v, \( j6 R
    # plot the line, the samples, and the nearest vectors to the plane
      s# ^. g! y6 g1 o. \" Xxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))4 u1 }' }  e  n  e
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    2 x& q: B9 i: U9 Q, LZ = Z.reshape(xx.shape)1 D  r; `3 H* i& F' k7 R0 M" `5 u0 [

    ' Z+ \% Z- P7 M2 R
    ' s7 h1 P, C% L- K# B7 R2 y
    plt.title("IsolationForest")  D$ W  I3 i( @+ R8 P* s% X
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ' [6 o; p8 T! s& f  ~6 S  x. y* x* p  {# W3 Z
      k  t  i( v' Z' |$ V+ B
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white'), r& F/ f8 _9 g' l. |! [
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')! F8 a9 W6 G7 q0 _& u  ]
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')1 _1 J# |/ ]' D3 e5 b# ?- A
    plt.axis('tight')
    ! W' x- N+ b: xplt.xlim((-8, 8)). x0 P4 ~# G5 L9 L: T
    plt.ylim((-8, 8))) g. B8 H. r( x, \& A; W
    plt.legend([b1, b2, c],
    ) E. {; }& j4 y0 ]' k! q           ["training observations",$ _. G- y2 S3 A* b7 k+ Q& j
                "new regular observations", "new abnormal observations"],/ N7 Z2 [3 [% `2 d% {
               loc="upper left")
    & \9 w  i' O) t5 }* l$ F5 eplt.show()7 F. k' m0 H0 t" b  I
    19 n0 ^; I5 B* J! {7 u- D
    25 Q1 \  U1 x$ w% |0 g8 s
    3
    & n  J* `- ~$ S! ~4* W; }5 h: V) Z( e8 P
    5
    , D; w5 C) R; _$ E- [  Z6
    & u) {8 p& V: F. o9 s7
    5 ~- o. L7 U2 i# M9 Z2 T8) ?, m9 I0 ?! r' r5 S
    9
    , `) S5 Z" y6 g2 T5 [10
    1 v3 E% W0 q- y11
    + v) {- q: l' R2 t8 \: O( r5 {1 S124 m' c5 c2 A1 h; Q3 t6 P2 e! E
    13
    8 J! Q8 \. E& U1 E( H  D140 p5 k, R2 s& @) ~# s
    15
    % V3 ], ^; L9 b. ~. I16
    9 j2 ?! P! [( j1 e( Z) ^3 [17* k4 p4 o: N' A; X, _- }1 O
    18$ z1 S$ O) a" k8 S2 O
    19
    - @" S4 w' J3 n8 Y20
    4 G( P% c/ \  `/ J  u& L* Q211 f. n+ d8 F* v# ^+ w' E* Z
    22
    1 o7 [) C7 U) g8 t231 }0 N/ o+ X( m0 |" o/ C" n
    24
    ) X" Z0 `# u7 u. |253 R' Y! P/ A! ^5 n, t- s. a* C
    26" Y; F# t' Q2 p1 ~+ B9 I
    27
    + u" q& L8 I$ k: K28
    # J$ d( n1 J$ f+ _: ^29
    1 t2 f+ [2 A4 [+ U30
    5 r3 W$ Q3 x& [, X3 S311 s) h7 G4 J' R, B  C. R
    32% ^! J2 x3 A/ Y
    33
    + `: G* S5 A$ q34
    8 _2 b5 C' N" D- Y( \355 a8 Z9 X# I( j
    363 L& q- M" K" {' t4 `0 j9 S
    37
    / b5 c8 G3 p: m; j7 k38
    - B( v: P; m, i39! T5 \( E+ ^4 T" Q% e
    40* b; d/ I) _8 S+ Z. i8 U
    41# s- X4 h) V) Y

    1 i$ j' i4 z( w
    " t$ V- x- H( ~8 O& R
    ————————————————% V7 d" @: _& s0 u* k
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! \1 {7 k- D, x- f! B9 ?' ]
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    5 f* s2 Y3 l/ o5 s' P$ Z' R9 R7 C( J! s" a

    % }8 w& ^. v1 U& 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-4-16 03:09 , Processed in 0.408991 second(s), 50 queries .

    回顶部