QQ登录

只需要一步,快速开始

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

    ' X% `+ @& G7 l1 `7 d1 R" L; q数学建模:异常检测算法# |/ I0 F+ O( R! u1 H& U+ X
    一、简介 – 关于异常检测% G+ Q) N: w+ H- W
    异常检测(outlier detection)在以下场景:; ^2 E+ j( P; k/ x3 _
    & G6 k* P+ z4 C6 L8 V) b
    + x0 H+ g8 X+ V. v; a% w
    数据预处理
    3 K; T" Q* i- ~病毒木马检测
    - q" U" W/ y( t" ^( r* j! H工业制造产品检测
    5 T3 }& i. R5 [# d6 z. s# C网络流量检测
    & Y, R7 S7 H! [) K9 T等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:  R% C* {0 o2 @' f: b9 e

    * P# b8 ~# K  p0 Y( O! S

    & ~6 A7 M/ }+ Y! r/ v" y监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。% B! k& O. p7 N, J& k2 t: [
    5 B! B. P8 [. X3 K, h* C" S% K2 c
    % k2 {0 G1 f! ^7 Z
    以下是异常检测和监督学习相关算法的适用范围:$ c7 J9 p% `9 m1 p4 m2 C5 I
      J2 u6 L0 M% b1 Z+ `- a

    8 |/ U0 e( o- o异常检测
    1 X- L2 K: d5 f7 W, |7 Y" l信用卡诈骗  ~- F/ f8 I; b( j/ ?
    制造业产品异常检  {+ u6 o0 t% C/ ~+ h
    数据中心机器异常检
    . S. V- W9 g0 x入侵检测/ m5 p9 f5 p( U9 d
    监督学习
    3 c' ]) a5 l# G$ @+ n& P垃圾邮件识别+ i7 F& k0 v9 R0 K5 C/ w- l7 Q! R
    新闻分类
    ' o" ]# a6 ~+ h) ?& k二、异常检测算法; l6 ^+ r- E0 t% H$ D

    , `9 \6 U) w. P# p  H, Z
    $ }0 @& l8 E  J4 ]1 V* W
    1 D& f2 K* K1 M* g1 y$ Q
    4 ~7 @" a! P& d( p. k5 T5 {

    & ]$ z" R, `: P7 ~6 [

    9 @4 K6 l6 @8 h+ i) ?2 Pimport tushare
    * d) k& G6 ]9 B2 lfrom matplotlib import pyplot as plt: _6 v) d) Z6 d$ m+ `: O
    2 P1 M( q/ n! c& a
    df = tushare.get_hist_data("600680")8 N5 @/ Q3 _# {' T0 `4 ~: k
    v = df[-90: ].volume4 p6 d% [  k% C; j
    v.plot("kde")
    2 \# W8 z7 F  ~4 {0 c" Aplt.show()
    % I, x1 @' {0 u5 M1
    0 v5 B! }0 h2 S1 S+ a, S2
    # F  Z7 F6 H6 O; }2 M7 D6 D0 \% D3% f# E$ o- p( K) R/ \6 |
    4: k) l3 ]0 A3 ^# y# ~& T3 i
    5
    & I: D7 x' s0 D" q; d# `$ t6, e+ t$ g+ j* H) e; S. ~2 L
    7
    ' [. @8 N# P- K近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)3 L& O6 q; N- {( H

    ; q) n7 p$ l: W% o$ w

    4 |; s1 g2 S, R- J9 o6 C, p8 {
    9 @' t5 H2 T$ @, r

    9 E8 P6 \# l( f8 M% R7 C: e" y( @+ h1 S8 B$ y; e- K& N

    3 ]( S7 G. w$ k, w- H
    + j0 ?' \+ {! v6 p$ o
    : X8 i# b: u/ J4 n/ f; l. O
    2. 箱线图分析7 e) Y% ~9 {& }4 n; N: I5 z
    import tushare
    % Y9 T7 D: w# j1 a5 }) a; cfrom matplotlib import pyplot as plt
    : W% B" D. X% O, K7 x
    4 y( F; X$ H) `; u$ o1 Y4 Q! ?df = tushare.get_hist_data("600680")) Y; ~) {; A9 s" K- e! c# n( _' S8 G' U
    v = df[-90: ].volume
    2 z3 F7 c( E( O- Y. i6 gv.plot("kde")
    " B" H: U5 s, E7 p5 V% o- b$ `plt.show()
    8 G* F8 D) M) K, l1/ s# F1 i# I( h. ?" H
    2* m1 u6 [7 V) }* [: s: G
    3
    / i1 P) S, z$ r8 \0 x5 ^. ~  S4
    3 ~9 @2 A- X3 {) F/ O5- i2 h' c- g0 d+ Q3 r7 B' r
    6; i' [; f5 g/ s$ Q/ p7 U9 \
    7
    $ X/ ]7 k5 U  V* `/ j0 d. ^5 e5 }/ I4 V4 [8 p
    1 k# ]; f9 r4 L5 ?& H; q
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!  z# M3 J& k4 b' B2 `
    & p  v6 n2 |% O7 b: C# q4 J
    7 z9 u/ |# C7 l" E! ?! |" F
    3. 基于距离/密度
    ! E; H/ w) X) ^典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    8 C* P- g1 K" x8 `6 ~
    ( |! K- i8 H: q" Z

    ! D6 r4 X% {8 E2 @  ?  ?用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。+ Z: V0 j0 d9 y7 n  p  ^
    4 |/ Q) Z, x4 I0 Z7 e+ P9 Y2 ^

    8 F* A0 o6 S) t) w7 {& X& |! R$ U( [9 Q* r1 i
    ; I, j5 S! h% K* t' W7 k4 e  a
    ( D' Y) f2 A, v6 _1 X
    % Y( z6 X6 j1 o- @) W$ H

    ) o' r4 @( N$ R1 T/ S

    7 V+ h; e+ H) w1 U4. 基于划分思想
    ) V! o" f7 j3 |" T% N" `; w典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    ! f  G5 n- `/ E5 o( I- Q- w2 `3 S7 c1 q- x4 j2 l

    , r/ S8 G, |& o, q假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    & ~0 v% l& z+ O/ k* X8 d& |3 g/ f5 v
    * A" ~* C% r3 e; @' Z0 R
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:  L5 b" y9 ?" e. Y9 h, a" k

    / u& V# Q2 \* j& n

    * `# T& {: g+ {, H  I( Pimport numpy as np
    # z+ {3 i, i. p* G2 limport matplotlib.pyplot as plt
    ' Y  `, }( f/ m$ \. Z6 ofrom sklearn.ensemble import IsolationForest9 p' a8 j# u" T. c
    0 V1 z8 x: ~) |  j& t$ f
    ' g# {( N% W9 K
    rng = np.random.RandomState(42)% A+ V. N* d. e, P" T: b

    ' z/ w+ ?8 G: |- O; ]
    " p! }0 g# A- R* ~0 \
    # Generate train data
    & x. b( B! `6 y5 r; cX = 0.3 * rng.randn(100, 2). w$ A4 @# R7 p' a" Q
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]9 D8 K9 E9 _& G( i: Z# `
    # Generate some regular novel observations. Y# D6 E& D* G; e
    X = 0.3 * rng.randn(20, 2)( Q- Q( A* ]$ j" a+ K' {
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    7 j& E2 J  ]; T0 \# Generate some abnormal novel observations
    - v4 }7 E: g' w3 Q7 a1 ]! K9 JX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    ' m1 X0 j  {# v# B1 c
    % L8 Y" n. ?0 `* j" C

    ! G) `% D# N* H3 H6 A: C" w/ z9 b. u7 b# fit the model7 B+ E2 r  @4 n  O
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    - Z0 g0 |4 I: }  `7 f$ K% Gclf.fit(X_train)
    8 W4 v  _" r7 D8 P5 dy_pred_train = clf.predict(X_train)
    " d& @1 U5 R; w( qy_pred_test = clf.predict(X_test)' @9 a! X# _4 `" @
    y_pred_outliers = clf.predict(X_outliers)
    & y# w8 m; g& N, G5 g, ~6 z: s9 D7 G  S1 c$ C
    5 `. s, {7 X9 `
    # plot the line, the samples, and the nearest vectors to the plane( W# B4 @& L9 n0 t( [1 U* [
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    + n  K( z2 p6 zZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]); p, w' m) f! t; Y# n
    Z = Z.reshape(xx.shape). L9 T( _& f/ d% `
    8 q& q0 {. b/ b+ z9 ~7 `

    # \- D+ d( F7 z* d0 bplt.title("IsolationForest")
    * q! Y& o! X' j8 G% Q; x) j) Fplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    0 Q- x6 |! z. p  g! N, R7 y
    - g  {; b6 h/ y! k5 ~- g' W. |

    4 v  r( ]. f% O5 B. ~b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')1 A4 T7 |  l  h6 e
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    5 L+ ?) M( ~2 F# t. Ec = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    2 U% w5 B9 D2 z4 tplt.axis('tight')$ k+ e4 z6 O1 n3 v, K
    plt.xlim((-8, 8))
    4 Z$ G: S# C' E4 y3 }' i6 }plt.ylim((-8, 8))
    3 E3 |1 ~5 y. x. Hplt.legend([b1, b2, c],: t+ ]/ x$ V& J$ `
               ["training observations",/ k" ?0 E" K& H% [9 j; w) c9 y: k" ^
                "new regular observations", "new abnormal observations"],
      D+ T9 B- U# I           loc="upper left")
    / R( q/ e7 {! ^plt.show()) e. S; W7 ~) F/ w1 G/ j. e0 G
    1
    & t: e; @4 ]% ?2: n, w2 x1 W" V
    3
    * G( v; y/ @. y# T4
    & y% s( O7 r* |+ X" Y5
    - w  S+ Q  j: W& {$ r1 ?66 \( {! v  P7 g% |4 f* B# j5 u
    7  b0 f/ v1 K+ g
    8
    " O" ]5 O1 ~. \3 [) ~8 L6 I9
    9 X" W4 U) R- w+ r- _10
    " A# t3 z) v2 ~8 Z11) J5 g  A; v4 {* H( R( c
    12
      _: p2 j7 F, U13
    / u6 ~/ `; Y$ I/ W146 F  w1 k1 `3 `$ D( S1 S' D  _
    15
    ( K0 D  z9 Z4 }16$ [: F* V. k8 t; w' i$ g
    17
    , @, n( ^' j$ n/ K# z* E. u$ c+ K18
    0 S+ W) A9 U8 K+ T6 x, \/ P19
    + h' i! N- T# R% N. d$ W& F20
    + {- E+ Y9 Y$ r2 B21/ T2 B/ G/ w8 D3 M: F3 I
    22. B$ f* i0 L6 K  i9 }
    23
    2 \8 W+ `0 `% O6 Q0 V. E24
    : I- r  v6 n% U+ b- g2 _. g, ?& g25
    ( h9 }6 `* Z7 _$ h0 s26
    0 F4 a) B8 m+ m. B  Z273 s( g6 Q( r. T- s$ d
    28
    , i1 C: w( N+ ]3 E' m29
    " c3 j. ?# e! p" y+ ^* f30
    7 c% c  D' T0 x4 w1 {) q31
    3 d7 s0 m! ]$ e32/ ?! p8 |, u3 F6 [/ m- v; Q( M
    33; K! N3 n* X" J% f4 G2 l
    34+ C0 q: O+ Q) l5 q# l7 ?# L
    356 y4 u5 U/ o( |
    36% q- I, F  a' v, a2 U4 h2 Y6 t
    37' N' u# o" T3 P
    38
    0 l( h/ i" h1 S% A7 @9 L0 t  S39
    ; G( i& c, S0 b' p5 t- u7 e400 k: g+ Y! _: R: a7 [; |' V
    41) _* O/ p! g! h5 D  s6 G6 k
    . K+ S5 [, N$ T  B0 r8 R+ P* ~
    ( O9 N- C  _; ^- H
    ————————————————  \- p- C8 i' R; E( h0 ~' B
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ t: }* v; J% ^; ]
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    + e7 a- V7 b$ z. F1 E# g1 q0 u, T: M4 {* B7 i, |2 L

    & ], M8 ?+ `1 j! V- Z
    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-22 07:21 , Processed in 0.343148 second(s), 51 queries .

    回顶部