QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4042|回复: 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
    $ z6 k. V/ E4 m: A- y
    数学建模:异常检测算法* G; X5 ^& o# W+ Y8 S
    一、简介 – 关于异常检测2 A! a# w8 {, [6 e. J
    异常检测(outlier detection)在以下场景:; q3 o6 ~) [& v8 \8 n( w. F
    9 H1 {& v) Z: T( E6 _
    " k0 Y" R9 `, O; ?/ |1 w
    数据预处理5 j# @  J5 z; G$ x) `7 }% P/ K
    病毒木马检测
    2 \+ k: i5 f+ ]. R9 d工业制造产品检测  o8 X' f! J! U. E& u  D
    网络流量检测
    , _9 o# G  G' b" E1 E$ E7 I' i等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    + c7 v' m" G2 f# `0 ]* [& j) K/ O* O& l1 H2 g
    , c' n1 [! U! O) D! r5 d# T  N
    监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。- h5 F- c' L8 o6 H  ~
    " O. k7 u- ~! M7 U6 G" P
    3 K5 T  P; G4 j. V3 n
    以下是异常检测和监督学习相关算法的适用范围:
    $ V" G% u  s* N
    / k$ p8 R7 n& E5 b7 h* {' Y
    + M" R' S2 r  D
    异常检测
    ; A) d* w: ~# ~& Q4 p( v7 t信用卡诈骗
    0 J7 ]4 V0 H9 o, c# w5 W制造业产品异常检
    ' a9 k/ Q. c+ e8 I* Q$ z5 M& I数据中心机器异常检; \5 U8 Q, g1 ~1 X/ I
    入侵检测
    1 z, \, r- t; g! |监督学习
    : e* @9 S& q4 x垃圾邮件识别
    3 k( Z0 Y' h! Z) V- r9 ]7 q. A/ z新闻分类
    0 s: L4 }- b1 s8 p" e1 T二、异常检测算法
    / b( t* |  ~; w, _% M
    % b& H; {( n3 k2 \0 B1 P

    $ A$ m) I1 m- O, [
    # U& H4 h: c" V5 }- ?

    1 j, O; f- U8 c& ?5 Q7 @0 f: T; U- ?/ @, F5 f
    1 k2 s' z4 M( H& y4 y
    import tushare) X& h0 `4 B5 K) {! `2 P4 j9 s
    from matplotlib import pyplot as plt
    , m% N: H: R; e
    ; s0 ^. c8 B1 K! o' xdf = tushare.get_hist_data("600680")
    ; ]2 ]7 z0 Q8 L1 N0 l: Dv = df[-90: ].volume
    ) k( H- m3 U3 t2 K7 D3 Iv.plot("kde")# t2 V4 z- n6 a5 v6 o& T8 r/ d* q
    plt.show()
    3 ^3 }% O' m( @# G3 ?: e; S+ |% X0 l1
    " A5 a# |- y. y, ]! e. @7 J+ I! K# }8 Q28 S" A. N$ ~: @
    3  R+ {. K5 H- S; `
    4
    5 F8 Q; i9 y" _2 q! h# j( |: r5
    + g( P: [+ ]: }6
    ) a3 J7 M: d6 z0 N2 s: `7 G7. l% f# S3 R9 @( d
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 I, k0 O! a$ i& C/ O( ~

    ! ?, C. t! K6 a8 \  H8 s
    5 V2 w' d/ H/ b* V0 Z

    , @0 V; @+ X8 a2 u

    9 g; R( K4 v8 q1 R$ z% j7 ?7 z. G/ \9 B

    5 T: M  R  h& B7 v: _8 a" U7 s" a0 Y, z  C7 |: }

    ) @$ ]1 \+ F% z+ O6 e2. 箱线图分析4 R$ l! y- h2 T2 l5 S
    import tushare
    ) z4 A1 z7 e! M2 ^from matplotlib import pyplot as plt
    4 |  A* F. O" A0 g7 ^ # J. \8 b" R: r9 w2 k, K7 }
    df = tushare.get_hist_data("600680")
    * S5 }' s+ o" O* m% iv = df[-90: ].volume% h& R3 ^8 Z; i8 I# _; q
    v.plot("kde")
    4 {7 O1 _+ D8 I# \& K* f8 lplt.show()% n- m# z4 _, F+ |: S
    1
    3 [+ `" p7 V( r7 A28 Z, n0 C  ]0 G! G8 g4 P$ _
    3
    - i# |. Y+ l1 ~1 X$ ^4
    ( W9 j5 q0 P  S6 Q, G6 B5/ N# j( D& s- \' O' s+ K% p) L; Z
    6! V, o, o/ z, e
    7
    ' H' q/ T0 m7 L& J# _+ U" Q1 _8 r& K! a. {+ ~

    0 Q& ^) s: G5 m. ^大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    7 F% ]& x! y' ~
    ( W8 e: F& C* ?- B' h$ E! ~
    - I" a) e7 v: t9 B3 a% Z6 e
    3. 基于距离/密度- Q, J; c9 }' f( }
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
    8 ~4 _: Z, b9 K; x) `
      L# B- K$ E0 I  f
    + T& P8 }' p- |6 J
    用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。  f6 u5 M, O; A
    , K; e) C' n* s6 k4 N; z
    2 s/ j9 d; V' T" ?
    2 a( H9 T9 y. Q+ Y7 U) ~8 k

    ; b# Y: m2 e2 d2 y# D: \* c
    8 B1 S& R4 m' P; R5 j% j" p$ r3 B/ F
    * ^5 K/ L" F& c

    8 P' {# D+ T! E8 H, {' P
    ; C+ i  |  p/ U1 W
    4. 基于划分思想
    5 N0 u" J- _( H! X8 Z( t典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    , N  K. k8 b% x7 b; ^( n( N2 O4 B) K) _

    & N" y4 P3 v5 b! ~' {假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    3 w. [7 ^$ T- n4 _9 Q2 H$ Z/ b5 m* M7 W

    + l% D  Q. N& L+ B这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    ' S* _3 {! U6 [9 Z7 `2 C& U0 R3 H5 y7 G% a( P% O1 s) L
    ' p, `- t! k1 ?: \! U3 {
    import numpy as np) k- G* j4 @8 ]6 w( s: b! y
    import matplotlib.pyplot as plt
    7 a% V$ U$ Y3 wfrom sklearn.ensemble import IsolationForest
    # D; ~5 X/ E: ?" S4 p7 O# J
    , \$ _; |' |4 r+ g4 [) |, k  y
    . s/ c8 E9 A5 {; K9 O% ]4 V1 H
    rng = np.random.RandomState(42)2 ?/ d# n" t6 @( o) o
    1 B6 D  U; g; o% A( v0 [# W

    % G& R% Q2 L( `. D# Generate train data0 h) Z, }6 L: e8 y/ Q" v
    X = 0.3 * rng.randn(100, 2)9 `$ Y% e. _0 J% C2 R4 t
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    1 |- T8 z6 G; v4 C' ^$ q# Generate some regular novel observations5 B" [5 O" o7 I; m( I
    X = 0.3 * rng.randn(20, 2)5 Y. \3 x9 V& A, q" h
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]7 |2 q$ S" L) U6 F2 @3 f" f8 H
    # Generate some abnormal novel observations. [6 m; v" X3 |! A- U. J
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))/ T2 N# {/ n$ H: z# [. q0 ]
    1 s/ L7 V% Q3 Q  c
    ' o, @6 V" I5 ^6 ?  X) }6 S
    # fit the model# ]7 s* V" M" ?
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    / a3 b4 q4 \* J9 R* V2 cclf.fit(X_train)) m: I& W  a# a* `8 A2 C# Q- b  u  K7 m
    y_pred_train = clf.predict(X_train)9 n/ F9 k& O; [& j9 B9 }& }( I
    y_pred_test = clf.predict(X_test)
    ; M6 j% Z" P  D% L8 i0 F$ r5 h' Iy_pred_outliers = clf.predict(X_outliers)
    , u( `* k, s( W  }
    ! t. o# d7 x8 x, l

    ) ]; T# n/ r+ z" H! q# plot the line, the samples, and the nearest vectors to the plane
    / z& j  `; ^. Q: C3 X) l# E6 Lxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    ' F& P; P8 U4 P8 |Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])9 ^. c1 z: R5 m* w: j4 i* b. a
    Z = Z.reshape(xx.shape)
    8 j* ]. j; c1 X2 w3 u7 s8 s" W+ ^, x8 p+ ]

    1 l% X0 N7 D" [3 Eplt.title("IsolationForest")* R5 `9 X7 i+ S. j0 R2 p
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)' z3 k9 ^1 _& k& J

    + F( \) t/ X5 B3 O, A! T( K4 g8 k
    4 |% u/ Y5 p3 [8 \' v
    b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')( w9 \& a3 d. Y& [1 I* M$ z
    b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')  _/ n& P/ ~; ~( v1 @
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
    ! d4 q  u# D# H0 p) H& f. Pplt.axis('tight'): V+ y4 V' ]- Q7 R0 O
    plt.xlim((-8, 8))4 l% \3 i1 }* w) E
    plt.ylim((-8, 8))
    9 h$ A+ e- [. o4 h% s) fplt.legend([b1, b2, c],2 j5 J. v# G; V  m9 n
               ["training observations",4 ^) W+ q6 I2 d, Q
                "new regular observations", "new abnormal observations"],: ~5 [9 p$ l0 g' b/ ^
               loc="upper left")
    ' s3 d3 i2 W/ v( m$ jplt.show()5 u$ ?" g; l  f( l+ J3 o
    1
    # S: C& j+ y, S0 ]: _) d2
    & \/ H5 z6 l: b3 F! y1 R34 ?0 z- S5 H3 e3 y  G+ ^* S
    4/ f6 [0 ^, {2 V. s% l* n" }9 I
    56 ]& a: Z+ V7 M  u
    6
    & s2 s; j8 p1 v7
    4 G7 l" t9 C$ {6 W. u  v1 O+ k# L8
    1 G& X  W, U  }* l4 E/ L7 @98 U$ Y/ i6 ]7 N7 s+ g
    109 ?" z7 l" V( `' C) N- ]1 z
    11
    , W# [  l6 O; @1 j5 U  f. [; _12
    ) s8 ~5 s- N! O* k! E13) V. X& k( q; i
    14' A0 A3 f0 E7 S5 E0 L
    15% U% G% z' i8 U: i# J0 N5 C# l
    164 v; v6 m# h0 X. X; e0 o
    175 d+ c+ v: `& S% T* u6 d$ {
    18, d! P# ^/ w* b2 k4 Z& _4 Y) _
    19; T( i1 I! f0 D& o# B/ _- Q
    20, \  Y. l2 a* W9 s$ C9 r- j2 ], d# G9 T
    21
    , ?9 `# L' A) D22
    6 H9 B" m1 w- V: z23
    ) @" e" Y# Q+ ?$ W& e24
    . q, Z3 g# d% o25
    / s: N9 G7 q0 Z- L( ~26" b8 n! r2 z  E% ?+ c1 U# ^) q+ Y
    27; A- X% m1 e4 z1 c
    288 K% G1 ?& ^) D
    29$ J8 A! o) b: O3 k$ T' @+ }
    30
    % ?1 N8 Y- j0 T9 {- I314 k% a3 o4 W* {9 Y5 m- V
    32% b( m! E  {* U% |
    338 t' H1 D* u% [6 G
    346 s+ L) g0 c: `. U8 T
    353 Q( P0 @$ n0 F! g" U
    364 M9 ?; E* j/ x8 c
    37) A/ Q3 ~. |, f6 n: f
    38, w" t1 _- @9 ^1 d) k1 S
    39$ h( x- @! @7 H1 U6 [
    40
    ; D9 v- h3 z( H6 P8 i7 O41
    1 r2 B+ m0 u+ r
    ! [( {- s8 K2 D3 N1 m
    $ Y# ^+ T! |- ?7 U# c
    ————————————————
    # o& y" f+ B1 q% f' ~( u版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 j: d$ P/ ~0 c1 u
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    . y4 W4 L( ~. Q9 w" Z7 h* }9 d8 y7 Y, \

    2 @5 N. q/ I+ \, d2 I$ `
    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-9-28 04:49 , Processed in 0.423869 second(s), 51 queries .

    回顶部