QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4028|回复: 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 Z- R. v8 h" z数学建模:异常检测算法/ E: ^0 B/ `0 j1 u5 j
    一、简介 – 关于异常检测
    & e7 v7 m  z  _2 K异常检测(outlier detection)在以下场景:
    % o+ `4 `) W3 C! f! ~( j6 a$ F# b- g/ {

    : ~3 p: I6 V# x, d2 \' c数据预处理
    3 b! S1 Q$ g9 w# n8 l9 M* Z# ]病毒木马检测
    5 j4 i9 L% H' I: t  p; B+ E; \工业制造产品检测4 d: o6 t# u# n) D) Y4 y3 Z. r
    网络流量检测) J& T$ b( ^' T/ B5 A
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    3 F( T3 n. e: J) S4 d) Y4 z0 l. P1 `7 o! B& s: _2 o2 F& E( {
    ' a4 t: f9 K2 J  P2 x" M
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    5 c2 ~' M, I" y7 f4 R  p8 w
    3 L' `5 O: L; f+ @" G) @% F3 }
    8 L  C$ u6 I! W) Z; c, D! T* ^1 _
    以下是异常检测和监督学习相关算法的适用范围:8 x1 x, _- Q/ ]; Q1 C& z

    + w  ^5 [2 M' c+ D$ R
    9 @$ T) h5 \- r" S+ |# t6 j$ q
    异常检测/ J5 A  p/ ]+ y7 t  f8 S/ Q) w
    信用卡诈骗
    9 O# I) Z; j5 J" R7 {: v* d$ D制造业产品异常检8 [6 B) {; |* K$ ~  A3 S9 |9 f
    数据中心机器异常检
    : W; F! l* ~% y. m2 @; P  U入侵检测( q6 S- r7 E9 @* p* u
    监督学习9 K8 c7 [- q7 Z4 S! \- s+ \% u8 ~
    垃圾邮件识别
    # X! l& T) r' _新闻分类
    ! \/ F1 h6 z! M5 v( I6 ^9 b8 |二、异常检测算法3 f* R$ X" w! [7 [' S+ Y: z4 H4 H

    + |/ L6 Z: p1 \9 g
    " i: q4 l. |, u6 {: x! V. S

    ! ]8 J3 K/ e% \1 H
    # n! F. J0 e6 \. N7 k' v: [+ F
    6 H& y# J0 T9 {; c4 N3 b
    8 e/ d5 Q+ l" |6 p3 d4 l. a
    import tushare# R2 p6 n, H; ]+ |, N, D
    from matplotlib import pyplot as plt
    / _% w9 Q7 W" H. r( [3 L 4 T# T, D+ B# R% z0 H
    df = tushare.get_hist_data("600680")" i2 A; M. O- G9 N* K
    v = df[-90: ].volume
    & E& ^2 _- [8 lv.plot("kde")
    ) ~6 s  |, f) C% j2 k4 Uplt.show()
    ( Z% B! J$ n8 h! u. {5 J1. z& i  t. G; `9 Q/ C( C  N0 @; M
    2
    3 ~- h. N. y, }/ f/ V5 b1 v3
    6 j: p1 O# ]- P47 @) M# ], ~4 ]! p  t0 r
    52 b% \5 P# Q0 D5 m$ ^. Y
    6" m8 e$ T! N' |$ r  `
    7! @# _1 ^1 |9 k- E+ E7 i
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)0 h  G5 Z' r& L5 g* d- A* c/ r! D" m

    % R- j" E2 c# K2 d9 s* j  {

    ' _3 S$ w+ |- i7 V$ T& a  c- [& k1 u7 \" Z4 `' y0 e

    4 K- `0 v& @- C) V) {; h' o: \" {4 Z+ g% d/ i# o

    , J$ n6 j3 G3 q* C  J4 J4 h! }* L* o( s0 W$ C3 Z
    6 p! t9 |- w. ~; S/ ^) A. Q7 y
    2. 箱线图分析+ D) N# Q+ \3 `! A
    import tushare" [3 V. @2 e( N2 I
    from matplotlib import pyplot as plt9 ?  m* d* {. ?" U( `- r3 u4 y- b

    ) A% K& N% f( kdf = tushare.get_hist_data("600680")
    ) h4 f! z( H: a6 @' O4 m4 jv = df[-90: ].volume3 y, V, ]# R1 V! O$ ^
    v.plot("kde")5 a1 o; a7 J/ ]$ s* d2 L+ M
    plt.show()
    6 R3 c9 m( _0 Y( O1
    7 A6 E5 v4 K1 P6 F" G2. T$ \. ]' {7 }! F- N4 q% b
    3
    5 ^, R9 ]2 p: D/ }& A7 S- @; T4- Y' Y% _& ~4 z! A3 L, c4 K' F
    5, P; s' O2 m" D! s
    6
      \, b- I- X. v2 d7
    4 ^9 q0 X+ P' `9 p* K& [% h! i1 z! ^% |$ X$ B

    ' D0 W  }/ R8 s# q% ^, {$ A8 c7 S大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!- V3 l: z1 J+ Z
    5 @5 C; w/ X/ O- \; D, w3 x

    8 i6 n  E/ V* E  e8 |3. 基于距离/密度; {# Q$ S: d+ d4 A+ \4 r
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    - D! f9 I2 @9 O+ X. v. o" x/ ^# m9 Z3 L

    + F4 g0 _* H( \用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    ) `; @' G' G/ {9 w4 Z2 [$ v' q+ A. P- |  X7 O/ U# G5 F5 _4 |& U
    1 T6 U( ?& G+ F

    ; |8 ^% ?9 i. C6 Y' i: @

    * G0 N* f7 S8 R7 p# b: t" r$ P: K! V: A' Z

    4 l% p% i6 s8 a; R$ S2 U
    $ @/ z1 r  q7 w: \' T" C' B; a, p

    6 A3 t9 ~  D" h) U; u$ p! O/ I; c4. 基于划分思想3 Q8 D6 V( h- _- J" O
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:/ Z) J9 N+ j6 z8 |1 D! f
    8 [1 D9 T( v1 U. m- I

    1 z3 [+ U' D0 Y( R& H6 W假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。' h, P2 h9 i& j
    " T5 N5 m! f0 x' {

    8 d' ], s2 y3 u; M这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:' ^- X2 j1 H: }2 A& ^. }6 x2 ?7 D
    ) D9 m& T6 J9 R( \6 }! f# K8 L

      Q  R( L  L8 N+ f4 a/ I8 q: fimport numpy as np
      k' z  g. A, Z& H1 G0 ]import matplotlib.pyplot as plt8 c7 R$ u, J" t. T9 g% @
    from sklearn.ensemble import IsolationForest& N; n8 f+ P1 S1 B' O* I  R2 N

    # U/ N/ l6 c1 X' \* @
    ) _! M' d2 g2 w' F) j5 E' f
    rng = np.random.RandomState(42)
    - }4 X+ f, z2 _
    4 S( J4 w! ~8 W8 i3 Z
    & b2 i9 v) a, k. m% m2 b
    # Generate train data
    ) p1 O. P& D( Q# p9 OX = 0.3 * rng.randn(100, 2)) I6 h! H/ i* h7 \% ?
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    - e! m0 C$ _) s+ T9 i: d" i# Generate some regular novel observations  N* Q' j1 T9 ?, b1 i( m
    X = 0.3 * rng.randn(20, 2)
    4 @; T1 Y8 o: g. g4 oX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    ) o8 k8 ~8 a' a" Q: H) y# Generate some abnormal novel observations( V: Z, U$ m$ m  w+ P4 \
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    + n1 O! ]& ~% ^; o  M$ a; n. J' s7 p% a) ?; f/ m0 [! [8 i- c
    . P$ k& R! N, z1 n
    # fit the model
    ' r5 z( u5 z! R. pclf = IsolationForest(max_samples=100*2, random_state=rng)7 P, g- q" b1 e% V7 ^. m2 Z
    clf.fit(X_train)% L2 u+ v" k0 H, e  q
    y_pred_train = clf.predict(X_train)2 f" k6 v, q. ]2 ]7 W$ P" [
    y_pred_test = clf.predict(X_test)/ U! m4 }9 S2 x; G1 M- {5 D
    y_pred_outliers = clf.predict(X_outliers)' ^3 y" [4 Z. P; q: r

    + t" i0 h0 x  E+ b2 s4 p( d8 n9 h

    5 a& V; C0 N% b" |! C  i# plot the line, the samples, and the nearest vectors to the plane* y8 w& y4 a+ d
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    & Y" a' U% i& VZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    & S) k( _; r5 _8 L. hZ = Z.reshape(xx.shape)/ T8 P% h  ~& `$ S2 V# J8 A- V

    # T. C0 r7 @% b- F$ `2 i& ^$ D

    ! @9 S5 R2 t4 I5 |  a' j+ e- e: aplt.title("IsolationForest")( p( w# y, {3 m6 D$ ~) }
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    7 o- E% X5 w* Z+ q3 X/ G; m
    8 X" k9 \9 o3 I! h8 I
    6 Q6 f2 }( Y% U6 F6 j3 K
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    & {9 Q# S" _% {# e* W6 a9 Bb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')7 O/ }: I6 d& E( Z* |, A$ d% g( j
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')+ ?0 n& p& g# ?4 j0 ~
    plt.axis('tight'): b6 N) `0 t5 a
    plt.xlim((-8, 8))
    + T# X$ _/ i! Z& G! \6 L0 Jplt.ylim((-8, 8))4 G3 V! i3 G5 a% I
    plt.legend([b1, b2, c],
      I% {: w8 }( Y6 }           ["training observations",/ S! K7 S+ x7 U5 G
                "new regular observations", "new abnormal observations"],
    : ?8 s) O5 D: `. ~. |           loc="upper left")
    & d/ ~, e# B" i- }5 a. E+ Jplt.show()/ ]6 @, f+ |# w( m% b- y' k/ |
    1
    * H& z3 t% i8 }: o+ P2! T; ~7 U( t" Q$ E
    3, o' _! V0 ]- w  ~3 y
    4
    " ?3 p1 k" q- n: k# A- N, e2 p5 H5, g- @) z; a: ]+ z- C6 s
    69 D. Y2 K, i/ n9 y9 o6 K* j: }
    7  P' l% U+ i7 e& M
    8/ c$ v& f1 T, S' _: Y
    9
    * `3 a( j7 {5 O10
      U9 f3 `/ W& C( n* s11
    7 h, d) v) N, q( H! f12$ q% \& T! M2 S( }, k% L$ p
    13! d. T" O! e0 g. `( N' Y" C
    14
    + z' V# [# w* Y* I, j15- E1 g% \2 \) l  \& n
    16, t2 s! T  M1 `( L/ e
    176 a6 R, \+ @2 L
    18
    " D8 N  a) J4 x  g19# H: G+ F: t; ^( a' [- f3 Q* x2 p
    20* T/ J7 L2 ^$ r3 V9 f4 d1 Z
    21
    ; D& r( ]; w& a: D5 _8 p* H: r+ X22
    4 R* V. i/ A8 Y, X23! J" ]) d; F' ?  N' h% S9 w
    247 t0 ~3 b% H# _' i8 F2 f
    253 Y, A7 k4 ^  K- n4 u
    260 l- V; s+ r: ]& \1 `
    27
    / j! ?: \5 L+ ]5 [3 E2 I- T* F287 V2 g4 o; T, Y' i& b
    29
    # q, M0 q" M" }- z& Z30  `. ]8 \& G1 q8 J' u
    31
    . t4 d: @5 f4 K32
    7 b+ Z' U# W5 r3 m: Q- {33
    3 l' U7 G- [* d# u3 ^34
    * G! N' m* O& z! o. V35
    9 `  m  O6 f9 _1 @* A% b36" ^/ d* Y3 S9 q, Q4 k  {7 G
    377 L" [! Z' `: R+ J1 E' ]
    38
    6 x$ D5 [% X; R9 S! L39& w3 |0 P  H# S
    40% L% j& n9 R& O7 v. s, n% S
    41: L4 V$ r0 }: w6 Q- b; c( O
    - D) ]: E- B) ]
    0 M9 L) ?. _3 B4 k* y
    ————————————————
    * l% \, D: v- t5 j" Z' q* e版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' f1 t( V7 \& n7 |
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    . Z4 M4 ~: F# c6 Z
    * \: a/ o1 N0 `. J2 w
    , W, E  R  x0 ~( L6 s0 Q0 |9 y
    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-13 19:24 , Processed in 0.329960 second(s), 51 queries .

    回顶部