QQ登录

只需要一步,快速开始

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

    $ V$ _2 W( U% F. j% A数学建模:异常检测算法3 B; Q' H0 u+ y  E" d0 t! [& I
    一、简介 – 关于异常检测
    - f* I5 J% Z0 d" V- H, k异常检测(outlier detection)在以下场景:  F' }3 V6 s4 n; i, R
    * O( K& {* O* h/ w) b
    $ @# P+ E( b$ s- @
    数据预处理
    4 o9 u) F. d. m! x病毒木马检测
    8 K! R4 t1 |8 L, P* D工业制造产品检测
    + o! q8 k+ s* [: y% w; U网络流量检测3 V. p8 B0 z: U1 `
    等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
    0 b* E( v, F1 F& V# m6 P/ y
    6 h. C$ O3 s. U

    - |" G( b9 x' l, [, K监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。5 R" ], Q. V, \, t
    9 h$ C9 r+ \) _; k

    9 P6 V5 u! y0 @/ q* k1 H+ T以下是异常检测和监督学习相关算法的适用范围:- c. e3 M) F+ c! j# S" q
    1 s: h5 v1 O; E

    8 V# V& K0 ]7 s+ f8 i% C( z/ l异常检测6 Q4 \8 ]# C) j) V: g
    信用卡诈骗, ~/ Y1 Z9 Q" s( R
    制造业产品异常检
    . y% V5 K" e- }0 K数据中心机器异常检  H) ?1 d' e* h9 x7 _
    入侵检测7 m. C- z. f7 k4 u/ r
    监督学习2 B. b! D; A4 b& ^
    垃圾邮件识别/ ~8 Q5 |7 c: I$ Y! J: S
    新闻分类
    3 G, H' k+ Q3 u' E二、异常检测算法
    ' {- z' M/ Y7 e9 T4 a. |; N
    3 q9 B; s! \( s/ U  D
    8 `2 o# v/ |# d0 j
    . r) m; r( s3 D. K* J( {0 W  z1 }
    " ~; P1 U2 ~' ?" D  F& C: d2 t/ @+ Z

    6 H# o5 B: i6 m; g3 M* x
    $ `8 l$ a, G1 Q2 m# N5 J9 G4 p) j
    import tushare
    $ y( b9 C  F2 `/ W  }from matplotlib import pyplot as plt
    ; A6 \# P: L' W# f ! k" u1 b. T) W% e
    df = tushare.get_hist_data("600680")& V  I3 A+ }$ _) i* [
    v = df[-90: ].volume6 P! c1 ^" n% N( R$ Q0 e; D
    v.plot("kde")
    6 p2 a" }- h3 J: I0 z8 rplt.show()% o* w. l# J# y- @0 Y
    1
      ^7 w& p, z' T( C2( B, H/ N7 L! q! c! q0 D
    3' _% m/ g6 {) R
    4
    8 C" d4 ^# B; B. Z; V. ~5
    / R8 P; h/ c+ R7 n  B. i6
      C- R! _& U- j) b' s2 g+ |& A8 j70 D- `3 \! {3 I; D. i, [; b" d
    近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 R2 p" I( H/ X0 J% {: ~
    & N; A( f4 Y0 j% s4 `
    # f6 Y7 {. \' f* h% f
    : @  [: E  O( |
    ( e# O# b8 _+ s# t

    / j) d; n8 l7 ]

    $ F* K: C: F8 U: G6 ^9 l
    , y, c0 v  g5 O* e
    6 S+ |) K. Z4 O8 F$ A# J, Q
    2. 箱线图分析' j4 N8 E, T7 a% ~& u, D5 V
    import tushare, \* d$ n) a. ?0 n
    from matplotlib import pyplot as plt; u! P; K8 S2 y: e! V" a; H

    ' l2 U9 c& B: T0 v' L' o" N. Vdf = tushare.get_hist_data("600680")
      Q% `" k) f8 \; r" ~; P4 q! {1 Ov = df[-90: ].volume% ]8 G- `! j( R# b0 i6 f
    v.plot("kde")$ s1 I& Z( a; R6 R6 V) r9 g8 c
    plt.show()
    ( p$ r. C+ Z* b3 k( s4 ?1: l3 G. a4 e1 E+ q1 {# m# W3 u
    2) F+ a# [7 u$ V3 J" h, |
    3
    ; q7 |+ X. M0 d' l& U  R4+ I7 z8 ?% k$ F
    5; t& [% X5 G% G3 H
    60 F# o3 d+ K" x" s5 R2 `
    76 ?7 b4 T$ M+ V+ h6 f! M; ^6 |

    % R6 d8 \' B4 l' t
    4 l: l* y4 i' o& P1 y1 g/ S! C( m
    大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!) s# v% X' q  ^0 A! [; c) F/ L
    & X  z7 @2 H$ x8 \. d- {7 j9 S

    ' X' p! L' W* w% p5 }6 R- U9 [& h3. 基于距离/密度' s: M2 Y6 ]2 H' _- E1 k
    典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。% h; R/ h1 E, l3 @% h, X5 x3 Z
    6 v; `. ]8 a( p) W6 j

    4 ~" [5 C( L" u+ d用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
    ( C' q* Y- K/ z6 H0 a+ `; F; ~5 }8 q& Y9 T+ V0 T
    ! G. r; ~0 n- M8 p3 Q7 @0 C' r
    2 X! m/ X1 }% A( z

    $ G0 w1 _2 w6 \  n  v1 K  I. n/ J2 t

    4 @8 P! {2 C2 `- z
    ( r$ |. A, V5 l$ Q- Q

    ( f# @- d, V' O8 d3 h4. 基于划分思想* {$ f) t2 F9 A/ f/ E, p  w6 ?1 d) f  ]
    典型的算法是 “孤立森林,Isolation Forest”,其思想是:2 j9 e- n+ X- |7 \2 G

      q# P7 ]' H; ?) Y7 h# d( z
    ! |9 \7 [! i9 ]% ^* X
    假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。7 h; t4 f5 e+ b7 c+ D
    4 C% i' e' i/ i) Z3 C3 z) J' S
    & U# H! e+ d$ L5 u8 k5 W4 ~
    这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
    % n$ f7 k; P8 m  V9 b
    , f) \- V9 h3 B9 v
    / j7 w) O9 T" Q! g' i1 G  F; }
    import numpy as np
    ; K3 E1 B' g* E- g' ximport matplotlib.pyplot as plt6 t: _, A& N; S3 I$ F: j
    from sklearn.ensemble import IsolationForest& |( x! c0 A1 q2 U5 c' n  x% i3 O6 |
    1 H1 P  A6 T7 q/ |
    ' d  t5 ^9 v+ @& o, Z
    rng = np.random.RandomState(42)
      G5 A, `: K2 b: r1 l4 k& S
    3 d/ G. A* s8 z, T

    " Q+ ?4 `" x, a( k  V# Generate train data4 M$ |$ L$ n$ H* A' g
    X = 0.3 * rng.randn(100, 2)- j( |" P$ ^) y
    X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
      U  H$ C2 r1 w2 Y$ s# Generate some regular novel observations
    9 f2 ~  Z/ x5 fX = 0.3 * rng.randn(20, 2)) s0 z. X+ |* D& A$ y
    X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
    & L. T$ K: H2 h- W: {* n! q# Generate some abnormal novel observations
    ! ]- C2 b# N4 G# c. L( S7 RX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
    $ e6 k% @- `! h4 s5 K: [, a, W( H. E/ W& P, {7 I0 t1 c8 u) u
    % o- \" a5 m, ]2 \$ p' Z' J
    # fit the model' C" d8 c5 J: M4 Z
    clf = IsolationForest(max_samples=100*2, random_state=rng)- r* B3 p* C* f% q1 k6 X( S0 S
    clf.fit(X_train)3 b5 V# [2 M7 H% @* Q; S2 {  a
    y_pred_train = clf.predict(X_train)
    . S& \0 o% d8 G" Hy_pred_test = clf.predict(X_test)0 r  U- T; H. T4 H9 L4 b
    y_pred_outliers = clf.predict(X_outliers)
    ! B- v4 r0 v) a3 v- }$ s
    8 R' L' p, q3 ^  Q5 d- [6 \

    ) R5 L0 a. G7 m$ {# plot the line, the samples, and the nearest vectors to the plane1 a3 v/ ~) K1 g, R+ U
    xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
    : S) _5 |6 b( c$ W1 b/ LZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])+ I/ s7 ~: N7 i, l& C4 a
    Z = Z.reshape(xx.shape)
    # ^/ \1 E3 E6 |8 [# o
    7 ?* g0 f/ V1 x5 c" X9 T& b5 B
    - Z+ a+ m6 p/ g+ K* q; E
    plt.title("IsolationForest")
    0 n! Y/ B/ y0 ]plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
    * v8 P3 U% K, Z: A2 R' l! {3 g5 K3 h

    - J0 S! i9 `7 B& pb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
    1 ?3 d% M% E8 N% Y6 ^0 Eb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
    4 t6 i' f  Y! X2 t' \, [c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')' @7 I* Q2 r* `% T2 B5 \# @
    plt.axis('tight'); ]4 h* V# ^% k4 s7 `$ S
    plt.xlim((-8, 8))
    $ e% d" Q* G3 v! I( W$ _: Nplt.ylim((-8, 8))
    # R9 n$ T4 R' |" O/ gplt.legend([b1, b2, c],- F& l* Y$ v3 T% h/ C( N
               ["training observations",
    " T9 z7 g3 ~/ ^* a" Q  ?5 q1 X            "new regular observations", "new abnormal observations"],. C7 k( E7 n2 s- W. E0 `) [
               loc="upper left")4 ~4 G% l1 m5 D( S
    plt.show()
    $ s' m) U- D+ h' y/ g  G' r3 i/ `1
    6 `7 o. U5 z+ e2 O% b+ z2
      V( h6 x! @! \( h: k2 D3
    % K, n) d+ R& G  j2 L+ L3 U( q* d4
    " A  G4 I7 G9 u/ i9 ?1 O: N51 A! H$ z1 G" e% F
    6
    ; \6 c/ U- J# S, _; F7
    - ^2 l& s+ i/ M& e) \8
    ! |1 V! K! O/ V) @7 Q& F9  S' G4 R0 L/ k' p! `
    10
    : m# p& c% a4 ^, O0 l& {. t11
    8 \8 q8 m* q& B" U12
    7 {( r9 a+ {" G0 Z. B13
    . s+ N6 \3 z4 Y14+ n" P  H3 a" [
    15
    8 Q: }! {$ j. {/ m3 w3 T6 e16
    ' G- t+ E, `3 V4 ]* t$ L177 y* q* W& @# Y2 S; n6 W+ q
    18
    * a; h. b6 i6 I/ K19
    ! `. y. Q3 {* o3 _" ]- d: k20
    * u( E% \8 i: o" @8 M* n& u6 ^3 t4 m; i21
    1 R5 O6 Z* ]; U& `22$ ]  W! t* M' O/ W9 P1 Z+ J# }3 p
    23+ T# ^& h. F* W1 r' b4 _  l+ q4 b
    24
      _* x' K. F* n- F! d- [25
    , U4 _$ S( O5 O; f9 m# B" p2 c26( A% m/ T2 ^$ ]) v- I* c
    27$ O. Q( n" R, ~4 w
    28
    ( v( c& w! j. W8 e* `29# P( n& |- X8 z$ ~$ k
    30: F+ l3 u8 t$ V. ^; c" k( h
    31
    ( ]) J; A7 V* M6 Q) k: u32
    * t5 Y& a% h( i( ]33+ X1 I$ Z3 p# k4 z7 ~( E+ z
    34% K* v, A; s/ e- O5 m: Q  y$ f
    35
    : i% Q) A0 x( S) ^# I1 v: T36
    2 ?: y" `8 o2 V. h370 a! E# O: g% t: W/ A: U
    383 r2 \: [" t( |& A
    39
    % y+ [' U% s, q9 Y" c40
      N0 _: p4 e7 Q! q41
    4 U9 l1 @+ U2 l; u0 _, X3 I' Z+ S% Q- W6 ?  N" E' h0 \, b5 X, v
    + r; H  N/ A. T0 F4 u
    ————————————————2 N& C# i. i  a7 K% W4 J
    版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 o& ^. T" v. w' Q' i6 C原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
    1 E# @( i! x  X! c) R
    8 ?  O! D* E" h6 V$ i
    1 z, u% D, A% g' E4 Z; p( C' ]
    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 17:57 , Processed in 1.639425 second(s), 51 queries .

    回顶部