QQ登录

只需要一步,快速开始

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

    ) K& A( B  `0 I' J! O( `' B7 D4 ?5 c2 S数学建模:异常检测算法
    1 K$ q$ `2 }% S% h- I一、简介 – 关于异常检测
    . {' z8 @# [" q$ F4 e  I  g异常检测(outlier detection)在以下场景:- X& Z6 \7 T+ a
    ) v( h" U+ ^( h( F3 ^6 o

    . Y  y+ d- K4 n, m$ O! s数据预处理! s8 s- f+ Z$ H8 L. a7 j
    病毒木马检测2 ~4 Y# G. C# A( J' A
    工业制造产品检测
    ! t; `+ }9 y( J) z8 Z7 c% y. i网络流量检测, ?4 Y& A/ S, i: D1 a
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:' d( H$ n3 \$ p: D+ G

    6 `5 [' @: @2 q2 O$ }' ^

    , ]6 l( A0 {+ j监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。" C* O4 @# w; d0 w8 D: z7 v& m1 W8 u
    3 c" ?3 c; s. V0 j

    # G" i: p$ Q' m以下是异常检测和监督学习相关算法的适用范围:/ u$ i! g9 o7 t
    . N) N, ?: t7 f! ]

    $ J2 c9 S( R* y1 e+ f+ a异常检测) Y4 P8 O+ B6 W" C! f
    信用卡诈骗
    8 `5 x2 e% f0 c# Z, M0 o制造业产品异常检
    $ s" g# J  v: n, o/ Q9 ~数据中心机器异常检
    + W; ^4 h' Q3 A# j& X# E3 v: ^! m入侵检测
      G1 k- B. l3 h* x& `监督学习
    9 j7 |0 E9 {8 o8 ~6 m9 m6 _垃圾邮件识别
    7 E4 x% g% U! ?; Q7 H新闻分类
    6 X; n2 j" l9 {+ b: v0 T二、异常检测算法8 E% r- _8 D% V" U: K- w( V/ M

    1 f$ z8 c) M& p; B& j) o" w

    ! }: f# n, G% d. z0 ?9 u* D5 {% x3 K6 r) A, M6 N
    & Q* \" m& r' r$ ^: O
    8 S2 O' D) k" V
    % ]2 g: ?5 L6 |. T
    import tushare
    9 v% A- a9 K: C- Pfrom matplotlib import pyplot as plt" p4 u! ]3 t) L+ w: s
    ' G" t7 B" S* \0 L5 ~
    df = tushare.get_hist_data("600680")1 _/ j9 L/ Y: |3 J/ v" g% n( H
    v = df[-90: ].volume
    ! D6 ~; \! f% Z- `4 _v.plot("kde")) c8 k& `9 `: \
    plt.show()/ @9 T8 |% N6 R4 t# ]9 T" Y
    1- ~" ^- J8 ?6 h
    2
    , W9 Z# V$ n* {0 y3
    9 `6 H3 v& M) {, z2 f$ o1 ~. [4
    , }  \# l9 A9 d5 a& J3 a5- R% c3 ]$ C8 s  L6 T$ J8 e/ v9 l  C& E
    6; }$ ]9 z9 g& t4 v* s7 _" }% H
    7
    ! e; t& a9 z% @近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
    # o% K0 J5 M' U& R- G
    ) b- i/ ^* S1 G0 J. l; h- Q9 P

    + l$ c1 i, j( }1 a" n& b. G- r4 p3 @' M; s
    6 {3 \+ X5 M$ I0 r

    3 v' M# z# l- t, ^% C. V

    - Z& t* a; b3 ?. ]) H6 @( L$ s
    8 @0 ]+ G  L/ a$ I8 e
    . H0 S$ o$ V& I% c& J/ q" b0 J2 o& x
    2. 箱线图分析; [4 C8 K( t3 K
    import tushare
    1 J. d% }( z6 [; ]' {4 N9 wfrom matplotlib import pyplot as plt
    , N$ Y6 p5 H/ c ! F" V! a( _6 f0 L
    df = tushare.get_hist_data("600680")" ?! E* w$ h) A3 s2 i3 p" v7 z
    v = df[-90: ].volume
    5 x- p: S. f) L  H9 k4 Wv.plot("kde")
    9 h  N4 N$ [$ I1 uplt.show()+ @2 b6 P" [4 K+ A
    16 C; Z% O/ {6 T% {) J" }4 k# D$ w
    2
    ; v" d8 t( z! B: i3 D3 B; H3
    9 Q3 j! w$ ^9 B* A, ]) @4
    1 T! i# s9 b9 z: J: m/ Z! c$ h7 L* l+ c5
    ) k0 i# E& j5 @6
    4 D8 T$ ~7 o6 {% K& Q- p+ x7
    % f1 ?  y. g* p9 r3 j: Z# q9 X. d# M! E- m
    2 n$ Q. J% b3 l' ]
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
    ) {: G2 D# u: {; e, {& m+ c% @; i4 c: L
    % e/ d1 k9 P, B. D% z
    3. 基于距离/密度
    ; R! J# o. S' w+ `典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。/ Y. @  g; y( q- m
    % ?& _8 M1 z/ |

    + q0 {0 M8 K8 ?: L( m9 r2 l用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。/ K! y8 G" T: C% L! V/ b: T. L! s0 K
    3 |% [. T/ {7 D; C+ w
    , S) f" s0 \' b, z! p
    ! o$ R, A5 S1 |  A5 g5 I! S

    , G; T( _  s8 I. H0 h( a5 g4 ^4 t+ ?& ?; \) y3 L/ K; Q5 c8 Z$ Z% _

    % `+ p! r: m, h4 s0 F5 n
    " V, Y% X) U  h( M; k( E* x

    ; D# ^) Q, F4 P4. 基于划分思想
    5 ~: z0 C% Z+ B: Q典型的算法是 “孤立森林,Isolation Forest”,其思想是:
    3 w# F& G2 `4 K1 o6 z
    ' ], g  I6 m0 }2 t: A9 I- A( J8 u
    5 l9 p; F! m0 R7 T
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
    ) h, F" y2 o7 l4 R) k0 M' A! T8 w; N% [0 a+ w
    6 Z9 _$ j* f& ?6 L( d. x' e# K
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:- k; U' a3 y' W3 y

      u* R7 ^+ y4 Y6 H5 ?

    - W/ w0 p8 v, n. n- Bimport numpy as np
    9 e  F& w3 y8 h( ^import matplotlib.pyplot as plt
    : L2 x  u/ w. V6 Q/ e% j5 Dfrom sklearn.ensemble import IsolationForest
    0 c" {  |' p" j# q# m6 g: p0 T# Q0 V7 o

    0 f% u) G7 k3 ^9 |# Mrng = np.random.RandomState(42)
    ' c; U5 S5 B& Q' @
    " _2 l9 {/ _% Q- n

    6 q/ Y4 m, O, [3 M: d* [# Generate train data
    0 g2 z) }4 ^0 D: t" d6 TX = 0.3 * rng.randn(100, 2)
    * t/ ^, q) N" }- `& @X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
    # I' p: n6 o6 K# Generate some regular novel observations$ j1 N+ W3 s4 ~3 ^& m
    X = 0.3 * rng.randn(20, 2)
    2 m; S' z. j, oX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    0 P! {8 @) G* Z& T7 v  B& ^# Generate some abnormal novel observations) R  w4 n! ?0 k  G1 i) m
    X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))  c5 V( r3 W& a' m

      N9 l2 W5 O5 f  [9 Q  n. H

    " j& X) p% Y$ r5 \# fit the model+ n/ s# l* X* C/ w( X- p( D2 T
    clf = IsolationForest(max_samples=100*2, random_state=rng)
    8 H0 `$ ^$ p" Pclf.fit(X_train)
    $ u" n: r+ T4 `8 B9 a# ?y_pred_train = clf.predict(X_train)  u- q6 X5 }6 G, N( V2 G" d' V9 d
    y_pred_test = clf.predict(X_test)+ P$ ]" S6 w( X% o  x
    y_pred_outliers = clf.predict(X_outliers)
    ' c, n* t, b$ G5 w: B+ s2 S) ~+ `0 q% |1 ]
    6 I  Q3 i+ ^. `8 O; r, l
    # plot the line, the samples, and the nearest vectors to the plane
    5 M) y7 a$ |* E6 g, d4 g. O5 c+ Jxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))# G: E0 {  `  U
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
      Z$ W+ L' T9 b. qZ = Z.reshape(xx.shape)
    & ?, {) O2 [; ]3 p: C# E! N" C
    ; t& c; j2 ]/ Y+ J2 M
    9 z/ y7 Z4 H/ Q' y" O
    plt.title("IsolationForest")( r9 G6 P0 u9 T+ Y  b5 G
    plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    8 j6 L$ d: t- H. m" m1 g
    ) \) t' j* m7 z7 D+ S0 w9 n

    $ [% Q& A) O1 P! m9 V6 C+ R% u: Ab1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    + q! E, `6 v9 g& `7 }3 T! zb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')6 H5 G1 S) k" p8 ?4 f
    c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')) R8 U. K- j4 o1 d$ n- m! R
    plt.axis('tight')
    . @" ]2 i1 o! {* y& Z( Mplt.xlim((-8, 8))1 V4 e: [/ U# A+ l' Q
    plt.ylim((-8, 8))
    9 |; S! J2 E7 g+ z+ @plt.legend([b1, b2, c],+ k* m% L1 ]+ u; K+ F9 d
               ["training observations",$ z) P3 K; ]0 r# p( o; N
                "new regular observations", "new abnormal observations"],, V! v" i/ ^% v
               loc="upper left")3 _* N- B% s2 }/ t$ ?$ {
    plt.show()
    - x9 F7 j! M" {  w1
    * Q/ i; V$ z" P6 F26 U8 Y& W" h8 X! H; o
    3
    8 m3 }: s; P9 g1 B8 L: q4
    . e. F% q3 R! W5 _# g- J5
      a( ], v( I( g6
    . o7 ^& r  p; X! ^" C) l: t; F7. I& T9 e# o( ?4 V- X
    80 A  V7 ]- R; E# R2 K$ i
    9
    8 i9 z  z/ C! ~8 T; K  h3 v* o10
    6 v/ e  `0 }7 n! ^7 y1 \0 _) p) W11
    : y! j7 ?+ M8 d( U( H- S12/ Q/ M8 b3 B5 d$ b6 z6 |3 |, v
    13: w: s1 Y6 a8 u  s5 q3 O
    14- [6 D) |6 A( H) f
    150 A+ G* l7 D: b# b) U2 Z
    16
    , X: d$ F" i$ f0 ~4 m8 H! e) J$ v17
      ~& {  }4 n% c18
    8 N# e* |1 ]: J$ b199 ~; B0 Z4 b9 u3 s* s! O' x
    20: [3 X7 f2 \/ k/ U; c5 I9 q" ]% v* d
    21+ I5 j5 J, w! ?5 Z
    22( d4 z. o  \% {
    237 `2 T4 `8 ]! s) o3 G
    24
    ; W: L* m! N: E+ p) [25
    # z& G0 O: f: F26% W4 N# U1 N; C$ W1 H8 I6 R( x% O
    271 S: T2 K& ~3 o, }
    28
    ! k1 l" x# a- l2 N. @29
    4 F+ i6 E- |  `30
    2 C0 n/ d; M4 G$ ], }8 H" @31+ M+ c: ^& Q7 _+ a1 L2 Q
    32# F1 T  q* g7 N/ ?$ p! r/ G, G
    332 A4 p4 o$ W5 [
    346 V/ {; j( R1 V# S
    359 q! w$ ?+ s# a4 X" d6 i$ u
    36
    " J+ f0 Q# c& A" L37! X3 {" Q2 |3 ]2 O4 x# F& Z
    387 [- Z2 Q; s% Z" B; f1 e$ s
    39
    2 H" Z8 ]9 ^1 }( I40( n8 d% [* ~2 B5 d' Q& h. k
    41# K/ ~; n3 x( N- U5 Z3 C; ]; k; E
    - E- S3 s+ Y7 u2 g: |- I& D& _0 n& @
    ; i; f& z7 c7 R  \* N, t2 s
    ————————————————0 e) n3 K8 J% d: x$ i2 ]
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 P/ i4 R$ o+ H. q
    原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    $ Y5 A8 ~7 U5 p1 I. \) [
    . D2 `- Y# e' ?8 Q# {! h1 Y, L0 V# c5 W7 P6 j! M
    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-16 21:41 , Processed in 0.435599 second(s), 51 queries .

    回顶部