QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4004|回复: 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 h( x" M$ R! Q3 F0 e5 I/ F2 U) h数学建模:异常检测算法* B  ?  Z: m- e% n5 [
    一、简介 – 关于异常检测
    4 k2 q. o9 z9 a2 B3 Q异常检测(outlier detection)在以下场景:7 R  K6 Y1 a5 Q" e/ X6 S% x
    : {% \/ X1 g, s0 [5 n
    # _$ K$ l; B- `, ?2 a
    数据预处理: X# y; W7 U+ P
    病毒木马检测/ o9 G4 e5 G& P: D5 F+ C; u7 d
    工业制造产品检测
    9 g1 f2 p( ^) f% E4 X  d, H网络流量检测
    4 q" d0 c4 G7 o" n" ~% ^( O3 ]等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    1 s- e" R4 |* k1 ~. v8 T* b
    $ x% v9 {. L9 H) {, X! L
    $ z5 ]# d  K/ w3 E0 k1 a4 N
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    ! u. W) a0 y! J0 B2 }! [. R) }
    $ g' I6 D$ X5 ~8 j
    4 g" m$ T$ ^" F; k; G
    以下是异常检测和监督学习相关算法的适用范围:) j) k' V# f/ B

    0 ?. Z: J# j/ D: _" J9 ]
    ; F6 w# k- L; C4 l( @; B
    异常检测
    ) L% T0 ^& F8 Z0 X' v; c8 A* M信用卡诈骗
    7 {& s3 J1 _- O# G7 D" J制造业产品异常检' e  H: N2 x2 K/ o. K; a7 q. n5 T
    数据中心机器异常检
    % D" T$ z  Q( F. @7 H9 S7 l入侵检测
    % w/ U. c, |2 [6 x. C. @( }监督学习
    5 ]% j3 h( T4 u* C/ ~垃圾邮件识别
    9 \- W6 w8 Z! [$ ~新闻分类
    : y* h5 ?" s1 y5 M  B; A% x7 @7 s" \二、异常检测算法
    % w4 W+ I5 g  ^' m
    3 W5 F% u& B# q% P4 e) C9 Q

    0 V: g# N8 |' I1 h1 \4 Q
    , ]+ Y* l2 Y2 |5 a+ |4 T
    : r$ I+ A5 C7 a
    ; H' n$ Z/ A5 {* P* G! x1 L

    ) T4 l3 x* D" |: K  Pimport tushare
    6 ~6 X9 k/ c0 h$ D# n" nfrom matplotlib import pyplot as plt$ l: F: K1 \+ _. ^* k7 T
    # Y" B5 L- O1 Y
    df = tushare.get_hist_data("600680")+ ]1 I+ ]) Y% N# e  g+ t
    v = df[-90: ].volume
    0 e! N' u: S+ M( [8 V8 D& @3 tv.plot("kde")" e" Z; [- @/ _5 m$ G- f8 n
    plt.show()8 A; C2 S3 Q/ a, d# g( k: d5 L
    1
    5 ^. r% F' Q) w" v/ v5 g2
    / i/ v& k* k+ f* f2 D37 r- a3 r% S2 J2 \
    41 Z& C6 Z( J; W
    5
    + U4 a  Z& A1 s3 Y6. q/ C8 t+ E- U# R) @1 D. A, P
    7
    . t( R0 t0 l  e+ `近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)5 f% B0 i4 V' E1 A7 p

    1 n: G' b: X7 n+ G% |

    8 |4 E1 \/ t( g% E5 {+ m! G0 _" Q+ U; X! S" s. C
    ' K) O" f! ~3 ^+ ^

    ' T# M: C0 d9 }# ?1 Z5 t. R5 x

    , {9 ^+ T, L# {! R% x  S
    # ~6 m) u/ ^" H) A
    9 d% N$ T( T+ D$ u) o1 q
    2. 箱线图分析
    - l7 g+ C/ r+ [" t( k- ?import tushare4 A0 H! K6 L- z6 s, C1 g' |
    from matplotlib import pyplot as plt
    # Z7 r' h& B7 J0 `: S  }) \ ) d1 D% z3 `4 N1 g2 D( b* |
    df = tushare.get_hist_data("600680")
    $ q, e( G! D+ h+ ~* l# a% fv = df[-90: ].volume2 P/ i8 V7 u6 H
    v.plot("kde")# f% |7 b3 u# N) p
    plt.show()1 O& f* ~; T2 t
    1" s' _0 V' I/ N1 v1 {7 D
    2' t5 ]: S& Y4 s; G* Z' Y
    3) b$ v# V) s/ k( Y
    44 m5 q9 w7 V% R; e
    5
    . O" R: v; G, y- R) e6
    . m/ H9 j- [, S7+ L0 t# b' r4 h! I* e. C4 z

    : w4 H5 E) [6 ~% W+ B. _& z

    9 _" A' h) o9 y大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    + ], P' ~! n' C
    6 l: i2 d, y( S; w

    1 p8 T9 @  L, z  ^; {8 n8 Y; {- G3. 基于距离/密度$ |& O  r: L- ^7 L& v( n* w
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。- t9 H- {$ @& w2 ^
    ; b; K" {8 U, ~" i. q" \6 B7 @

    & o7 k: A" d! p, [0 D1 A" x用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    ( I4 e, ^  I1 c$ d7 j/ M0 s( W2 }% D7 Q" ^) Y8 n; g# I

    9 S1 e7 j) E0 J6 @+ v7 A
    ; u1 E" [! k. H8 `% r; E

    6 w8 M2 w4 c4 P1 h- d3 U8 |  S4 |  s. b, Y& z; Y0 I5 ?

    2 ^, A! w# s- R3 C8 ]2 e2 [6 N% w+ g/ i; o
    / w! `9 Y8 r: C2 d
    4. 基于划分思想! H' b" R' G" Q* i, j
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:: J; k& D! Z) d6 Q1 K

    , |9 Z9 J6 \* U9 {5 |( f0 T
    7 j' p5 i) a2 d+ [0 Y1 M
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。9 N1 t0 w: h: ]# p% {1 c/ }

    - \6 ^  ?0 S( i) l: M$ u
    - V5 o% C! S# w6 L
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    & k: t/ G2 B" \" _( N) M4 o
    2 f$ x  h& G8 M6 Q3 p3 q0 l+ R
    4 }4 a% c5 ~7 R& o9 D. _
    import numpy as np6 ?( v* e; W$ L1 U' W: X, \6 t
    import matplotlib.pyplot as plt
    ( ]! H0 C! s$ b% i3 L' S8 ifrom sklearn.ensemble import IsolationForest2 R3 \2 p: ^0 v2 e4 I

    # p( q: J% e, U* e' o* R

    0 |/ l) ^0 u0 grng = np.random.RandomState(42)2 Z) p$ Z0 ^4 x  m+ G/ V
    8 L9 G/ z; C$ c: M" R' I, b! K
    " m- C3 D4 s% z4 Y
    # Generate train data
    $ p" Q% Z1 T9 EX = 0.3 * rng.randn(100, 2)
    # S) G$ x) K3 J# i' w% B. S  YX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    / n9 Q, W3 Q1 F2 k# Generate some regular novel observations) r. F0 Z, |' @* C% X4 u
    X = 0.3 * rng.randn(20, 2)& g! J3 T# N1 F2 U+ c! m
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    0 H* [9 U: }; P. B# Generate some abnormal novel observations
    ; M+ ]# @3 p7 ~0 l* SX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    7 q4 R5 @9 Y" }. m8 [+ L% N" E! Z& x7 W
    2 Y- I( t8 i5 c% o7 e  B
    # fit the model( w, \, I3 L8 ?
    clf = IsolationForest(max_samples=100*2, random_state=rng)7 P: @6 }7 v& R5 y/ _' B8 ~1 v
    clf.fit(X_train)$ A  F7 |% o. E! q6 [* ^
    y_pred_train = clf.predict(X_train)+ u& t& G: R4 x4 x  z3 P% V" M
    y_pred_test = clf.predict(X_test)  N; F, q6 g5 Q6 g, }
    y_pred_outliers = clf.predict(X_outliers)
    $ f+ X! L& m% }8 v* ^6 a5 k* y
    $ U8 G$ b, M/ O0 U

    7 X7 y. {9 p. X0 @9 s, v, P# plot the line, the samples, and the nearest vectors to the plane
    # p$ X5 x- F9 h( Yxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))8 l- @8 j) \( s* H$ I
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    9 h) Y. w# W* R1 Y7 a. C1 fZ = Z.reshape(xx.shape)
    , T: [5 g% t* Q4 d5 \9 X6 y
    ; q. l, Z2 }' k

    + v  p  u  }5 }3 k+ }& a7 A; T2 o" }( Jplt.title("IsolationForest")
    2 W5 f. l! c/ m  I* v; n! V. A& ?plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    : I6 `* n2 z% B' I% F. d* O* u* p+ O# u8 J- [* }/ @  q

    ( F/ ?2 Y1 K% U7 c7 C) Yb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')2 q2 D# J+ E* ]0 V8 \( R( X0 s
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')9 T9 Z3 x) [/ d
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    ) x1 X# m( l8 o1 _" O1 Cplt.axis('tight')0 `& G$ p! r7 \6 p# j
    plt.xlim((-8, 8))7 W2 G" f  Y. }# c$ ]
    plt.ylim((-8, 8))7 H8 z, z  f! i; {
    plt.legend([b1, b2, c],
    . `" P, R( D5 T! x! D/ @           ["training observations",
    % v$ W' s7 K1 u; z9 `! F            "new regular observations", "new abnormal observations"],* b* ~+ p; N$ z( }" z! m
               loc="upper left")
    # ~) n1 h! ]  C" Y* c. l# p# oplt.show()
    % }1 l9 T5 Z% `4 i% f; X8 E$ h1
    $ [& X' Z$ n" W2% O2 X9 n* v8 U4 |9 s8 @+ A/ M. D( c
    3/ v& F: _# c1 _  c9 e
    42 ~2 ]8 }- }( l" A2 L1 b
    5
    / A8 a% E# `8 A% [0 u+ c* X6' H: V$ w8 T/ I
    7
    + x) z& w3 U) ?* N8
    & g) v: `" }: G) _9" p0 H5 T0 [+ W4 C2 h4 x) q' x
    10
    2 H3 I( l4 D! i1 C11
    3 z  `2 u+ \$ l7 [' y/ ?# t  |125 f5 J$ ~* e9 b4 P0 M
    13: P) y" _" x9 T1 _3 o
    144 |/ c! |5 [, r5 k) P
    15* |- m9 F1 B( V3 V& C0 ~' l
    16
    : |# H  G. G5 s: H3 d, `0 D* X; m17
    , I5 @5 a- M6 w# C2 P18' S5 g0 T5 V( W+ d
    192 u) D4 v1 r9 t+ z: ]
    20
    ) z6 i. O. H" Q21
      _$ v( x- @8 y/ Z1 i1 v2 d22
    $ Z/ ]4 C$ v  ?' O6 q7 {23: [% t/ Q4 R. R) G' i- S
    24
    + C6 G6 D0 g0 O7 B2 F$ x. s2 B1 _25  G4 V' l: L" i8 p4 C! a6 V1 s# W
    26
    8 t9 C( v4 l+ O, O* l! s27& v2 d. L( {: `6 ~. _9 L
    28
    0 {; d, ]0 e  ^' p$ @. }% Z3 I6 {5 V293 L0 V6 q  j; d+ u
    30' S) K. m9 r2 n) c) n
    315 M) n" q5 R& \( c- ]
    32& f. p' ~! h! ~* X' h
    33
    1 G+ W, o9 b9 }2 M# T) t34
    3 m# ]2 e% o  _) R- [: l35, z" g: U5 [2 Q. u5 b& ^
    36
    , [* I2 ?: t9 J% A, s. C! z37
    6 f/ Q% y6 ~3 l# {$ C8 C! R& E0 ^4 F8 q38) ?# l' V" F& r$ ~3 }; x! n
    39
    7 X4 H1 e' W( L- {% L  m; V* ~7 X40
    ) W, g$ j! _) K$ {; H41
    ; r) M1 G6 }# ^7 c4 ~; D+ p/ Y. L+ n! t1 t/ M

    9 Z) G  z: ^& O4 C# g1 i# \+ O————————————————
    1 k1 G' ~, B" o# t版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- R% f& G& E' L) E% b' d1 ?1 d
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    , k7 P7 E+ n* Z% C# I5 \. W1 y8 a( v* C5 H/ L

    / F) b* L4 B, B+ a7 A) d
    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-8-3 05:12 , Processed in 0.411166 second(s), 51 queries .

    回顶部