QQ登录

只需要一步,快速开始

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

    - }& j: G. h0 O! Q数学建模:异常检测算法
    " i$ ?3 o# ~/ v一、简介 – 关于异常检测# t5 R) o; L; c' H
    异常检测(outlier detection)在以下场景:+ {6 j/ q8 X0 y$ i* T" Z

      A% R$ F5 R% A' a1 w' V& a2 d1 [

    * c4 l6 _/ r7 [0 c8 k数据预处理1 B2 K/ v# F$ ]' l( y2 b/ P
    病毒木马检测: \5 O7 T, E' N) R, d
    工业制造产品检测3 T% M9 a3 Y1 y% y! e* M
    网络流量检测
    7 u; ^. Y: n/ ^& f# s4 U等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:/ P6 O9 @7 \. k2 x+ [4 L

    1 F1 Z5 s/ V7 Y$ B4 _
    & t: o) C; l! R2 V6 u
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。4 w, v- z3 J  G8 t" W; Y3 O+ e
    5 F8 w" @: v8 p1 E& J& _7 m
    + q/ m9 i5 w  G6 x1 h$ w
    以下是异常检测和监督学习相关算法的适用范围:6 L* u2 T/ M, n# P
    ' C$ b9 {6 p: Y
    * a) _' K  {6 w' I) @) J  i, C5 |, J
    异常检测  A! x5 t- @' ^4 p* M: s) a
    信用卡诈骗1 m6 U5 E+ M7 ~
    制造业产品异常检
    4 i& c5 V) S. B$ g数据中心机器异常检& Z7 u2 C+ ]$ l! T
    入侵检测
    0 e( ?5 j6 A, ]/ ?$ }' n监督学习
    ! D; @9 k5 M8 z, ?& j- t垃圾邮件识别
    ( u% e& f& E7 o8 B$ c5 g' ~% k新闻分类
    ' j% v) [- ?' p" R3 W二、异常检测算法  S. I: {; O' R7 l* ^# W$ W3 x6 n, ?

    9 b6 X9 [  \+ c4 j
    + V2 }: V$ H. Z0 h
    $ o3 z  p; P3 r/ G2 \: f  [
    , r0 c- ]2 e# F7 I2 a

    9 n" z  Z$ l) O9 j4 _
    6 a6 N4 [3 e' m2 D' G
    import tushare" I; n: X9 X- Q( D% T
    from matplotlib import pyplot as plt# r- ]  k3 j6 p7 S4 U; X; W

    * f, w: z6 H' B6 j% z! B$ ~df = tushare.get_hist_data("600680")
    & q; x) d, w& ^4 G- z. ?5 G- v3 vv = df[-90: ].volume
    ) h6 s" \, j: Q5 B  x% tv.plot("kde")7 T; L' u/ g, u, }8 _& V7 I
    plt.show()6 E. u* J5 p) l/ E
    10 E  D. r8 N0 V8 g
    23 ~! I+ G. L6 r7 E3 k3 w
    3
    & d: j) C" f: U# u. p44 }- \2 T" g# v' Z
    5
    0 J" ?5 e$ H! a  f. e8 g9 E6+ Y9 b# y: R& l6 t9 ~) V/ K  E. B. q  u
    70 V5 B8 ~; z  m, Z
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)6 s. E" C0 r7 A: k) t1 ?" P

    * V( m9 \# E) M: V2 I# G* A

      h  d; [, d3 E/ ]% I' y2 H8 ^

      R- h: M: U2 X; `1 M% L+ \9 Z& E, `7 `) L  t/ ~6 G4 o  e

    ; t% q- J( U6 p% W- D9 X& a$ J+ r3 G1 |4 n2 C

    1 w3 D* V8 L  G' V) d  G2 @2. 箱线图分析
    , X. G0 X* d7 U' o! cimport tushare
    9 r' ^1 ]& h( Ffrom matplotlib import pyplot as plt5 Z& x# L* l$ q3 K+ S5 |6 F4 K

    ) G, a) ^4 `8 Z% x$ fdf = tushare.get_hist_data("600680")
    & V! Q: A" p. Z) Kv = df[-90: ].volume9 ^9 G" t9 S* b0 A) Z
    v.plot("kde")4 R7 ]; x# z; f. M
    plt.show()
    9 s$ P; I8 n' i) j1 f1; }( D! l, |7 T; T) Z# I- ~
    2
    ( N/ e0 ^- q9 C0 ]' |' C6 {7 `3
    + l# {5 Y8 `% d/ S- ^4
    # Z% t$ p# z" V5
    ! \9 x7 F& t: d, q! y2 F6  R! P3 C; u6 L* L+ U" I
    7
    : A% @% P4 Y- D
      r) \5 g% ]) j7 P- f1 ^
    " J7 W# Z3 C2 s% |0 m- x
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
      H$ W& ?1 f6 Y8 y* \0 L8 E
    : D7 i7 i0 B) V8 K, F" K9 z

    6 a+ Y. g: e7 C) d6 i8 a3. 基于距离/密度( J1 r  U. q/ _+ Y
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    - b# Q8 c; Q& t% V5 D8 |
    5 H, X+ j- z! O
    ( d  P7 b$ C+ U! I
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    9 \0 q( `8 {9 ]) Q
    . f/ r0 [0 g5 a2 }3 _" _

    3 m+ u& u0 U6 w9 k0 y& @5 j0 \& ?, |. o2 p0 J% c+ m) ^8 d7 g

    + Y1 U6 {$ }. l% J% X- F' }9 D' ?6 h; q: t- U. @  q

    : d; X4 w/ A) R3 O7 q2 X5 d
    / W. d+ c, }3 E
    5 p9 ^) c% ~! }" [& P$ ]! L
    4. 基于划分思想
    6 K# q1 X  x& e2 `& d1 W. X5 A典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    3 [0 u) Z1 v/ [4 V8 K5 v. k- \' M& _6 u( W5 N

    & l2 M5 ~% r' u; S$ H假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    ; v& e& k4 ?3 X6 L2 F6 o% o1 e8 N+ [: {* r1 w

    $ g/ a( `5 c" y4 [1 m这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:! v0 I7 x9 M& o6 }- U, M" |! Z

    7 x7 V! y/ N6 W! x, E9 ~7 r$ G
    2 Z  }: z9 `* }6 W0 ?
    import numpy as np
    - g8 @0 w4 ^. oimport matplotlib.pyplot as plt% H4 [& J+ Y+ j( n  O' |/ T! |
    from sklearn.ensemble import IsolationForest5 [) C3 l9 c# p) W

    % {2 r5 q% C' }& t; r

    " C; {4 @* l+ S% s! ?0 lrng = np.random.RandomState(42). \4 w( t; V- P: c2 x' N. o; v# K

    3 N; R2 I: S( f: t" T. ~& ^: K. o
    5 J0 O5 {: r# @0 P7 ]' W
    # Generate train data! n+ |! N+ p. G0 E: |8 b' {
    X = 0.3 * rng.randn(100, 2), |) j" U* Y& x1 r9 V
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    2 B5 C& `' ~% V' d) U# Generate some regular novel observations! `, _& X- B: G" h* _, Y
    X = 0.3 * rng.randn(20, 2)+ F# C5 D/ P1 S8 a& d
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]% N6 q& E. u/ o' P8 @
    # Generate some abnormal novel observations$ H1 V& k8 _3 c: V
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    ! ^" p/ ?: B! i4 R6 r( I
    # s2 o& o7 b; `7 G$ Y1 B1 B; U2 L
    . }( M; |; v+ v' b! u6 b" w, r9 D
    # fit the model
    ' R, A' u+ g1 F' S" P) Xclf = IsolationForest(max_samples=100*2, random_state=rng)
    . h' w- ?# I7 F$ nclf.fit(X_train)
    2 v* C8 v9 v5 P! T8 Ey_pred_train = clf.predict(X_train)
    9 Y: M  @9 B* |# |% Ky_pred_test = clf.predict(X_test). b) y. e' z) L& R9 A
    y_pred_outliers = clf.predict(X_outliers)# t3 ~) Q" I4 t) b* t7 c, M0 n
    ( U. H) U% Q; l- }. _

      I/ e- v0 L* B1 {5 D# plot the line, the samples, and the nearest vectors to the plane
      P# ^: V; o# ^6 y: H4 ]xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50)). p6 L4 d, V8 p$ j- ^- ^+ P
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    2 O& J) P$ j4 u: U2 J# vZ = Z.reshape(xx.shape)7 J7 x. J6 ]* D" u
    2 I/ E, E  q5 \) `4 Z  C( T! Z
    , @) F" U' |  v) @, L( e
    plt.title("IsolationForest")' L8 w8 Y: k+ L. v2 [
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)# |$ Y( g: b# g0 Y3 B2 Z

    . A7 |* u3 \8 A/ b$ ~: W' }

    3 N4 B2 Z) I% P) u9 v9 kb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white'). l4 U( `( b- K+ V
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')( t5 m7 o! v3 M- h5 T. Y
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    . m1 m0 B. s9 w9 K7 g, O2 Wplt.axis('tight')
    1 |" U+ N# d; Nplt.xlim((-8, 8))
    - U! X, h3 _- T8 Jplt.ylim((-8, 8))
    ' }- e1 f6 H! y" _# A' }! Mplt.legend([b1, b2, c],! O0 @$ v# Q; r1 b& f2 [
               ["training observations",6 z6 X! V5 u" P+ m
                "new regular observations", "new abnormal observations"],
    $ r' W4 P; R! g( d9 ?           loc="upper left")
    1 h% N- x/ o3 \6 y) I. [* t% l6 lplt.show()
    7 y. a$ `2 a% w6 {1& E& ]' |8 z! q
    2+ j9 D) s1 B  g; U, ~0 f  T# q2 Q6 c
    36 o( U$ E6 v- m) f
    4
    & o) `1 H+ n0 ]/ p5
    # r- j$ G7 o4 g6) H3 k" Y, d3 |0 s
    7
    / @, S* N/ j0 ^  f7 Y8
    ; F4 ?9 |% u6 |1 ^! }. _7 G99 f& k% F6 i6 r, L; @
    10( f# w' u+ [* ?, l) g( G* K- J
    11
    ' }/ [- A. F/ n# ^# ^127 o. `/ z. s' t* V% ?! a+ J$ g
    13% X1 f  r, W* D1 G4 I7 G
    14
    ( I$ x. h, N, ]5 k159 b( R+ d  H  m% g$ t& T
    169 u! f8 w8 d2 `  M' X
    17* g0 ]# d. d2 T5 m" f$ q/ B7 j: F
    18
    & N2 \4 G: y' u  U1 p19
    2 D+ ?  B, X+ z7 k# A$ Q3 d$ K* R20+ B  C7 I, z7 q9 c8 J2 k. L
    21
    . P$ j" _, R  `22
    * P5 v6 j2 i9 O- C; Q9 f8 E; N, e( N: v23& |3 `- z9 D: b0 d
    24& n' h9 q2 [! x  T2 z5 {
    25
      y- v$ x8 v7 ?& Z5 C% W26" X1 w9 l; ?* H- `$ t4 `! b
    27
    , D* Y' @0 j0 e& |/ b( `- R28( |; J4 g2 d6 n2 P) D0 W3 t/ Y
    29& `5 e% B; V+ k7 U3 u& |
    30% t+ X# f  y) i1 r- A- p+ [4 j
    31& P; |& V9 W9 Y; s
    32
    2 N" \6 i0 N7 c* J6 @330 Y( O5 d9 D, R
    34
    $ u7 f' V. B; q) A1 V35
    ) m& O! W. E5 M/ _36- i* t/ c& e: _, x5 u; U& m6 |
    37) z5 V0 y: d0 N& A" g# X
    38
    . `6 z, _; n5 I- f39
    # B3 h9 p" H4 C8 A40
    , y/ D- d  X2 \9 Y7 V41
    5 S4 n1 U! J# D0 Y+ w0 W6 N/ |* e; P

    $ E8 [% H- ]4 R' |; F5 b————————————————2 T# \' c% \- |
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* q: j' I6 D. D+ j
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129, ?  O; v9 j+ F8 l3 F( o0 s

    & d0 n' \% k$ m1 \- k) Y
    $ J2 }. e0 b. ^; W6 z: S. z
    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-11 12:11 , Processed in 0.896301 second(s), 51 queries .

    回顶部