QQ登录

只需要一步,快速开始

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

    2 P1 h& X( n4 g2 `; e/ v% g+ l数学建模:异常检测算法
    % y$ G8 V1 j- B. G6 f( t9 t( `一、简介 – 关于异常检测3 y4 u6 G7 ]6 e* O  U: w
    异常检测(outlier detection)在以下场景:6 g1 E9 l! G% V5 Q4 H9 i' E

    $ z4 I0 \2 B  K6 \& d+ x7 i
    # K" O) J8 o7 \) {# A0 m
    数据预处理
    & `, e- g% x9 Q+ {! O病毒木马检测
    4 f+ |  q7 o; X$ \; C* _工业制造产品检测
    5 K2 m9 D4 A- C7 n; g网络流量检测
    2 \) a) H8 c1 }, m' W7 K. Q2 S等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:  I7 k- A+ B0 \& }8 `% E4 `

    5 `  O  A  }  f0 ^, W: W
    - G7 s) a. D& k
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。5 k% R& l+ ?- d9 W* Y
    1 ^1 [4 r# F' u. K% U0 @- T
    8 E+ K* l( u. C0 Z9 d
    以下是异常检测和监督学习相关算法的适用范围:
    0 b) i1 g6 q+ [* F2 V  _& Y( i0 w
    ) X0 M. ^# P- P
    # \% @8 a0 \8 a
    异常检测& S/ o' q* g9 ~3 `) Y
    信用卡诈骗
    ( W& n* C! ]3 e制造业产品异常检' D, t$ y! p! F6 W) x1 b, c' w, _
    数据中心机器异常检
    7 w- G1 B5 ?! d* A' B3 I1 P入侵检测& J7 X; `: ^" j+ o0 L3 E; D! m( u
    监督学习8 s' A& u( Z5 K( k# j" [
    垃圾邮件识别, l% E+ ~  i! d
    新闻分类; y' O+ `' {; A4 t- M
    二、异常检测算法3 p& c7 g& h* ]* r
    ( }+ K; O6 [. ~
    , X8 q  p8 B' b) z6 |5 R

    . u6 [8 {: O; x" S, Y) V

    2 ~1 b8 i2 ]* C* R4 s  p+ }; W1 O: T  l/ @5 ?9 t4 q& F' J

    4 f& t' \1 _, N+ b0 iimport tushare. C0 X! n% D5 D% L2 U8 P
    from matplotlib import pyplot as plt
    % `* @( w, h% [/ ^ - P9 d  `8 S3 V7 W0 v
    df = tushare.get_hist_data("600680")
    / N8 Q! O& C) y3 f3 Qv = df[-90: ].volume# T1 C5 i, f  k3 |
    v.plot("kde")
    1 B! {& x: S/ C2 M% }plt.show()' l! f& n8 N5 ^+ }
    1
    ) Q9 \+ K( p' l2 j% H2
    : `8 h- }# G5 K: Z! ?3
    * v( @2 b, W( y. X" ]4 G9 I4
    & b$ f' S: Q) p  T- h5 U# ~* @4 n5
    4 e! I* o& X/ ~( F5 J65 N% W) n7 r% i- E0 `
    7
    3 j& _% H5 X. U1 k近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    1 d. u8 [$ X$ K1 g
    5 c% B# H( D2 T

    0 n/ P2 H; E' G# k( B" ~7 G
    4 T% Y- U! ^- z2 t

      N9 [. `* u* B; Y: o0 J/ R8 A' U' p4 G- O' D- m

    + ]# w% D/ ~& J: \0 ^$ M, X; c1 P; r* k1 f2 \: s! H2 d$ Y& I

    / H. z9 i& Z4 A* ]2. 箱线图分析- s! x) [/ v5 X( S$ y4 I  r
    import tushare
    & j: a% g( ?$ m' y+ ?from matplotlib import pyplot as plt
    5 b( [6 s4 A) H. d6 G5 `$ b
    . {( y; m+ M8 Ydf = tushare.get_hist_data("600680")
    6 D( N4 {- E8 Q7 ?) b. U3 Yv = df[-90: ].volume) \3 c, `$ [3 q+ l1 w, p
    v.plot("kde")
    3 i2 S0 t6 }% lplt.show()! `3 K( U! M4 U  L4 m- X
    1
    ( [/ B& J; z# B2
    . }0 Q- z+ v! E9 o6 E3! @0 ], b# E6 C6 U
    4
    & M7 w4 o+ K5 r8 D% s3 u: o5
    4 _3 Y8 [4 L. d  l% o6 A4 w, b6
    3 E( Z" w+ U5 r! e# {7, h# E8 P8 b# I( i

    7 O2 |3 E% l8 b, W; d* D$ n
    5 j/ M) _* K/ D
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    " B6 ~# J8 x; f8 `
    0 X7 [7 g! P, ~( Q

    - _6 E* S9 i4 b6 ~2 R3. 基于距离/密度' O" C! i: R0 ~) @
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    . E7 K+ x0 O7 C2 K( N
    " K2 L3 w1 d6 m
    2 S! k, @" }4 l( [$ S7 T( r3 U
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。: e; D, j6 K) z1 z

      t  L0 _  W5 N' N

    5 l6 t) [% }4 B  F% ?" w- q6 m( f' w2 X* Z5 v) B( W8 N; `

    8 U5 M. m! ]' A2 ?$ Z( F+ R
    ' c4 Z& v0 d9 p* ^4 Q3 d, g
    ( O7 K; q7 `* |) [0 N3 X
    % V: R! t5 q; E3 ^3 ]
    4 P6 s0 Q2 J+ Y( F/ v! q
    4. 基于划分思想$ j4 i( @% r9 j3 Q$ ?* z8 g9 q
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    % y6 ^5 X& b) o& `8 G6 p9 ^9 b4 z7 @" ?7 s- @' w- w" A' c* G0 v
    ' x# d3 V: `- l  O* `5 L
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    6 a" g, l' i5 {% h% z7 d$ S$ r$ W# J4 }
    . r) u) @! A% s( a% m# o
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    / A2 h4 T- b. c4 K: u3 `0 Q& l2 F) F& Q) S1 b, s9 C5 F  o
    + K* O2 f) ?# K, _& k8 R4 T
    import numpy as np: u  l& Z0 c( ?' R& Y5 M& B
    import matplotlib.pyplot as plt# W! r( e# @" y/ x1 G( ^
    from sklearn.ensemble import IsolationForest
    6 Y& F1 T; a: y! H# c+ z$ N6 W) o- ~0 q: c# q( j3 e0 Z
    $ r8 }5 i3 p! \
    rng = np.random.RandomState(42)
    9 k- t5 C: s5 w: t. k3 v3 f$ ~8 V

    $ f1 l" R3 F' H# D' ~# Generate train data/ R- G0 y8 d& [, M$ e) i: V
    X = 0.3 * rng.randn(100, 2). ^" B' C0 ^# C/ d% y' d: ^
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    ' M0 a/ S0 r( t6 x& F3 J# Generate some regular novel observations# M! b' k) w5 g
    X = 0.3 * rng.randn(20, 2)+ a! O3 R, k9 H- c. |! A% h4 L0 l
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]* p2 R: d* R" {' |" b) M, m
    # Generate some abnormal novel observations* `+ q1 _5 ?5 u# e, t5 c; h# L
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))4 g5 R3 r: J" _' q+ {6 I

    & e' S' N) y2 ^7 l& J9 ]8 C" Z3 W/ \
    # F" _* l6 n; ?* {# ~* E9 B' x, Q
    # fit the model- K5 O& B/ p2 o7 a) K2 e* ?$ j
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    ; {1 e1 E& z3 ]- M6 Dclf.fit(X_train)
    6 J: B0 v# H4 {, |! Py_pred_train = clf.predict(X_train)1 M' H! a& d3 j+ X# a  @$ h
    y_pred_test = clf.predict(X_test)3 m3 A( Y+ o6 w, p6 r, A
    y_pred_outliers = clf.predict(X_outliers)
    ; X7 H2 r+ e: q; r4 V
    1 G: E" z9 |- l3 c
    $ H! q# S: x; O) v/ J
    # plot the line, the samples, and the nearest vectors to the plane
    # Y, k( y& h8 E' T' r% s  }8 oxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    2 Q0 v5 D% R; \  g; _0 HZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])0 s; {5 g3 B3 e9 s
    Z = Z.reshape(xx.shape)
    1 F1 a) L- w3 V+ U6 W; b: S, Y6 X7 g- m, e' C
    - c4 x; x3 a4 \) ]! u  p
    plt.title("IsolationForest")! g* c7 X1 Y! ]: g, `
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r). n, ^4 y) E! W$ ]  e4 ^
    + s6 i4 x" h7 m9 Y
    / n8 Z2 q1 J( R! i$ t0 {
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')8 a( G' A0 s% T2 m8 A9 R
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')- Q9 z+ F3 o1 Z! E: @! |# j) |2 F
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')1 k; X( K. ~% _/ U
    plt.axis('tight')0 g7 l; F2 _' N3 ^& Q1 s
    plt.xlim((-8, 8))2 z8 o/ K, P1 c3 s$ {+ v# A
    plt.ylim((-8, 8))) v* ]$ P1 ^1 x" \& Y% F9 ?: E
    plt.legend([b1, b2, c],# ]9 l! H% X( `( K- |) V  H
               ["training observations",2 C6 B4 v8 i+ ?+ G/ @
                "new regular observations", "new abnormal observations"],
    # j5 L$ C: k- V5 @$ }           loc="upper left")% E+ t) \# W# `" v( R
    plt.show()& \( Q% u+ n! F) N; Q# j' Y8 v
    1
    + x1 [9 [& ]9 Z% ~. M/ g. q2, o1 T3 H6 ~) v5 J6 g& x) |
    3
    # z' ?& D5 m+ X7 |8 z, D47 c9 P, C1 m9 j! `7 q: |: y
    52 H( V6 x- k( ~) Q! L
    6
    5 _8 L9 _" S; K  c3 N72 \( t- T; t  m/ N
    8; Q! ^' Q  C- N3 q
    9, E+ C' x6 ?& }/ M. `
    10
    3 [+ Z' _* R- w  ?" u" V11
    # @  r7 Y; k9 z4 R3 s$ m123 s: I4 v! e5 [
    136 E- @6 h6 f* Q" D* {7 T
    14! ?( N# i5 V- \% D7 ~: z9 V) X- l
    15
    5 G, u6 _; z9 S) S' S. N16
    4 a& o  C5 E0 L17
    5 H4 [# r1 `; \* P1 A18
    ; X2 X1 i2 e! P% n/ r  E/ L19
    8 }/ a0 p) [: r( m20
    9 F' u7 V8 ], P4 N2 m( _7 w4 T21' p0 i2 Y$ q7 q: b5 ~; o6 h
    22% g) \, U: ?1 S) p9 `7 C
    23
    * x. y$ j$ y/ q) R9 J& {24
    % Y3 h2 b- H3 U$ p25
    ; S- O2 G( z" t  p26
    , R4 c4 C/ i9 U. I. q, y27
    . w/ k) A1 ~) ]8 P9 W( {281 ~  g! Y& o4 C0 ]/ W7 j# b
    29
    * W2 e- Z7 r3 j* [) b; Z30
    , W7 x; a( q. x31
    % Q" m+ [) Z! p( B+ `$ Z' W8 D324 y; H3 V; B& q
    33
    + z/ \& i0 N- d2 D& k34
    8 l: z* @1 |: v: R" |' z; v2 Q355 N0 \5 j( r& j5 \* M5 @( Y
    36' r/ r0 x+ k: N- c3 [
    375 @' o; [0 @! q* j5 i
    382 V: X- `, n- G4 a3 S
    39
    . t2 s) d( B1 W402 O# |3 I, s5 U4 r& d$ b( V
    41+ r- c+ U1 T; L$ v; t" f) s
    - d" p* c+ y& X6 D! d
    , A! R( w$ c$ s. K
    ————————————————. g  [1 p  v# A! T8 F$ `. _
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - [; O$ y3 L* \, O& [3 g( S原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    . R$ {% e& L! x+ R
    ' j# Z7 ^) D0 ?0 o: I" l4 g  M( _- E) j4 S5 B! o9 n
    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 06:57 , Processed in 0.399772 second(s), 51 queries .

    回顶部