QQ登录

只需要一步,快速开始

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

    % Y3 C! [5 d# `- v9 m, f) Y数学建模:异常检测算法
    4 H& R; @7 A3 d0 I9 i! W# y+ J. ~一、简介 – 关于异常检测
    8 D* e  G% Q( x- Q6 m  N( L异常检测(outlier detection)在以下场景:
    6 w% U4 Y$ x# d7 t0 G  `
    % T+ v8 u" F7 q( b7 A3 e
    6 |+ b( |' K7 |3 g2 F# c3 Z
    数据预处理/ d9 T( H- K- Z7 |- T* p. P5 J2 U
    病毒木马检测& A; {! s! g5 p2 r0 a
    工业制造产品检测
    & G: a- W6 X1 H$ d! B网络流量检测5 W8 k( ]+ S7 K8 T  U' u. y6 C, p
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    - |% J- [1 b8 n7 Y4 t7 Y5 s  U" t! o# s9 S& O

    7 z5 o9 W6 f) {4 H监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
    ( _% L/ ^1 d; F4 g
    $ K( G. J- E4 B8 F# Q/ C

    " ^4 Y. O/ N9 U6 D0 T以下是异常检测和监督学习相关算法的适用范围:: G: Z; m# t6 @6 ^& }. r, Z0 r/ p
    , U6 {5 ~5 S1 O$ m7 t; L
    : Z3 r  }/ e3 f" ?
    异常检测* Q8 p3 _+ V4 L& B$ A
    信用卡诈骗7 m( I0 _4 d1 q' r: x
    制造业产品异常检
    7 n* p+ m" D1 B数据中心机器异常检* ^, r9 o$ n$ B/ x* l7 h2 h
    入侵检测. T+ |, O# |. y" [
    监督学习
    * j. D& s* L2 F5 N) G2 p垃圾邮件识别
    7 W3 F/ O1 }9 l) C- ^新闻分类
    , \! h6 r+ {2 f  p/ q7 {* @二、异常检测算法
    0 K+ l# \& [4 B/ P" [
    " ]8 [2 _" Q. y; E& O
    ' U. |/ k. Z. p) u+ C% L% K

    ' z) m! ^0 F% {4 a8 x$ Y& H& R2 W+ H

    , m; I: S2 i' o6 s/ c
    / W. j; @8 P) L& R
    - y% d- Z$ g+ Y8 e
    import tushare
    9 [# R, m* Q2 S3 e; g/ ^from matplotlib import pyplot as plt" ~4 k' n, k- }% Y

    ) n% l  \/ \6 A6 jdf = tushare.get_hist_data("600680")
    / t# X7 |# D$ c9 H3 r5 z4 zv = df[-90: ].volume
    . u* |* a0 x( ?0 T6 y" ^0 Z% Rv.plot("kde")
    6 C% z+ R8 U* _plt.show()8 n  c; I3 `) e
    1
    4 \: K- N- c! q: E+ k24 v0 t& N* t+ |+ B
    3
    & b& T- P+ }4 J+ M7 U% }4# q- z. k& `1 G6 V9 b$ ], x* K
    5* P3 @, P  L. |
    65 a( p. r8 g- C: B) y, g
    7. m& L! R  x3 J+ j* @8 T6 V& r
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 ~, k2 y: G/ D+ r& t
    % |" g+ g* Y% [4 U& A/ H) v

    ! R5 u+ ?9 X# J. O2 C  E! v9 ?: w! A2 n; k

    ! A! w6 p5 U$ J0 ~; x) C/ i
    $ J3 }1 b9 {! G& D' T2 X
    , C/ P6 ^) w( z! B! c6 k: O* t+ l$ x

    ! n3 S0 V+ Y" |) Z( f- {' N
    , C( D! H5 g: R2 Y
    2. 箱线图分析# `: M5 i) i3 B! f) `9 @
    import tushare/ u- F$ a# k8 R
    from matplotlib import pyplot as plt* C' C) k0 t+ x* c  i
    - p! ^) s, P9 E& G
    df = tushare.get_hist_data("600680")
    . w) m% A$ ~6 _3 ^) iv = df[-90: ].volume/ L& K3 X6 u% P) C8 ?
    v.plot("kde")
    8 Z& x( {+ Z, X, vplt.show(), ]( w& v6 z) r1 f  w" |
    1) p4 I- W5 b0 M' X* a, w( B9 x# \
    2
    6 {1 ^( G$ x0 f3
    5 I) x& h' W# m! M4( i2 n2 T, M0 E$ f4 `% o
    5
    ' \4 Y& Z" n7 L6 s9 G6
    + ~2 @% e7 V, ?' J1 u1 N' z7 W% O3 c7
    ( x! I1 P3 E  \: s9 o, b
    ) E7 f' x. k' T

    ! [9 n/ j) g( \大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    8 i1 z" Q& W2 b( L1 w, e: X1 ]8 S+ Y5 w( R4 o* B/ i+ i, a: k2 ~
    + m5 [) H8 o. ~# s
    3. 基于距离/密度: r3 Q9 K) A4 ~# G% \' b
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    & k& n- ~  N( E& M( l5 R6 E& b; _! c- N

    ' Z) \. v' R: _( N用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。7 [) J* E, f( T. ^1 p% Z- w3 b/ N

    ; z) R( m! [( N5 H5 W- g4 H; R
    2 v2 h+ t4 }! J. Q$ ]
    ' k7 {+ w! l" a" j! u
    " ~! m- p4 H! Z, {

    # U; {# }  H- T7 Y9 N, E2 g
    4 i& d$ q0 Y' G$ G
    & t5 s2 ^2 J* m" C' u0 }- q2 I7 ^
    3 I- R, @) y  ?3 J/ K6 L
    4. 基于划分思想2 I: x4 h* {% Z  A6 h
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:0 v* J8 U/ M/ o5 k; j6 s

    # P6 P9 C4 d% p& E; E! S* @5 ]
    ) @4 [& V! m$ M* l3 C& l
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    , t- }$ x, o. h6 L; s2 G
    ( d- h& b1 h3 Y. e! l

    + t/ k) B% ]+ \7 U* E- }5 s9 j这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    9 b1 _! u" k4 g' r4 ~5 o2 v8 A- x2 ?: \) A+ a( S% ]
    ( K# ^, r0 G- t# m0 P" G, n
    import numpy as np
    % q: R& d% i1 f7 T! Z0 Vimport matplotlib.pyplot as plt% D2 D) C8 u2 n4 V3 G& E
    from sklearn.ensemble import IsolationForest# u- x4 N" v) w% i2 F% n: k0 X

    4 x0 i/ _$ i" |& A

    - d' j" X3 Y3 |rng = np.random.RandomState(42)
    . L2 T2 d; Z9 d* Y9 X4 y& @. N8 [7 I  z( D5 Y: [

    # U5 L( a7 G, W. |: [# [' o# Generate train data" I% t. O0 b8 ^- J
    X = 0.3 * rng.randn(100, 2)
    . m) l" z- d; \+ JX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    # I! _0 C, |% s' G4 Q* w0 ~0 J# Generate some regular novel observations- ~; y. f6 m' R+ K% Q
    X = 0.3 * rng.randn(20, 2)
    5 {" S7 Q7 Z: E# p9 _X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    " u5 N( z9 ?" m$ f0 X$ k* D3 n# Generate some abnormal novel observations
    ) C! c# S4 f# ?4 Y4 H/ @X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))  s4 K  I( j2 q! Q! Q0 P; d  R

    - M5 ~; Y! k7 @: U7 t: j2 Y

    : t: _% z$ Z$ w- s# fit the model' K( s: a: V6 K6 ~3 @
    clf = IsolationForest(max_samples=100*2, random_state=rng)& `2 s. c5 Z/ ^& S2 W, l1 w! c
    clf.fit(X_train)
    ) i3 f0 L. ~& Ky_pred_train = clf.predict(X_train)9 m3 p3 i+ `" I+ }' n
    y_pred_test = clf.predict(X_test)) c8 |0 \/ F( A: h% E
    y_pred_outliers = clf.predict(X_outliers)8 A4 r9 ?# {2 e$ Z4 b" s9 d# U

    ! `8 b% q" N3 W; n

    6 d, h5 Z' R- g4 K* |4 e# plot the line, the samples, and the nearest vectors to the plane
    ; h  _; }! ]; V' _# ~- E" Xxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))) R' c: f8 t0 Y! V. x7 t
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])3 P2 r" I2 N+ b# v
    Z = Z.reshape(xx.shape)
    + F/ R8 d# C, ]5 v) X, R8 b. t
    ) b+ k- m) B1 n% ]

    + `1 \0 Q" Q2 k  U# m. P$ aplt.title("IsolationForest")# K1 V' U. H9 Q! @  S8 K. r3 g( G
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)" A. _7 S7 J/ t# a

    0 w# M4 A, O; i" p- x
    . R4 q5 _7 [, ~, L4 A  J1 E2 y
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')* V, U$ I7 ~, z* Y1 k0 G  g# A
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    7 L  p! a5 {  b4 ^' ?c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red'). f& q! ~( b$ o4 }. a6 I4 P
    plt.axis('tight'), d) S1 v9 E& n3 O) M+ E/ ]
    plt.xlim((-8, 8)), m# l! D5 W8 [1 h: A5 Z1 K+ p
    plt.ylim((-8, 8))
    . U3 ]" l+ k, w' w: Yplt.legend([b1, b2, c],
    % {4 E7 H5 f7 v           ["training observations",
    # D; x( ~) y; z0 F) x" j+ F$ F            "new regular observations", "new abnormal observations"],
      \- |+ n; Q# u  p           loc="upper left")9 G: }  n& I9 J
    plt.show()
    - b, V# f, G  }* g1
    6 I/ D5 E. |: i! ~: O  M2
    3 u) l  t5 ]# e9 }33 B/ n: R) p0 s: r: Y
    4
    0 J2 H3 U3 w/ Z* D5: Z% s; P7 y# S* Q' u$ z' u. u
    6
    7 T' D- z% Q8 @2 r% @7 h, ]7+ @( L: F8 V* C+ M! V
    8
    - N; Y: F& h$ N6 G92 g, Z1 W; k# U) E4 K
    10" z7 Z* A8 `" @
    11
    4 `* ]! w) I# }* P. M8 q, [: t( l129 h9 n5 B0 N1 i0 m' U7 U
    13" A" u2 U6 E1 n6 H) r  g% C
    14
    " t: G' l0 n; m1 e+ Y$ g15
    " @7 [' R( W! W! h/ @16' H) @8 o, s+ d7 {0 _. w$ j
    17- D/ @9 {1 w7 h6 x
    18
    , |# X' B5 V! Z: _) K7 l0 Q' r9 n6 L19
    " u- X7 l4 N6 F- P4 |) ?8 F202 l) ~$ X4 V- f! F+ m( T
    21/ g& W7 Y% y, b; B0 V
    22
    8 w1 ?6 Z* }8 c7 F4 A23& @# s" ^) j' k- t# d# Q
    24
    * V) q7 U  b0 @% r25' X& X. j( w! t1 b6 z
    262 p0 m) ^6 Z4 C6 m1 M
    27  \' O. v) c# U& S
    281 @! u, ]2 ^: U8 b
    29
    0 j) z! u- a/ z+ \# z! p1 U, ?30
    . U" Q2 C" `* N" ]+ M" ~317 H6 Y/ J/ ?5 ~: P7 u
    32$ ~: ~* G" k/ P4 g1 U; ~& `
    33" N0 U7 _- o6 B. h. b0 g
    34" B7 x. U8 N3 I
    355 _+ y, q# }1 x! g" j1 `  s
    36
    " F" B0 j3 s/ |37( \/ p, h3 f7 f. ?4 A! c  R' U
    386 [, i5 r- @& @2 j3 d7 n% |
    394 _; E7 c% Q) c! F+ w/ H
    40, j6 g: S- U8 S1 }! ]
    415 f; \* [% c+ z: |, E% {

    1 g* b- f0 s+ K9 U1 J7 A

    5 c2 V) L4 Z+ \# l" P————————————————' c, u& v' n3 p) v, _' p8 e3 W1 ~
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& j/ i% d; k% l5 q0 D+ z
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231296 z5 {7 }9 v3 W6 W
      h% I; V  w" f" n5 M
    9 t# o) V' s/ c$ A- ]: a2 G6 ~
    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-4 13:05 , Processed in 0.445556 second(s), 51 queries .

    回顶部