QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4041|回复: 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
    , n* d1 }, p9 z6 b& M
    数学建模:异常检测算法
    ' v8 V" |7 H: b3 N( `" L一、简介 – 关于异常检测
    * z; b& F! S5 ]0 W/ ~* {, K异常检测(outlier detection)在以下场景:
    , W+ o$ ~8 c( C% u! X3 M
    # D6 t) Y. J  W# P1 Y5 Q
    1 ^; P6 j0 V6 z" Q
    数据预处理/ L# Q! _' ^# c' u: X  A7 L$ D
    病毒木马检测
    # Y0 F& u1 {7 }" J$ p工业制造产品检测
    % v( }# u) [( {' i6 @  T网络流量检测
    ! w1 w! D3 x% }2 q! N) g% U等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    ( X' @, b# h& m6 T" a4 O
    ! z4 d- e( s# H
    ! R/ t3 ~! R. C
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。$ o; B- m4 W$ o( \  M1 i+ d

    , i6 Z$ f7 [; _# t4 Z% R# ]) ^

    5 Z+ }3 Y1 k, }& K以下是异常检测和监督学习相关算法的适用范围:
    0 x* b2 M0 q$ h' M  Z: V9 W' F( Q8 T. S6 Z/ J* F. }
    ' l# _. G% ]" `: @* W. t
    异常检测
    7 ~( K: F: v6 L( V信用卡诈骗2 M9 l) n- X5 \4 j
    制造业产品异常检
    4 ~, x+ u4 ], R8 [数据中心机器异常检( u7 @' Q, f( e
    入侵检测. F/ M) V6 r% S
    监督学习
    + y+ c2 m2 W+ {7 X  V垃圾邮件识别
    6 E/ p8 F: ?2 N& ~4 ^新闻分类: M  l, T( f$ I  |
    二、异常检测算法
    , o1 I3 J! g: Y# y* a2 a# z% H- C

    / S; u& S; X0 o% x. ?, {  T/ C* W
    ' k9 Y% w( f2 j0 y

    ( G  F* S9 c3 @, S
    2 q# d9 b' s0 q* N

    3 I8 E5 q. H" Ximport tushare# E- |/ c7 S' t1 x
    from matplotlib import pyplot as plt/ ]% M* B1 ^: i8 H
    % {( g% E' }) c( [3 M
    df = tushare.get_hist_data("600680")
    ) i& [7 o& C2 E9 y' \) Z* Kv = df[-90: ].volume- [6 B( z# C* U% H) o
    v.plot("kde")
    3 H/ P) M5 C3 }. U( mplt.show()
    4 l$ H  G6 u$ G! H/ Z/ c6 C( `$ y1
    ) l. n5 n  l) a* G: W* Q/ k3 O) R2
    7 @9 v6 R" P6 m8 ]0 G30 H% y4 I. J1 f
    43 z6 V% I' {2 Y- M- I
    5
    $ G, x& m" j6 u5 _1 j2 g, M$ D0 X65 ?8 d  `, e* T! }0 G1 |
    7
    9 g* q4 u6 q5 }4 ]% u0 {; Y, x$ v2 q近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    2 f# X, U/ A2 X: k, ^7 E* A: L1 b1 T0 m9 p5 V: E( V  {0 B0 W2 i: Y

    * P" ?6 ~4 {. V1 }. \0 u7 {' K7 V, i  h3 x9 p6 `/ o# |; @0 x9 o+ ]
      S/ q) y6 Z4 Q; t$ \
    % T) P2 v9 L1 q, B2 [+ u4 J

    2 W" a7 Y0 f$ K/ d3 }( V9 O) ]; S1 D: F6 h" v% V; U

    / `, n+ u/ _: g. @8 A; R2. 箱线图分析
    4 }" {$ `5 _2 `/ o& Nimport tushare
    4 s. E+ x6 O; s0 W8 Q- `' ~) }1 ]from matplotlib import pyplot as plt
    - \: C7 ?. X  V" h. _ / l; e" G  T- z
    df = tushare.get_hist_data("600680")
    , X5 v% ?& Q+ T8 Iv = df[-90: ].volume
    $ |6 l0 B0 d  o2 W0 s8 |0 @) jv.plot("kde")$ g4 T1 G: M7 D5 M- a: Z
    plt.show()# U( c  _" ?7 i5 {
    1
    ( _0 _0 k$ _8 ]; v+ Y) {) a2
    $ F$ u' O% O/ n( l: z3 o30 ^7 A) {# _, b
    4
    % c' J4 @' c, q5+ X1 U) f$ ~" [9 m% f- d" g9 _
    6
    ( Q  g  k7 D5 [+ g( U7 F7
    0 P$ j! }! J) h6 c, D$ p/ O2 [6 N. q+ Z) G! n5 Q

      J* i- s" M" E大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!- }2 I3 [% i) V$ n: V, R- n1 J9 _

    , N9 o2 b, u4 U3 Y- B- o0 ^8 Y

    ( W" h! l- b; V* E9 c8 V3. 基于距离/密度0 O1 h. g6 @. q* E
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    & `, F4 E. b# Q# T! l6 D! s2 r  E1 \2 {/ r( ?  V& J% Y
    + q/ p, @& |( u. ]/ M. B2 \
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。2 W8 V" Z# j' N6 T, h9 b

    $ {* V& Z1 O: o- s. u+ T
    8 \8 O* Q* a, C% I# v

    " W% U  E; H2 q9 {9 z
    , S+ P9 v. p1 i: N6 Z7 l$ `! u

    : x$ }6 B7 i' s& \, w
    8 ?! I5 j3 M6 R, t+ b* H- z
    7 T2 H. o2 D' Q

    7 S  I0 z  S# u4. 基于划分思想1 o! ~, T6 f/ m  _
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:/ L# o6 I. b' X5 K% g% u7 E
    1 H( O- Q/ N4 ^: w! V
    & r1 t5 Q- q& Q& D; I- z1 i# y( Y
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    9 f4 `- L# F" B7 F( j+ m% E. B0 c" f* |

    7 R6 ]; O2 J5 E% W: P% M这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:: u0 ~4 `# e& \( _, Q
    . x9 u  M/ w  q; @
    ) D: D  F5 K4 v  z" g3 P3 R$ F2 n
    import numpy as np
    ( j4 ~9 x# d2 L! _import matplotlib.pyplot as plt( m* D' I5 T* Q
    from sklearn.ensemble import IsolationForest% ~) ~& `' j6 f  _& {
    4 @- P. W% u6 J* Z
    + q+ Y/ z+ l. i8 \
    rng = np.random.RandomState(42)) O" i; ]4 A( Y, [7 H7 d2 i/ Y4 I
    $ |: N' D2 E: _, D! @
    7 R+ ~% Z) g$ h, Z
    # Generate train data: e8 ]& I; e- C- B- W
    X = 0.3 * rng.randn(100, 2)/ {7 U5 T1 ]+ Q5 A
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]# B1 N; e3 w7 C7 t( ~& o
    # Generate some regular novel observations
    ; T8 v) d# t: p  A7 SX = 0.3 * rng.randn(20, 2). e: \! h7 S2 Q& t: B2 r3 x
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    ! \- [' j2 Y& r: k# Generate some abnormal novel observations- i2 k- f3 W2 _/ ]: r
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))* l0 Z: q: _& d; f9 J
    , @' a# U4 J, X

    7 S  Z; k# y* B& `( A2 Z# fit the model
    0 o0 w, [& v2 |5 nclf = IsolationForest(max_samples=100*2, random_state=rng)9 L9 J( j# m+ h  r; `* P& _
    clf.fit(X_train)
    4 w, J! ^0 K2 W  V5 m7 T5 g1 \y_pred_train = clf.predict(X_train)1 i* ?- s, }: B: x6 F; a
    y_pred_test = clf.predict(X_test)+ I- J  F; T3 ^/ V$ ^6 k. _! F- t
    y_pred_outliers = clf.predict(X_outliers)2 h; ]' c. G1 j5 N
    - b3 A5 h1 j1 M" }! |8 W2 H% N
    % b, b8 F2 o8 K, A% \
    # plot the line, the samples, and the nearest vectors to the plane* v( s0 h4 }$ s% w$ b4 P" y
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    ( A4 {9 Z) O( ^6 ~* h, T8 FZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]); ]3 N3 s+ c. p# X/ K% O! W9 y: l3 d5 V
    Z = Z.reshape(xx.shape): w$ H; R( L  P! q! o* W8 E; E
    - _: Z6 J. o2 ~7 A
    3 ^/ z5 w* v6 x8 C
    plt.title("IsolationForest")
    " o3 F" _% L, J1 l7 l) {' xplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    8 Z' e, w9 f! `0 \
    " F, B# ^" t0 l3 R  u1 s2 c* h

    $ _9 b  l- j( Wb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')0 B1 ^% }9 a* s! h0 M7 y7 S
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')# J, p2 D" V  j+ D
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')% P, R5 F# ]4 J0 O6 \6 t3 ~. E
    plt.axis('tight')1 [' R& }+ v6 ^' r: z
    plt.xlim((-8, 8))
    5 {/ O1 y+ V* Eplt.ylim((-8, 8))7 s% L1 X* r- @
    plt.legend([b1, b2, c],
    " i/ h. t% F6 z+ a           ["training observations",
    5 Y* w* d. P# g6 r3 p            "new regular observations", "new abnormal observations"],# B& o' J% h9 U  l0 y! W
               loc="upper left")9 M& U& y& i4 W
    plt.show()
    - |9 [+ o) J4 ^: {# c2 F# [13 m+ j* t* N; v3 p4 }
    23 t# o9 Y- K) {$ B4 I5 U4 R' ]9 ]
    3
    - w. _/ V5 m* a2 `7 ~! v4# s  P: Z, x* e( Z+ {) k
    54 a6 p  O/ B  x: Q: K' L; c1 C1 t( |
    6
    5 b9 N! `9 X! N) U* ?7
    % Q' F) [9 z* H  p4 u8
    # O) ]  D4 c( o. c9! K) f$ a* j) [/ \  c8 x
    10' Y, t: n; k6 A1 ]' a
    11
    . d8 K. m9 E1 j. C12  U# E: X& b$ z# M4 k
    13
    . B# P6 U+ p' _% T14
    ) ~  j; k' |/ s; W% z2 F15
    $ Q! e! ^7 d$ F( l* [3 r: t161 W4 T; j7 I3 C- W, C
    17
    + \$ R* f- h  e  S$ D( W18: m5 j7 W7 N! K2 r4 K$ @
    19; o) s; u" R9 t- N- f
    202 T! V; }( z0 S/ C  `
    21# J# y4 c6 \/ p( |. _
    22
    . h2 C7 j3 Y  E' \# H3 w$ B! K23, \0 k8 V0 B7 P% @6 G5 r; x
    24! o; `$ P& v' P; z" h
    25
    : \% g2 ]8 c' H26
    - z4 J% {& v+ Q, `8 k27
    9 [# _- ]: r* \  o289 A+ O; W/ I% S) ]2 g3 e
    29
    ' N) A( Q  F9 w* n4 C9 C+ T; v30
    $ J% b0 t( Z5 F7 r4 n7 |5 u31# I$ _  B' a( J
    32
    : s& h* n! C7 t% L- u33
    + m: Y7 A4 l1 R3 w  n34
    , ~1 o$ Y" [! h% N$ E35. S/ z9 g+ d, d
    36
    0 [  v* ]  d2 i  E37& C6 e1 H* Q$ l# V/ H7 \' b
    38
    " _+ s" B4 ^9 ]4 j& G1 x. a7 J5 l39: d2 y. A8 }. d( {1 R
    404 U4 h/ E6 ?$ M  v: ]! _
    41
    . v" B7 i! v" f) `, P; i, I4 d) M* I" [; Q9 x% S

    ( }( T: y1 ?- y5 }3 G/ W————————————————
    ' W0 F& o- ^6 V9 c" L. a+ G版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. R! ~# |+ n2 ?; S2 ]! {% ~7 g- C
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231292 N, o+ j3 V1 ~

    7 u2 ?0 E& E8 G% W, o( ~
    4 T$ `7 ?+ k; p+ }' i
    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-9-28 04:30 , Processed in 0.310334 second(s), 51 queries .

    回顶部