QQ登录

只需要一步,快速开始

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

    9 r+ @! e2 e- ?% c# q) u数学建模:异常检测算法  E! k. c' L% _
    一、简介 – 关于异常检测
    7 h3 D4 @4 b# @! i! y异常检测(outlier detection)在以下场景:
    6 p9 `# S8 p" i' \1 O1 q( O& n3 Q- d2 P  l7 J  h4 q

    6 M: n! q, Q- O; B; Y, _2 A数据预处理4 z& c8 t+ h: B4 Y( e
    病毒木马检测
    ' @8 l. R% g: ~' h工业制造产品检测  P3 D! z! m* m! n+ }0 c- O- Z
    网络流量检测% V: |7 b. n8 o. o) I# _6 Q
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:5 f3 |1 y, g' I# q3 g/ q
    . w4 z! a2 P5 Z3 Q  N4 i7 {: U! D
    $ h1 c7 K9 z! `5 A  P8 M4 m0 C
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    - w- N% g5 u  W' _( N5 |2 ^2 R1 B1 Y# _/ A/ ^: m
    8 a# K' I- x! g
    以下是异常检测和监督学习相关算法的适用范围:) c: y9 d7 h$ ?
      {2 F8 Y5 ^6 M% N) ~3 ]3 A3 q

    , a& q( C$ e( E异常检测* O" Q* @3 V  t
    信用卡诈骗
    1 S+ `2 M9 B5 D% i6 q6 h制造业产品异常检# E) w9 Z* v5 i1 l# a9 |* i
    数据中心机器异常检2 @1 x& m' ]3 ~- k
    入侵检测
    + D4 f+ T; f$ B, \监督学习
    $ n9 |& n; X! {- E/ S垃圾邮件识别, \2 d7 t/ l! A8 i3 h; ?% e% w
    新闻分类
    $ t4 E/ R7 u8 x& y8 d二、异常检测算法
    2 ?3 f" r* g0 U' e0 F  k, P. r% X' B- ^2 q9 w6 B& L

    % V# `1 L" I2 Z4 _3 J* F
    1 z& m# Z; v# O4 M* D4 @  Z
    3 f8 w( ^( ?3 F0 ]6 a

    7 R: Q, {; E6 ]1 M) F. X8 H- ?

    . F. k* y9 {$ |  oimport tushare% l, ]$ h6 `% _2 i9 a" a/ ]
    from matplotlib import pyplot as plt9 |3 R7 s7 Q0 l' A# Z0 [( B, q$ J

    7 r9 ^8 Q. U% R+ tdf = tushare.get_hist_data("600680"): S5 Q1 K3 F4 F6 k" v$ r4 T- b" \
    v = df[-90: ].volume/ M" r( e7 |6 S# ~$ t
    v.plot("kde")
    / g0 c( @: y# W% }plt.show()* _" d; k0 q+ N
    1
    1 ^' n, e, d7 z# Y/ n4 ?0 O24 P, U5 @, |! o' j/ j4 N
    37 \+ W" ~* ~* b$ Y' M0 t$ f. x
    4
    * _0 f* ?' h8 H) _/ s9 G( z; G5
    $ f; o3 x" a3 w6 L- U4 `6
    * v+ f4 u  I; G" R) J0 f73 o2 q5 V0 }: i6 C1 @  b6 I! A0 q
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)" t' O7 G4 ^' d0 N

    3 G1 R3 x3 L: a
      R/ `! w6 _0 N( ?
    ' O  f) D2 L) ]( D3 ?% u* m& {& g

    , f" ]# ?1 [8 T" y' ]$ Y0 ?, N* m9 C2 r" e% d& x; Z
    / r; L' P% t7 I/ v* c0 D
    1 o( @- j/ ?) @

    ! l% E$ i% k5 n* L' w/ _" b2. 箱线图分析
    & b7 ?6 S( V+ W% Y7 wimport tushare
      E9 T2 S% q; @$ V% v- M4 U( t) Efrom matplotlib import pyplot as plt: E3 T& a2 {5 ]/ W3 N
    " o3 n  R% n! E- g5 q+ F( ^
    df = tushare.get_hist_data("600680")
    + t, Q6 u2 c  h) K; Fv = df[-90: ].volume
    & t% F5 ]$ n8 ?, w7 i& sv.plot("kde")
    ( }7 ~4 ^  m* M0 yplt.show()! \" t7 U! S9 N& ^' T
    11 Z4 f( W! \9 m2 \6 C
    2
    * P# w5 \  k" v: K3: r( C4 e2 I" }) y: Z  a  L: X
    4
    * w% @( f/ \# m! f, N0 ^7 u1 ^55 x- t. X/ v; A
    69 V% Y+ B) r, U9 [- d
    7: r: i6 ]! I% T3 G* |

    / r, J) t3 a. ]& O6 V# W- r

    0 a8 c% A/ h7 e  L) n% I大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!, P4 r9 W$ [) R* [0 q
    & p: C% ?9 O% q+ G2 O% d

    ! X- r8 e& A9 l7 U" p+ x4 }/ N3. 基于距离/密度
    * e  N& [+ l$ _5 o典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    + I5 h9 m; v. L& L- w9 t
    ) O0 m" n1 [7 a6 N
    % ~- t: p4 t5 b+ q/ V0 c' b2 }: I, t
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。7 r7 R8 [- h7 g8 C" l

    9 |: v0 O  Q- l% U4 n  T

    5 U, P4 |, d4 t. p3 Y* M
    ) ?, L6 c, Z0 X" G2 d. f! t8 T; ?

    . X4 u; @9 m6 |3 P" f( |
    - W0 e6 G% X' `9 q3 \
    ( D& v. q5 R( O* V6 W
    ( t( a8 o3 n: p& n; d: ?
      B  N+ {  f5 _2 p8 v3 ^2 C7 M: M3 U
    4. 基于划分思想! U/ b( j$ j* E$ x/ k
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:6 l# R+ b+ N; K( h# W3 C% {

    $ R- L5 {& |0 B7 G
    ' q& m: J  B# O2 M( ^. p4 x4 D
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。" @& n* K( Q- Q' Q

    # g* [, J+ C' |: P7 m7 H8 f
    6 s4 A0 r% g, X$ i! F; y3 n% S2 f
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:# Z. @: r# k5 s0 J
    / w7 m( W# K+ X" i/ i; D
    # W- p# \& E- C$ ^3 w  J; y7 t( G
    import numpy as np
    " _; ?- D/ w+ D: \% k1 G8 h; L+ |import matplotlib.pyplot as plt8 M2 f" ?, p; J
    from sklearn.ensemble import IsolationForest
    - U. r: [  v' L! u4 L; m# w5 J6 Z+ w: S3 q! [" r

    0 c0 N' C2 F1 i  L8 c4 v, S/ U9 N& D7 Erng = np.random.RandomState(42)/ p7 }0 n9 n+ F; A
    ( M( u$ h! f( |6 \6 w  G0 ^0 R2 e
    # ?  ^! ]. s* H& U# s" p
    # Generate train data
      I" [- Z& X( x/ l8 \' v+ }X = 0.3 * rng.randn(100, 2)
    ! H8 f4 D# }& \) r: A! QX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    : B" l9 _( |% \6 t# Generate some regular novel observations9 e0 U( E" O3 L$ w$ H0 M
    X = 0.3 * rng.randn(20, 2)
    ! m. q) {2 f% c' w5 k+ F3 B  a! bX_test = np.r_[X + 1, X - 3, X - 5, X + 6]& ?( u6 J- v& F8 a
    # Generate some abnormal novel observations. T# |9 s. _5 C: \8 V" ~4 y
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    5 N! Z6 U0 ~2 X/ A
    ' ?/ k% ]( n4 b2 H
    : h% q# ]* t; a
    # fit the model
    ; L/ d" @' f$ w+ M3 Cclf = IsolationForest(max_samples=100*2, random_state=rng)  B- }! g5 k4 _4 m0 p
    clf.fit(X_train)( z" [4 |" ^; S1 @5 {, G
    y_pred_train = clf.predict(X_train)2 V0 y& ?5 U7 X8 C9 T( s
    y_pred_test = clf.predict(X_test)# n( n: P) h/ A5 E$ o
    y_pred_outliers = clf.predict(X_outliers)
    4 m3 e! X4 _$ g: M8 b/ y! T0 ?1 z- A% S
    # U7 q# y8 ?& \- C$ g
    # plot the line, the samples, and the nearest vectors to the plane" Y* ~& `1 H) L: N- @4 v$ e
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))- l7 q3 J2 d% W: T  g
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])  k6 m; _9 G5 n. S  E* b
    Z = Z.reshape(xx.shape)
    7 q5 `" ]  B' `$ |$ u9 X) M
    % a2 ?0 W2 D$ G  i+ R
    5 Y- c- m9 }/ o' V# q- h. y) Q
    plt.title("IsolationForest")* Q" p, Q, r) d9 V* b
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    + _8 _* N6 ~% c5 M' @/ x
    1 Z! s7 {  S6 D; F* k' y
    . c  t' X" h: {' R0 U
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')8 M# H  a* F! u1 O1 @4 s9 E
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')$ X( X. p) S' w' E2 R( Z4 S
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    " f+ x" m# k" [6 Yplt.axis('tight')
    , v: |6 G: t  `$ b$ R8 Eplt.xlim((-8, 8))8 Z1 X  w) \5 ?' V! f
    plt.ylim((-8, 8))) m2 M6 ]6 E2 Z% Z# D
    plt.legend([b1, b2, c],) z& v6 n. {) e2 s0 D
               ["training observations",
    , r+ A1 u+ {8 j: M4 [+ }            "new regular observations", "new abnormal observations"],8 r. w" y$ K# J
               loc="upper left")
    . [# W- W; H" T3 t  bplt.show()
    3 E; U- N& c4 i& H% P) H1 W. l1$ m, i4 l- e. o* Z3 U% Q1 h
    2% U! q  y7 b0 |) z) t' F0 W
    3
    ) m4 h. w( i, _1 {4 k, S+ M' H9 x4
    " z/ Q9 b0 `( Q* |# h5
    ) t& y6 j. ]6 l8 |# x9 U# g6" Y. @. k: e9 w7 r% G2 g! D
    71 V+ k0 d; ?2 Q/ B8 q# \. m
    86 i/ I# p0 t5 A3 z8 z- p
    9
    3 Z8 ^' }8 W: ~7 x) |- W10
    $ T; @' [( f" G' [. t6 x11( X% U$ i% I! @! y, N, T
    128 Q' l; Q/ d) C  _8 W
    13
    ( F. ], o, \# \! Z$ }14: k( u$ m* v) q# D) O. L; F4 S3 r
    15+ f8 H" l6 C/ `3 m, O' B% K
    16! J) C3 N& B! `1 d9 [; Y; y$ \
    17
    ) T& }  P3 e8 H- L18
    + o4 `, {/ l  R% H, h" s. u192 H5 ]4 a7 t+ R3 q  k
    20, \; U, r2 h; I$ c  W
    21
    % ~2 u3 ~  C* A) M22
    ) M* B" h2 F) }3 ]; r0 |* J& P23
    7 H8 Q4 h' Q$ r4 k" q( `24: |0 y1 A* m+ L7 O$ x
    25
    * F- C- _6 H4 I( m26
    : t! w( D2 q5 q/ h0 w/ b0 ^8 _- `27
    ) W2 T- Q- _2 H/ m28% F; {7 J& _+ d( r
    29
    9 l$ a: W, ~' m, {$ D* H  N+ T30# l* K, U  S, A
    313 n& G  v: l/ [
    32
    0 j/ b9 @2 U/ I6 }33
    3 S. o: K$ j! l/ ~6 g3 _4 m( E34
    9 E& m6 Y( m2 b" V# r) _& S  s' S5 m35
    " i: H) p% R& D- @368 T& U. |6 ]. s1 j" z4 P, M
    370 ?  D! a3 K  A3 i/ m' t. v5 J, \+ U
    38
      O# H. K! R5 k* ^39
    * q: @7 C& O8 X/ A40
    ; O4 ]* G# {! h1 r41
    1 c' B7 z, n3 a- g/ \( B+ B/ L; _1 g; X9 s9 B

    4 `& w2 _$ E" ^' \————————————————, k; X/ `  ]. ~- [
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + U6 p2 z5 o9 f3 _3 R: {2 n原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    7 Y2 d+ j+ o) t  y
    * Z% }* u% d# ]' m/ f2 j( K: W" n8 O. E3 d& b* f, U
    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-13 11:12 , Processed in 0.426959 second(s), 51 queries .

    回顶部