QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3964|回复: 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
    2 I' n. C) b& M5 H% K: \
    数学建模:异常检测算法" u0 a+ M6 e1 E; l) D4 W
    一、简介 – 关于异常检测* w9 i0 d7 w8 ^$ M! L1 I
    异常检测(outlier detection)在以下场景:
    # _7 g3 d9 h9 X7 N7 b* J+ ?% L& Q! G# C
    $ J- a9 B6 R3 N  x
    数据预处理
    ! T, Q% R# @: R病毒木马检测1 Q, u/ H* M5 r- C* P! d  k/ g3 \
    工业制造产品检测
    # u( ?3 T, x  U0 n: {/ n网络流量检测
      K: E) `  O. G等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    7 W& s; p6 s8 D
    % u- _* [5 Z7 w9 k; l9 \

    / i6 ~) o& E/ t5 g) P监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。! U' I  Z& K6 T2 F
    & G, [- d' Y0 [# M& D4 o& @

    ; [6 |( ~4 [4 b8 l8 Y" P6 S1 D以下是异常检测和监督学习相关算法的适用范围:4 ^: Q4 Z' J. `+ A9 B
    ! O3 j' k0 K6 K' I4 d5 N5 |) g. L

    8 N4 z8 t1 a4 S+ F4 E% i异常检测
    ' [$ q7 h6 m; T0 r6 n/ y& s5 Z信用卡诈骗
    + [' Q% r, A( ]1 J( C制造业产品异常检( v% u* e5 A: d% s
    数据中心机器异常检  W3 X( Q& ?2 R  Z
    入侵检测. K$ g& `3 a8 t0 n% s* _- m
    监督学习
    5 l+ `5 R" f% K: G7 V  D: y垃圾邮件识别
    . _4 B0 C/ H( N2 v5 M新闻分类
    8 G4 K% ^. @& n/ ~- K2 o! Y二、异常检测算法
    9 h) I; j2 C5 n) b7 r& [' l" U" A; P- D
    ; }; b8 E. Q# P4 c

    ' j2 F1 M0 h# o" Y8 ?' v* j

    & t$ U  G$ {/ ~" \9 R* B
    3 E# V" K8 T* R% q
    " A; K$ W8 q3 V9 c
    import tushare
    6 ]3 i- d# ]. p7 E3 L: mfrom matplotlib import pyplot as plt; p2 G' P* r( q

    ) N" G+ f. B* o, o% ^df = tushare.get_hist_data("600680")
    3 E( U. b- b/ S: r6 s4 Q! }v = df[-90: ].volume/ l* |1 G4 a3 w
    v.plot("kde"): M, j& {1 K. n6 R) ]1 {2 S
    plt.show()2 b* i8 w7 x- N" s( t6 \  k
    1
    . q# C3 `9 ^) \* r# S21 y* O7 ^$ _' f
    3& ~! m6 ~0 q: h& o, M8 e- u
    4
    8 C5 C& L4 x$ c% s. i- |2 w3 y$ y5! _6 H' W) {- y$ p
    62 X) \4 p1 P2 o/ x
    7
    ( [* D- d# I5 w7 f2 U4 `) H近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)8 e. n( z6 O8 |* D8 T- p
    8 V4 c1 n$ Q/ ~7 }3 T
    4 \3 j$ n/ C1 n8 S& x4 d. l
    9 {9 f; \& w2 Q; O
    8 ?1 |) k2 f  m6 X) x0 @. F9 l

    : V+ m1 {2 G1 \/ j( K; G  j

    6 G  G/ c' a( s2 `% k2 [, w* J( F9 i# j6 g% y

    # G- @$ G1 C  L5 Y" A2. 箱线图分析* t$ j! l0 @8 z8 _0 a$ h
    import tushare# r" T6 F/ Q" C' m2 F: U
    from matplotlib import pyplot as plt
    # o- G- o- N6 }/ O
    ; u- i6 n4 b9 U# Q2 Vdf = tushare.get_hist_data("600680")  J; j9 }( q; q5 L" j( F/ l; R+ u( t
    v = df[-90: ].volume
    ' w2 L, W: n% ~1 @v.plot("kde"), z; F9 |  X" V  O$ w  D; p
    plt.show()
    ! j+ ^( B9 \3 ]. R1
    6 W  s: p- J# F$ b" U' D2
    ! R: m4 L% c1 B3
      M4 `4 _' m1 \7 T3 v9 e4- X; g, A. B* Y: a) [0 ~/ x  J
    5
    ' D  A1 `& h1 h% Y* H3 [1 X# H6
    7 J/ ^/ T. K: b7( T! m. v0 g6 k1 H3 s6 [* C

    $ h# S* V( ~( r
    $ P% K2 s3 `3 \/ f& p6 E
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!5 y7 X7 [/ `8 q' D

    4 g3 u# m0 ~% a7 O1 b" l, p
    " O; O2 y. R( h" ]! j$ x6 g
    3. 基于距离/密度
    4 A# N! b& e4 |" G  @典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。# q; y" r8 P- K2 E6 x& {

    . ?8 Y9 r  f* e) b; n/ \
    & g% T6 B" ~2 F/ Y
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    0 t) n$ i3 F: ^/ k0 p: K
    " |8 [; j! p3 x7 l9 z2 [! O
    * |! o5 H' l7 e$ _1 A: [
    0 [" m7 J4 P* ^/ ^$ Q1 z
    ! ~  F3 r9 t$ u8 z1 g

    3 K( w" b! I8 o& q1 @8 `

    / ~) y4 i6 o' ~7 e- a5 W# i- P' Z- h
    / s! X2 ?' d1 X1 k# w$ P5 u
    4. 基于划分思想
    5 B* Q* {  y% E. c% m典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    2 R7 _5 j- k- ?0 P4 m0 K+ n* O* x2 m1 q7 V; ]" ]" U+ ?7 j2 u  a' A7 R
    , e. l% Y" l1 ^; V" v; _1 B
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。2 X% s9 `$ T4 Z- f' V( `
    % h* `6 j* x+ ~$ n  t$ G

    8 [% q( w% H! E/ k这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    1 {) m5 |5 a  r/ D
    ' {, z9 Z" d4 z0 P- q5 z
    ; T) U) N2 e5 r% k. `0 w
    import numpy as np
    $ ^5 d3 x2 u6 E! l% J( h5 a; C$ Wimport matplotlib.pyplot as plt
    & ?! R4 s) u  J5 ofrom sklearn.ensemble import IsolationForest
    7 ], d/ B9 Z5 F9 J; R! f
    . \6 O5 q$ A' G' e: A, E. C

    $ k1 h0 {4 C0 W  Brng = np.random.RandomState(42)! n, V* R$ ?. ~6 ?: m7 y& A

    + H. T4 K' z2 y1 \* S* p: W, J
    5 R: J6 z1 V2 N! J. Y, O' b8 ]' V
    # Generate train data
    ) l" _2 a8 Q! l/ f0 SX = 0.3 * rng.randn(100, 2)
    ( y, R) @: l) i( ]( L7 D8 U5 W1 e: MX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    7 ~% e& m0 b; a# Generate some regular novel observations$ [. k! {: `' X+ Z; X
    X = 0.3 * rng.randn(20, 2); K, K$ e+ Q* O6 M, L  n0 N4 d: l
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]4 Z8 X  h/ p; r" `/ C2 E( L
    # Generate some abnormal novel observations
    1 _% \  E8 y+ q1 V) ^5 t, O( S6 ]( H. RX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    6 V, s9 X; p) U8 Y+ f( }" p! J, {! V: m* G
    8 S! q: G4 e( Y
    # fit the model$ w& F( G+ g% e3 U( i, o
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    ! F# W1 c! w0 o5 n/ Bclf.fit(X_train)
    $ V* X9 p5 k- Py_pred_train = clf.predict(X_train)
    / o% H0 A. n& t+ |9 q4 ly_pred_test = clf.predict(X_test)
    + j2 f2 z) M9 z9 U- t9 ^y_pred_outliers = clf.predict(X_outliers)9 N+ B* \! X8 J4 O1 N. F
    ' d( I* d% y- }7 ~6 N' v5 G# }' F
    . T4 Y2 f- a0 |# R: u
    # plot the line, the samples, and the nearest vectors to the plane
    " r7 g2 N. ~0 h+ j& Fxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    " S4 y7 u2 c' Y3 pZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])4 w2 _" o2 q$ Z  }* c
    Z = Z.reshape(xx.shape)) k* d4 }, T- z1 V5 Y) E( n* W

    5 Q1 z/ g0 C- ^3 t
    $ c, C8 p( G, k; L$ v
    plt.title("IsolationForest")9 E2 l  N: g3 b" {5 n
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    ) P1 z0 m# G5 G, I: s- I/ a6 R* z) A, O8 ~: S9 ~
    + m7 S) _$ L5 K7 w# M) P
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')2 {6 w5 w0 k/ N4 s" C1 S
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    1 t$ X# L+ t% P& h# V3 cc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')  O2 H- m' @9 K  `" A' c+ d& W
    plt.axis('tight')
    7 ]1 r: B" c9 j+ T2 W" t& O9 H- Iplt.xlim((-8, 8))$ `3 M# L: W# W3 N
    plt.ylim((-8, 8))
    - }  n+ s+ {5 v0 wplt.legend([b1, b2, c],- P- B, I9 F/ g* j; N- k. b
               ["training observations",
    1 @  Y$ V' b9 c; L% b5 f: T9 L" C            "new regular observations", "new abnormal observations"],
    / o2 I" D: s3 N0 `           loc="upper left")# G4 g; ^0 g0 V. w; K  [
    plt.show()7 ?3 t: b9 f# S* a5 A  a
    1+ M$ H7 q) g/ W/ Y
    2( `& Y: [7 \4 U. a, {0 v' h
    3% b7 |. X( R8 m5 }
    4
    " \: B9 {6 t1 w9 m8 _5
    ; r4 Z# v; _0 M" c0 y  Q6* }$ W% m9 C$ w- @
    73 o2 x7 ]$ [' |- u
    8
    0 Y6 g& L2 c6 x' d4 }: t: Z9: N2 r7 o4 n% o( B, Y( V! B# |
    10. q2 Y1 q( d  ^: [/ }* F
    111 X' j% w1 ?4 Y3 X& {# D6 u
    12
    8 {2 @! w0 H/ a3 ]- ]0 S13
    ) C% p) Z4 ?% ~+ I+ {( }* i# a145 u3 q9 q6 ~; q
    15, ]4 X% _  b6 A! F& c' j2 }) B
    16. t! i, A4 E& U. _4 l! I7 p
    17
    ! }; o& J+ V" g' n/ c' w9 `183 ]7 e' g& w! V
    19
    2 @. t! s) a% K8 z3 Z# @  @* T203 c; B  v) [6 W0 C* D* u: [
    21
    7 R% G8 z% |2 a3 u0 u228 N6 w+ d. B% Q/ O3 g
    238 v. u% ]3 R5 z5 h( d
    244 g3 [& `$ g+ O# l1 l5 `
    25
    & g- r. N# y7 X7 Y8 T9 ^, _! j$ Y- Z26" m& @4 M- D+ j( s( k
    27
    $ @  u% P0 a7 p; o280 \( Z  I+ B, H8 \$ w) J
    29
    & P. e* ~$ ~8 ]5 n6 Z) ]5 d30# U; B4 `! q+ Z4 W9 q7 a7 P6 l
    31) d- M: e4 @8 \! y1 R
    32; Y2 O+ c' o5 B4 Z7 t- t5 m
    334 W+ U. H. L0 K& w+ l' s- j
    34: C* T9 N& Y" _" u- Z) X0 K
    35
    ' l5 k1 M5 _" ?9 }- d1 B; y36
    ; w! i0 ^( \/ X" o9 ]  U7 x37
    $ ?% {+ Y2 l/ I. N( }+ ^' j38
    ( B3 w/ F; E4 o( F: a393 C( U0 v5 ^7 S4 e" l5 T. y
    40
    + o; T! U) r+ ]8 A* k5 d/ X1 r9 n419 `; i) n0 w! a* b3 u

    - E% U5 E: A% l7 D0 e2 ?  q3 I

    ' f8 ]4 l! x# E6 e9 O————————————————
    4 ]5 j, _- I* F9 B+ H4 o2 v! ~版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 u; D# D0 b0 D) r; C2 Y) f6 V原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    # H* t0 i9 _1 m6 a. o9 _" r6 R# R& ]: W* W

    $ o  ^  n+ V/ Z4 H; ^, S8 J
    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-6-17 06:48 , Processed in 0.465376 second(s), 53 queries .

    回顶部