QQ登录

只需要一步,快速开始

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

    ' h+ @* U. Z! e( p/ l数学建模:异常检测算法
    7 X- l- F+ u% g4 }/ v: C+ S一、简介 – 关于异常检测, }/ |# m+ O$ \2 m) z
    异常检测(outlier detection)在以下场景:
    & [3 H$ f& u# _5 _0 V3 }1 r7 y4 `2 T  z/ p! i

    3 M2 v$ P  o8 P; [数据预处理
    % [- b3 m% J3 ?. j. J# k病毒木马检测* Y' t( _& ^0 d3 u! B" L) [0 e% x
    工业制造产品检测) x, P6 p% d" @! f/ D/ f0 t
    网络流量检测
    8 R/ ?0 t3 ^6 [9 c, ?等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    8 p. h) u8 ]9 ^& l! J% @3 s& T. F6 J# |1 R3 [' j' g9 k" V

    8 f7 h, X/ P, m& V- y监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    : Z0 f! }2 Y2 G2 y3 {2 W  t- t! N( x9 n
    ) R9 x7 F% \" n! X+ T4 c
    以下是异常检测和监督学习相关算法的适用范围:  C% K0 w$ w* g+ z& j3 ^

    2 P+ `2 k- z/ H3 C* t# z0 @
    $ \/ L. Z! A# i1 K/ X
    异常检测! v" R8 {4 M& v. k
    信用卡诈骗
    3 d3 t, C7 w- h制造业产品异常检
    + J9 C( |; j8 Z" J9 C$ A4 t数据中心机器异常检
    $ ^4 m$ c$ T+ E入侵检测
    2 w( z# ~! u0 B  d! m4 Q监督学习/ {; U6 _- B. P& K% b9 _
    垃圾邮件识别
    ( _1 |: @& W* v. o( P新闻分类2 U& [1 z. o9 b$ a/ ]# t
    二、异常检测算法. x# I: c1 \9 n

    : \5 e% l* f- V! A2 x9 ?
      F0 p8 g' a% l, J1 q  p6 G; R+ v
    6 m  K) N0 g: k7 P) `

    ( X  l4 s& d. y: @5 r5 A& X: X
    % k! w) F, C, z8 u

    " u% U" P6 L7 f, pimport tushare" ~  A# X( }5 ~, M6 h( s! o
    from matplotlib import pyplot as plt
    $ S& @: l5 b+ C4 I( O8 `1 ] 3 a; |- ^' J6 p: ~
    df = tushare.get_hist_data("600680"); \0 @4 w. U4 `; ~1 K' D1 e* j
    v = df[-90: ].volume$ u8 S0 T) |+ T: H- m/ a* E. N
    v.plot("kde")
    2 T$ k. V" ]; I" w& G/ t# ^plt.show()  z1 ^3 P( l3 @# V* H. E
    1, N4 y8 c6 E3 l
    2/ `5 W4 h# c, n) G9 b
    3
      X7 j" K4 S9 o1 \& g4: q+ D5 Y) `" i) F$ ]# \7 `+ O' j
    5
    2 B$ u& _8 a- R6
    , Y& ^/ E& e' }  i4 y0 {; |7
    3 E+ ]8 X; G9 c: Y近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
      {) B  X/ `' B# \2 O& {9 A! h) |9 o8 Q) x% b7 H/ P  Y

    5 Q* D3 u5 Q- M, [) }/ _6 x8 g& b0 {( D" u
    3 s8 p9 T$ N; K& j

    + G  n8 W5 i1 a; Z+ M/ X2 ^$ @, G; D" t

    6 M% j& x8 [$ f! g0 ?' L/ ^1 Q4 y( j8 N% ^- |% {6 C* {

    ( N6 A8 A: M8 r( @2. 箱线图分析
    6 m# Q6 y) m& q/ g3 r& v$ jimport tushare
    4 v# o9 U- `7 U- a* Lfrom matplotlib import pyplot as plt, g% W* `  V# U/ C0 o

    1 ?& Q( ~' R! R; ~9 m$ xdf = tushare.get_hist_data("600680")
    0 x# e' b8 E* w  y" Rv = df[-90: ].volume
    ( M6 M1 w* i! @- r: _* c  x8 tv.plot("kde")
    ) m" }$ z6 h$ h1 |2 i# n7 g. Tplt.show(), c% V( ~7 p( U. Q+ v# d3 s
    1
    0 O( {% B& C1 G1 m4 ?/ ]2
    ) L) f% \4 j# B+ s4 }- R3
    6 H4 b( i$ Q- i- r8 Z0 m( K4
    ! B4 P) r6 c8 B! |5. B6 n* z  {" S5 e( m6 Y- G& j- ?0 S
    6
    + i' r8 a3 `  {9 @. E7* c* I7 P9 _% M! i0 Y+ M0 J5 H0 z( l7 o

    - M$ l. k2 r. g4 W6 D3 ^+ S

    * E$ y; d  j" L% [大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!9 U: w3 n7 }- {) Q# q9 j% h. W
    ) m. `3 r3 C. X$ R
    , z  X  [1 H4 b! x) U. h
    3. 基于距离/密度' r5 R+ t. i6 A/ K
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。+ Y+ K0 c" E! x8 w

    7 C) M! H( u% W3 h, N
    ' H1 N  J4 B" [, D3 m
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。  C. s% k9 G$ q
    ( F. T% C1 f% S7 v
    0 z. a5 \8 A- t9 m  s
    ) Z6 q7 ]# `9 x: V, E" V

    " ~6 |9 i% a; Z' r
    $ N' _6 u( u3 q/ \/ N, ~  e

    ; j" |, o+ c4 {  G8 k- j8 f0 x- r4 d

    ; F! q* H5 ?7 E% U4. 基于划分思想7 U  Q* ~+ `2 l# l8 L) k/ U! O3 m
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:- ?0 i  k8 C" I+ |" R9 D2 o( s7 \! g

    ; }7 c6 ^; D- w! T* H$ S
    ' M* e. Y5 F3 `% a
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。! X$ R- i% P9 E" n- ?) ]* H
    1 E2 C7 z- o/ ^6 Z

    1 U8 `, _' m7 X# j4 O- h这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:! Q; k. I' z; f& S2 O3 r  S# T

    / U" L& [  _) N3 \1 E  A

    , j, g% i. i- ~: T/ {* Y/ ?import numpy as np1 h) q7 L' n- f; j3 y
    import matplotlib.pyplot as plt7 M1 v5 Q+ h: d6 l5 }' ]
    from sklearn.ensemble import IsolationForest
    : A  ]' h! K5 @4 z6 s% l; U3 w* s# |! t9 c

    # u# B, L; x7 K/ N# a6 s  ]$ ^rng = np.random.RandomState(42), z& l* z! ~1 Q' E

    # {6 `" F+ l. x8 n

    ; `0 m# r8 ?" w6 a$ _- O# Generate train data
    , S' ~5 p* e3 n/ Q2 H0 t* |& F8 @# aX = 0.3 * rng.randn(100, 2)2 o; v7 ^3 N4 ]$ ~9 l; t$ Y
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]4 b0 S+ J! D$ I) F
    # Generate some regular novel observations* |" z3 L# ?9 v" K, j
    X = 0.3 * rng.randn(20, 2)
    8 y' ?5 p+ P* Z- @X_test = np.r_[X + 1, X - 3, X - 5, X + 6]- j" J& E! F! i: o
    # Generate some abnormal novel observations
    ) @. z# M( ~/ {( z) T. Q6 qX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
      @# l) q7 a* K7 y9 A* ^- Q" ~; ?2 m$ f
    2 ?! [# m' }# k# b
    # fit the model
    7 P. N# z4 p8 _0 Y; Hclf = IsolationForest(max_samples=100*2, random_state=rng)8 l, U6 y9 E- t
    clf.fit(X_train)
    3 g2 N8 v, ?9 {y_pred_train = clf.predict(X_train)  ]) I- @( G* Q
    y_pred_test = clf.predict(X_test)
    $ p1 z9 g8 c$ z, y& i. T; U: jy_pred_outliers = clf.predict(X_outliers)
    . O' f( M# q+ a6 B1 N1 }, b
    . k- N& Q: `5 A+ o. j% O/ O% e
    - a5 t0 v, F9 ], R8 O. k
    # plot the line, the samples, and the nearest vectors to the plane
    & r4 F* X3 ~6 f# hxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    5 s) W# X2 {0 P5 Q: |# OZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    % D8 g& J3 F7 j/ o# _  a9 K3 hZ = Z.reshape(xx.shape)
    # O9 I. a6 ]: I0 l& W! P8 d$ G2 C6 E# O9 `
    / n6 M: y0 N" H" p7 z( J
    plt.title("IsolationForest")
    7 W. u: g* d- a/ uplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    3 b% i. S0 |2 S$ Y
    % ]9 L2 l5 L. ~
    1 M& t* D5 V4 K) M1 v
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')% W- a3 C; }5 R& x( `! z# R
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    : Y! c# w4 P" H6 cc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')6 r- B- R) j8 k9 o
    plt.axis('tight')6 m) H7 o; C1 `+ K, i
    plt.xlim((-8, 8))
    ; F' S7 P& ]% g" S/ mplt.ylim((-8, 8))
    + h) N& W% ?6 ~* k: B/ `plt.legend([b1, b2, c],
    ' e4 }% r. `# P5 [  k2 }. F           ["training observations",- A) o9 H1 q% {' a" T
                "new regular observations", "new abnormal observations"],
    1 M. R8 c7 }7 F" f1 A+ Q: l& W5 v           loc="upper left")
    5 `$ i$ j6 y% f1 W8 `/ G8 Mplt.show()
    1 ]6 F' W, U6 u2 _) P- M0 X4 O19 s! C* Z/ J( l( J! b. C0 z
    2* J' \2 h* _  H2 @
    3
    ) ]" s' a0 N1 ^4
      S0 q1 U2 {/ @; `( u5
    * ?$ u3 e0 E! }+ D" f2 l9 g+ J67 b& V. g/ [$ m$ S+ O
    7
    . l/ |( @# r! R& \" d8 `5 X8
    ; s) ^6 N5 f9 t  g9
    ; y% x. D" u: K- Z102 S2 J4 y; Y0 K; Z1 X
    11
      }% F9 Q9 i, G. ^9 {12. k: E! V5 b$ O& I2 F
    13
    $ Q; H: \7 S6 ^. j& o# ]% k14. `& W3 f% K  O! W: s8 c
    15, t: i& V5 |; ^& r6 ?
    16. v4 Q/ F& i' a( G! |  o
    170 C' w' X  y. u7 W
    18
    8 z8 g/ F7 w# f0 t0 y1 g. ^4 R194 o4 V- C4 h4 ~# H( U# s1 p
    20
    ! z6 _" C# z, m; a218 x# D' S8 c6 h0 o/ A- y" X
    22
    , O/ ]. T& F' y0 m23/ W0 [& z' N8 Y# W: d( b8 F7 a
    24
    % `% z4 ]9 ^+ C! ?25
    . p* M* l0 D! ^26
    7 p% g9 l- @3 m4 f+ Y27
    1 a/ S/ ]/ v, S- a% ?288 e) ^+ a" H* D0 d, v
    29
    / Y6 h) {( U, E& W- |: R30
    ; l5 X5 [$ `! J. `: {31
    % o9 |# x$ ~8 z- t9 V. P* k) B# M32) ?5 y1 n6 @% w' s. g3 X8 ^
    33
    2 Y5 D' l1 h9 f7 o7 r# E7 F34
    ' W) A' `4 ^7 |! F" E. a. Z6 R35$ x: t7 i; e) a( {7 Z
    36
    , L$ w& f3 \3 W# [. i4 H37
    # m1 @+ ]. F1 H4 R: u3 o. f  u% g38
    ( b4 b, @8 t3 V7 r7 S2 M+ w) n2 y39: U) W$ S; s3 m2 x9 H
    40! g1 L& }, v0 ]1 g# g" \
    414 L4 t7 K0 h' U/ D+ @6 P. q
    ( t, Y  `$ t, f1 [' S6 R' O
    - ~5 f$ H0 p( Y9 w8 A
    ————————————————
    % u+ V1 I/ H: w) a版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 I5 `8 y% `7 v原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231290 z& q0 M( N: M! L

    7 v9 z2 _1 ]9 |0 o
      ^8 E! H( |# D: [' }% \# v
    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-16 05:05 , Processed in 0.429792 second(s), 50 queries .

    回顶部