QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4008|回复: 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
    3 t- D6 J6 e% {' G5 {
    数学建模:异常检测算法
    . X8 J' ~+ f$ g+ d  G: @一、简介 – 关于异常检测8 t( _5 q/ _# Y7 f: d5 v
    异常检测(outlier detection)在以下场景:  d0 ]/ t3 l2 L+ C
    5 H" l! j& Y% [

    2 b# |' k+ h" ]数据预处理
    - m+ O! W4 n- a, E病毒木马检测: l( L+ {6 A8 [5 {
    工业制造产品检测; N7 n* B* n0 u; s: E+ V: L0 z
    网络流量检测2 w' b5 m* Z* ?& x  U1 c8 t; r
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:* r# K$ Q3 P# Z" `) T
    * Q6 n& x2 E  G6 Y

    + r$ ?5 B6 ^! Y  o监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    ; w$ Z, }" X" s  B
    # @- K" ^4 M% e+ y2 w+ s+ H& \/ q

    $ x; b' B9 r! Q  ?以下是异常检测和监督学习相关算法的适用范围:: q; K5 b' t$ L/ @5 ?) J$ g2 Y
      Y4 s1 I5 }: n. Q

    3 H- p# X, W, d异常检测
    % x) D0 l) z' S信用卡诈骗7 d% e7 m  ~! Z- G
    制造业产品异常检' s' ]3 s2 `9 H/ q9 m
    数据中心机器异常检
    " m# X: z. G# C" c; z/ \入侵检测
    + u  w: y6 [' ~/ E" a监督学习
    8 w& _( n7 {( Z: s+ O1 [垃圾邮件识别
    9 v! A5 z) K8 N4 U9 ^( _8 y  @新闻分类& j, o) B' \2 _5 D  u" [7 J
    二、异常检测算法2 e  K+ N5 L6 ]& Y) V
    : W8 X' b. k/ ^( k

    4 u2 J: F' p; d  p' ]# |# a* b4 b; a& y- J" e
    % t. l6 [0 V& _; N/ a

    % Q! f- f% f# A/ C9 m$ t* u

    7 E6 C. r: E- K5 q1 oimport tushare
    6 I2 W: a9 }) L. O. Zfrom matplotlib import pyplot as plt
    ! l: y: [  x1 H% ~
    $ a% r; W4 B0 A- udf = tushare.get_hist_data("600680")2 t" \7 Y! p' u% ~: [2 G
    v = df[-90: ].volume/ U' H: Z/ v& \# m8 k
    v.plot("kde")
    : a0 m/ l! R! x5 U9 X3 jplt.show()6 X; l. b$ }2 X& l( B8 b9 p
    1" S; y! J5 x" f% S8 p$ L  W5 L
    2
    : o$ H1 e" E# b3
    : ~7 Y2 t2 D6 J! _' {0 u( m4
    6 g6 V" _# Z7 w2 J+ `5' i/ u" z$ C1 _4 P0 U
    69 g" c* }0 h# @* O& ~& Q: y, i
    7' C$ f7 M# Q% H7 U
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    : p  G' h0 G8 t" q: C9 x  _5 _1 t1 ?

    : B( R5 l9 ~6 L0 J2 ^
    5 Z8 {+ q( l8 S8 Y
    ' ]5 l$ Y6 P2 y! f4 N4 w- r( b

    ! c3 B5 y* L9 G% a7 K/ a& L8 S+ C

    4 m% h) L( C' z, d# f3 j1 _
    % Y& ^8 @" ]) k: m- _* X/ F

    # k0 Y7 ~9 ~% ?* H5 s8 z  k+ H" E0 l2. 箱线图分析: W/ ?8 U  S  z7 a" Q) M! ]
    import tushare
    ' P$ g* c4 F( w* ^6 pfrom matplotlib import pyplot as plt3 j& E% g+ b5 T& s$ A

    0 B' P! Z. c0 m' `df = tushare.get_hist_data("600680")2 y3 `% S, ?  w
    v = df[-90: ].volume: ?- V6 k( e1 n! }+ \
    v.plot("kde")
    $ [9 Z! @: D& |; _& Wplt.show()
    * d* A! `/ ]8 |0 \  D3 j1/ I9 q, H0 r! u" D3 [& I$ v( }
    2
    : Q2 U1 F, J: g0 @, V38 n4 p+ q7 B3 b9 V/ v
    4' C* g, E' w, k" T
    55 Q: g4 J4 k/ V5 P) _' S% s
    6
    2 H5 p9 F6 p( y$ H  T6 }4 U7
    1 z% X2 d* k/ Z7 w/ Z: q; N7 L: _8 ~) Z  S

    % f5 {% T6 q+ R) S0 M: o8 _大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    # B; c* b1 ?' I7 h+ `8 s0 Z% a8 k, H4 A) O' x4 c* k
    % P! K( B' I+ L- o* ]7 ~& h
    3. 基于距离/密度
    : {/ ~) y; J! m  ]( ^. b& R: K典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    * N0 |8 I6 k6 I; [" _3 f9 a9 X) y! o, c8 k3 R

    ( K4 o" x7 z6 R3 l( x* w" b用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。, M, {4 M0 l: n8 K& x+ X7 u* P( R
    8 u* v2 i8 p) X  A: O

    % t+ O9 ?& y- a: e  @; `4 p' A- T, F6 D/ S7 R* w
    7 v6 L+ ?4 G6 g) B

    , R! ^5 {+ F- b- Z2 Z. v6 q& B

    ) d6 L. z6 i3 P3 `- g0 S3 K' c, m  x4 s0 n! q
    ' P: l. V5 H8 J! }5 |8 B" ~, D
    4. 基于划分思想
    ! H( s4 q# R. W' D2 T0 h- n典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    # @( U/ s" G0 {, N8 G- Q3 O+ ?! Z
    , U" |2 k- m6 [; X- w4 `: r5 v
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    2 O5 s: Q6 E/ k9 z
    5 m( V. N5 |4 L
    9 |+ b0 U( M. T" u0 u6 W
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    / r6 a" l! ^) O0 c0 v, D
    4 }) v0 \# L% W( S+ {

    ; y* |6 t% X) ]import numpy as np7 ?2 V- w- e: w$ {6 J  k% M
    import matplotlib.pyplot as plt* w9 C- u/ }% z1 E0 x
    from sklearn.ensemble import IsolationForest# e2 e  a' Y- Y) Q8 q7 U
    6 ~" F8 k1 N# N. F# c

    , S4 ?  r! G: r$ c; k) @rng = np.random.RandomState(42)9 F6 s, r% y7 }1 L. b! {* l8 @

    - r( t, s; _9 F# @2 h) p

    3 `+ T5 K  h' }0 A. ^# Generate train data
    ) j, X3 g( g  A# |* |9 k$ e2 ?X = 0.3 * rng.randn(100, 2)
    ) ~: d+ D- T  z  CX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    - Q) u( h4 K! K7 A. q# Generate some regular novel observations8 }( T. l' E- l: g1 }( m0 d  Q' P
    X = 0.3 * rng.randn(20, 2)$ T# L5 j- J( _7 i* K$ l5 Y, g! `' M
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    9 k* Z: k& b) T# Generate some abnormal novel observations
    5 V, H9 x# A4 R6 l: j- ~X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))2 p- L# Y. r( f
      o1 o' ?# d7 v' ^/ D
    ( P+ q& B! }$ K* r3 U
    # fit the model, R5 v' U7 v; C; I1 i3 A/ R+ c! t
    clf = IsolationForest(max_samples=100*2, random_state=rng): L3 f6 p5 |5 ~& p  W) u- I
    clf.fit(X_train)/ a$ ]7 p9 X1 X- \1 T* ?6 ]- \7 V. T
    y_pred_train = clf.predict(X_train), e3 |8 {# T. i! q6 l  X. M8 B
    y_pred_test = clf.predict(X_test)8 p) o6 {" v; r
    y_pred_outliers = clf.predict(X_outliers)
      f' u4 s& i, I. _& {; [5 E1 n* W  @4 W# B1 B

    6 v9 Q  S" p, J) x# plot the line, the samples, and the nearest vectors to the plane: Y: p/ y; u5 X+ j
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))' e9 z( h" s' U+ q
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])$ w1 b- K. k' _- m
    Z = Z.reshape(xx.shape)
    ! l# L3 {# Y4 J& K* p) m
    8 A/ p. m6 Z! x0 D/ X' b
    * V. w# Z0 @6 W5 |
    plt.title("IsolationForest")) ]5 \! G9 k. U! |4 O8 }
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)! B) S. S5 w3 W
    4 ]5 P8 {$ ~" f' L7 Y5 r6 {
    / y( ]* f) I- u$ _( a' ]; b; p
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    ) ?0 s# f# W1 }/ Mb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    & Y8 m$ _! q9 Ac = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')+ D/ G8 T) J8 ~0 X* \0 ]! {4 _6 D
    plt.axis('tight')
    8 k4 `/ |  Z9 Aplt.xlim((-8, 8))! G1 _# S8 A7 W
    plt.ylim((-8, 8))
    $ c4 B/ L2 ?5 K( Kplt.legend([b1, b2, c],' |3 x3 s$ b- I# c& Z1 L* o
               ["training observations",# G! g: p2 H, C5 z9 ]. W. v- r
                "new regular observations", "new abnormal observations"],
    6 N- U6 L' j" ?           loc="upper left")
    . y% U- }2 ], M& W$ S' Vplt.show()
    / z* _& e, ^3 e: f# S1 s: C3 V1 N, q1) [0 g' c$ R; o3 u. ?. p- o
    2' @4 ~) r1 r* e  M9 L- Q8 y% |
    3; V! D$ N" b) ]0 J& ?
    4
    9 t' {$ R) K2 M# o& Q53 ]. u" d& e. l% v5 \
    6& C/ n9 m6 f" S. }3 n- z6 R
    7! a7 y' [) z9 E2 v  I3 ^4 k5 e* f! c
    8
    0 P9 E8 z! U. n  r/ S$ W/ Y90 u; @% m3 t/ l3 v8 X* p" b9 D
    10" i+ G; }7 ^: |' F
    11
    : `8 |# c& u6 H; z" U12
    2 M. Y: P, p9 G) b) T  s3 d) X13
    $ G$ [" q8 u) l4 `9 R, V14) X( B, q1 `1 W" E: M7 z
    15
    ' j7 ?* o3 e8 x' N- m) v8 |: k16
    * b( c0 }! o8 w& B17- n/ y/ t) ~) n+ `
    18
    1 z5 v" ?* s5 t" e- l4 R# u19
    " x- Y8 n% |% A) C# O: X: k" [209 j0 t& X( O. L0 z# L
    21
    " r5 G: [7 [0 e( p22' F: P; n/ T- B  b; I$ m# B
    23
    8 E' M. D5 p" N. k: t6 z& D24$ W. d) ]5 d9 H- X4 N% [
    25/ H: y; h+ D/ c* v% ~
    26
    4 e7 K  a* |. R27
    5 o0 J0 g+ ~0 F282 z1 ^& O- \8 U
    29
    , p) a, O" z' q0 y; a302 D( O  g$ J; \
    310 h6 L! y" E. ]. q5 |$ E
    32
    $ q. Q9 Q1 l  w/ P6 ?% V3 ?7 d33
    " J: S; D6 ~# v4 }/ N) l34/ ~: z% N0 m& \6 C) c4 ~
    35- C' ]( c0 k0 {. ~8 Y' q
    36* R3 X. C1 t. L1 U% O
    37
    & X; K- D( Y( T7 a1 S385 E; l9 E6 ?) S9 R7 \
    39
    ) s. r& A( y: H4 b3 g2 P4 h40! A$ o9 {0 v' ~: x
    41
    " j3 I, G5 c9 ]4 Y) {5 o! X  b. c; ?" j

    & z! C% O! m# K2 [1 w————————————————
      q  w; j9 M$ `6 A$ Y$ c9 a版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' O6 Y+ g: y1 _3 ^9 Q6 d原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    # y/ r3 b; {0 Z: T) }& c  K2 t7 _# E3 w8 a9 [9 [& [' r2 e: r% T
    ( a- h$ k: e* Y% U! @+ d; s) e
    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-4 19:04 , Processed in 0.587904 second(s), 50 queries .

    回顶部