QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3664|回复: 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
    ( c4 _3 B" H' P- E' L. R6 e: v
    数学建模:异常检测算法
    / _1 X+ m- W) w5 k$ l一、简介 – 关于异常检测' a, H! q" R+ P" G2 I& k, O2 i
    异常检测(outlier detection)在以下场景:+ S( m) l6 l' l* B
    0 \' T3 p/ O. S1 {: N
    9 R' }" d  V, x8 A2 U5 U, }
    数据预处理
    4 \' T3 |! }6 T* i* k& D" f* L7 z' \, h病毒木马检测
    ! g+ y/ N: I2 y% Q9 `; a工业制造产品检测
    3 ?" B/ z0 l2 Y( h( A7 E网络流量检测
    " F+ c! r, D3 D& g$ ]等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:; _3 O8 y% G7 B+ e
    ( G5 P: N8 L( H# A- D
    0 B# B4 s0 p/ |& E$ A
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。$ `* ], s  V# X% f$ Y' l/ H" w
    . O* Z5 w1 i4 o6 f' ^2 N: Q, F
    $ {; q6 O5 z3 L* `9 f, O4 M
    以下是异常检测和监督学习相关算法的适用范围:
      \* P6 l$ {9 u5 e3 A& l& T6 w  G3 ^2 o6 K% n; x7 j& {1 O

    ( O+ e, u* F2 }异常检测
    $ Q8 u1 f$ O0 @& Q; Z' r信用卡诈骗: ~: N* c  X* D8 T' z. f% d
    制造业产品异常检
    - ?2 @" u9 h9 x0 ^+ |+ }' u数据中心机器异常检7 w( {& S' V7 ~
    入侵检测
    ! F& V  J" \! }  j监督学习+ s4 T# t4 _1 }# Z& Y0 t. e+ b! k. g
    垃圾邮件识别1 x9 g% Z3 p: s& _6 ?
    新闻分类
    % Y% \2 o. H4 r) Q二、异常检测算法2 Y- g' H  G8 a9 E& ^7 h
    + ]8 k- q; e1 v- A5 B2 u0 z* ^
    , i& Z$ O& i6 k

    ( Q/ |: t1 t9 \4 j

    ' F/ y# [3 G, q+ [& U2 q0 @, D, S7 G. V) J6 _( u
    ; C- N# V6 {2 @# f) ]
    import tushare
    ) q. z4 w. v) ~8 L2 \4 }* G) T% |from matplotlib import pyplot as plt) U6 k" ^" K2 m

    / c& g8 u) U/ {2 O* vdf = tushare.get_hist_data("600680")
    / m& |8 @- ]& U8 bv = df[-90: ].volume8 W2 F) L- j* c
    v.plot("kde")
    7 _6 @: n1 B. I, _% o1 c1 Eplt.show()9 P% U: Q% G: \
    10 x7 @2 n# I$ s. Y( d8 a2 @, t
    2
    + A8 ]/ ^: S" `( h! h- h! k3 R' b4 D3
    3 }% w8 C# F' W  F: W# N; Q0 u4+ J) R2 v5 U5 l9 r  n+ ]
    5+ ~; @& F; ~+ A! w/ C  X
    6, S4 `% g) d8 Z; v4 W
    79 s9 y$ l+ m1 N: z
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)5 _5 Y6 n$ K0 }/ F+ w$ l

    & \& H+ L( s$ u

    # T: d( O2 ]! Z3 t/ s# I* f) Y7 n! B% q3 h. m3 u: ]$ ?% f
    4 N' {( u9 ?7 L6 G* r# z+ E
    6 ]* v1 R7 |) x1 ?: k3 _5 F2 v
    * c! I* h, j8 D& c5 }, A2 K0 I

    ! o2 @; z% U3 m) J

    7 z  W( Q/ u" ]- b2. 箱线图分析
    ) a9 _4 d' v( u% W) O. r- z6 Cimport tushare
    0 J) h; h" i, I0 l9 Zfrom matplotlib import pyplot as plt
    ( `5 L: }7 j5 s% X
    $ o# Q3 ^+ @. i" v( ~2 Adf = tushare.get_hist_data("600680")
    5 L4 l8 z, S" S% `v = df[-90: ].volume2 \) v3 V# q8 W  E; ^. E
    v.plot("kde")3 F4 P* J, C; {1 u
    plt.show()
    - C3 i8 ^$ c1 H& M- d; Q1
    ( N) X+ _. i, G7 q7 W+ M1 q2
    5 x. M8 \, N# e5 y; d3
    9 D( O2 Y5 D+ G! V. V/ L- a4; @* E+ I9 A$ u; R2 L0 x5 U
    5# B$ Y9 Y# \0 u7 A3 J
    6
    1 Y# B, o: h% f# e0 K4 I* R7
    4 Z- ~7 F( K& x3 x( v" A  f
    " }, W, T: ]# J) M

    9 D: f7 Z% r* v1 B( }" k3 a) Q大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    + }8 _+ V# q5 o- P: s4 R8 x- n3 ]& \  j

    : C0 o2 b8 {* O3 ?! i) J3. 基于距离/密度
    . ?- J1 N& T( |5 T: X- W典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    : m+ m) G/ R$ f0 r  @1 k+ ^3 u
    ' K& [, U: w+ `
    ( x  _  p* n5 o- }1 m5 v7 I. U
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。, G* I9 o, l. u: ]

    * c  y* O4 c" I9 `

    * h/ s. ~/ J# T, M
    / b; S1 z  Q7 r6 ?$ N: ~
    0 \6 N6 Z1 o, _5 n

    1 K! y, ?6 g4 v7 H9 x$ N

    0 o. e' u+ S: t9 ^' v; k, b# t  G. t  B

    9 |4 ~6 ~3 o$ K. J4. 基于划分思想
    5 S- n0 \% q8 Q- ^! c% e1 n典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    # D. ?1 s1 c/ B7 U2 |/ B
    & p( a# Y6 H2 X  f6 i- Y" U

    ! z' I# n+ E% J7 c* n假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。/ i( C4 U; z! C  w! }

    6 N$ {) k/ @# \
    3 q4 c% r* l' g$ P; O
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:' J: G! H% O/ b- h- U% q0 `7 u' j
    1 z, S  W2 a. {+ z

    $ j0 v3 B: |  B: o8 Dimport numpy as np5 p2 M+ J' d' I1 w: r/ Z
    import matplotlib.pyplot as plt
    ; l" w+ w9 z! |6 O1 efrom sklearn.ensemble import IsolationForest
    ! K/ h: l) \0 P6 [# W+ |" N
    / y  C0 |' |0 W, S3 C- m

    8 Q# D5 {# w  v$ A: \7 J' Grng = np.random.RandomState(42)6 }# _% q- \6 W8 A$ m; I; t$ _
    % _2 u1 h9 v2 y' `
    ' b4 T- _8 t  _: D- t; P+ ^7 L( n
    # Generate train data
    ! l$ S  g& L  s: ]' H! y2 g3 JX = 0.3 * rng.randn(100, 2)4 N' N. A0 X5 B3 M9 A
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]1 R0 S' B( Q& z  u6 e0 T8 o! [
    # Generate some regular novel observations
    7 h$ I/ c4 S$ Z, D9 I- i4 UX = 0.3 * rng.randn(20, 2)) C$ e, B; P1 D# K
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]! q! R& G( c. u( I
    # Generate some abnormal novel observations" ?  X3 m# N; k+ s. ]6 U
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    , x5 P, n  `- l, y& i7 ?
    5 d' Q* z! n2 e) e, G
    / H" a& B; P: C" B
    # fit the model
    ' q/ S* q8 J' K  k6 ~clf = IsolationForest(max_samples=100*2, random_state=rng)
    / \* i% G$ o0 \$ Tclf.fit(X_train)
    - R1 w2 ?- o/ k  o  b1 Wy_pred_train = clf.predict(X_train)
    0 p( A  n8 w2 o9 Qy_pred_test = clf.predict(X_test); V$ }% J( D) }, H* T& Z3 a' ~
    y_pred_outliers = clf.predict(X_outliers)
    $ ]( d5 _) ]7 K" l) @6 W  N
    + X) y: @. m% D( \7 h. |
    3 N3 @: F3 s% c3 W/ ?/ ^4 A
    # plot the line, the samples, and the nearest vectors to the plane
    ! g( x5 v1 t& E5 Bxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))+ `4 Z3 ]8 m* i7 b
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])8 G1 L+ ~  d$ Y/ B: Y8 h" A- B
    Z = Z.reshape(xx.shape)
    $ ]2 k* o8 c+ [; f% K" _: F  ^6 ^% d" t3 r3 L5 o

    * Y# A$ \4 V9 [plt.title("IsolationForest")6 h  Y* V5 l; j* ]6 k$ y
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r): e2 j+ G: K' e, N7 o0 h0 X8 Y& [4 ?
    ( x; S1 |  F) U1 B0 Q

    6 X6 c) \7 [3 y" o* S& J# F! G6 Xb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')6 D0 [8 a3 Q: p( I: t
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    0 z9 A, w2 B2 I- Hc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    - ^. {# N+ h  ~" l' a% Bplt.axis('tight')1 @: V+ m' f) b- z+ U: l$ }
    plt.xlim((-8, 8))
    + G$ ?4 L1 V1 O- vplt.ylim((-8, 8))" u; u9 I# S, l
    plt.legend([b1, b2, c],0 D$ s% P& F& {1 E; M1 R0 I
               ["training observations",
    ) N) |6 F8 s/ U$ a' W            "new regular observations", "new abnormal observations"],. \( f2 O2 _: F% o4 ~
               loc="upper left")
    8 |1 C: f5 c) T4 S/ C0 E; Uplt.show()3 g# G. A" Y0 k* I% s
    1
    & v3 Y7 r4 o' [! b* e24 I( s* D9 N; a9 I7 k
    3  V: i/ }" O9 p  _" V# P
    45 I5 O" a1 z0 t( `* Q; f! V, f( B
    5
    $ l5 s- E: Z2 D  Y6
    % E' j+ F$ U2 D  k( I& k7
    . r- H; a9 S" P# F86 ]. D7 n6 P' _3 r4 U' I6 w- Q5 \7 T  r
    9. r+ f; K  t) e# X9 E- x
    10
    & u& J( y$ v" z  q11
    9 \! B( Z: g3 G$ [5 ^  M. T124 e* b! A& y, s. b1 A5 x
    130 l" k. ?9 u& F9 x( v7 d
    14
    + b+ [" |+ W" l& e15
    4 T$ _1 r: W# X8 k6 t16) g% d& \. y4 A* ]( h6 P
    17' q) l# Z& e0 h8 [2 R+ b1 M  h
    180 d1 x3 _" D' e. X6 C- N
    19
    5 F3 r9 F9 V! h8 H20& d- r+ W  f& B' G+ V' j- C1 `
    21  l# V1 D9 m' e
    22- o% b; M) t1 \4 j: G+ f& @4 N* r
    23) n8 l- `/ ]% D2 _. H
    244 t) q3 h2 ~" c( z+ T( H
    25
    $ t/ n  K& P8 g: p26: u0 n& L1 E8 A6 Q
    27
    + ?6 v/ Z9 I& X+ i" H7 m28
    ; Y# S  {6 Z/ E: K& ?4 z29  k- U, ~1 o3 r+ ^6 P
    30  r8 z% @4 D9 k0 M" O3 r
    315 a' r' M! B. s& B
    32! D0 N5 m6 ^) M0 O0 x. T/ ^4 s
    33# F" W: `% s% W8 z. v$ `. N- f. O' S
    34) c, I7 K3 W8 n, v
    35
    , z) o; z+ E! g36
    ' `( k& h  N5 E37
    $ L6 _+ H1 g# Y! Q* I& v381 C8 n  @* m2 \) z# L; }
    39
    2 T8 @( X3 C/ G0 Y4 {  v- Y; i+ y404 E2 k4 o% A& `  p2 ?( a
    410 l9 s, t6 _! b6 n: G$ @2 i

    ) r! J. Q( F: r- H. A' p
    * R1 U. z, g0 M+ e
    ————————————————
    8 v" o* Y+ I) o版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* m; y1 F8 g# K7 d/ K4 e
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    6 r4 H4 H$ x! N. X
    ! Q: Y- V3 y$ W$ M0 N  A. c0 g
    ) n5 G- m) ^! i2 F2 i0 D5 s
    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, 2025-8-20 08:26 , Processed in 0.511332 second(s), 50 queries .

    回顶部