数学建模社区-数学中国

标题: 数学建模:异常检测算法 [打印本页]

作者: 杨利霞    时间: 2021-7-16 15:24
标题: 数学建模:异常检测算法

5 c; |2 W  [$ F& s- L数学建模:异常检测算法4 I" {4 x- }- ]3 F( Z$ o$ [
一、简介 – 关于异常检测
+ C- K5 Z# G" I3 ~8 }1 J+ B% \异常检测(outlier detection)在以下场景:: m/ D5 p$ c$ c8 Y5 |
$ Z( W4 P, u" C- J
7 a( }4 U! n( D
数据预处理
5 I* [: D2 e" g4 P9 {, V5 \  A1 n8 t病毒木马检测
" D4 Q/ r% P, @工业制造产品检测
* Y3 N5 ]: |" }3 B% Q( E. B/ [; x网络流量检测
( w" `# N7 k' K4 v/ ^& i0 ^等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:' F* a/ l3 I8 `. E

- x, k0 I: ~' l  Q& e
& c! z% i# W, Z0 H: {: D
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
# ^3 x2 t' E# g+ C* Q, {
" _6 e' k6 e6 L! y; M

" |  v1 t9 ~+ c, d以下是异常检测和监督学习相关算法的适用范围:" m: |8 X2 t  K0 {# O

0 V& h8 |+ j7 d5 K0 Y# R

: m& H" I, h; K) l* t( D异常检测
7 w7 t2 j7 p9 `; f信用卡诈骗8 \' n& J) W$ z
制造业产品异常检
# ~# `; `1 c* V  }/ b  R& e: E数据中心机器异常检
2 h9 l3 z; X: ~) V1 ^入侵检测
, B% S/ P( O7 U监督学习
: k" i) o3 C( u8 v) d0 ^) q8 R垃圾邮件识别
* L( ^7 {( O  W. s% e( ~新闻分类
0 Q/ D+ R( @# ~& l二、异常检测算法
' r1 a+ w/ b* |+ e5 \" q- ~! v1 D. [' [

3 e" v$ C  I! k& s8 [* H8 M- [: U6 b8 G& N( l4 O" G# q
# ^/ H! M9 |6 K: a2 v7 e, J
+ |5 Z, `/ X, ?' s3 J
7 p8 ?+ [$ b$ w* s8 d6 r8 v
import tushare" @8 ]" n5 f& ]
from matplotlib import pyplot as plt
; r) @* m7 U7 p7 t) u# m: Z+ k 4 E  A; S% H3 Y
df = tushare.get_hist_data("600680")8 J8 K) k- z6 ^/ \
v = df[-90: ].volume
, ^  p& P8 ^2 O; m7 mv.plot("kde")6 z' c1 s; I3 y8 m
plt.show()
7 E. Q  g0 Z- I9 _1
% j$ s! ]1 Y3 f' A" ]2
+ o* |! K* f; T( }37 R5 [( w, y" Z: o
4" ]3 N0 f, K* ^& W5 A+ V: [( w5 F
5
7 t+ ~: f8 t$ d& {67 v7 j1 e" k, \& {2 S( u; s: h
75 @: I) _. \$ h6 H! C( M* G$ m
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
  _4 d# X' |' g( X; p( B" j1 v
3 q( ]) ]$ k# o; w$ _
5 l8 e$ f4 h- t  ^* [/ Z: b2 g
4 b2 }, I! ?- n) b, ~0 r. v" o, f! S

' l* u: k) P; p4 b& z! C0 {5 _- t. T) W9 Z% i3 D" d
3 D$ p  A* X$ a1 Z& v6 K

% \& k- z; G6 d3 i3 T
; j! Q. \5 n6 H; O  T6 `4 h, |0 o
2. 箱线图分析( S; e7 s$ j( P- q. Y, l
import tushare
8 B) R: H! b0 B# }  H* q/ i5 kfrom matplotlib import pyplot as plt$ @8 G4 M% q$ n
7 B$ V% @. k0 c& O2 g! |2 _
df = tushare.get_hist_data("600680")
* _5 F/ t: Z  q( K' Q, B2 Zv = df[-90: ].volume+ O0 C1 _- |7 e8 U" O
v.plot("kde")  k! q# N5 T( f) z" q! n( x7 r
plt.show()6 O! w9 z9 t1 K+ u% I( e
1- m" k) V7 E! w8 @3 \9 n, J
2
+ C; y5 r" }+ z7 @3; _% ]8 G/ @* p) g7 r
4
9 U# a. K: @9 T* [3 i! ?9 W5
4 h; C$ j8 h0 g+ A. c1 P- c, A3 N68 S( k  N8 ?2 B, G
7. G2 K; F- {( T4 L
( ~0 X/ Z% Y6 [. V

0 S! {& |" ~( {! J大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!# ]+ G1 [+ n, F9 C

6 B# {" J0 |5 B0 H& ^

/ E6 E( ~( R) d- U3. 基于距离/密度' e8 |. F9 i; w: |2 {1 r
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。9 r" A# S- R$ m- T
2 D0 p4 C& I) h2 s! g, _6 x, U

- s. w9 ]# U$ U  v7 j$ c7 h% k用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
4 N+ P! z% S8 O- W
" `; {4 n9 c7 S9 b! h

3 M( l6 w, V7 G0 Y! O$ k7 L  `' K3 M- |" x* f
* R6 ^3 t+ S$ R
' y; l# p( n& U. K
* y2 p" e5 d* r0 f1 ?" _# y

, e+ q5 d+ I+ X: C4 C
) l& X! r: n3 ^0 R2 t
4. 基于划分思想
5 \) u. J9 _& G, q- O典型的算法是 “孤立森林,Isolation Forest”,其思想是:
! ~% l2 i# X9 s4 L* r4 r2 n( v& l) X6 P# O: H$ u# \4 x0 w
4 I3 A7 b, E7 \; w0 T
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
1 b# e; Y. `' r' L- b* p5 U2 O" g  B1 B3 K3 R" O' v2 e9 Y  x
' X9 Z# v* o: e* @. f0 W  _4 Q
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:3 u  f- G! f& f1 c

) v- f$ l+ X: ?6 t; R( r7 x; U. u
9 k; b3 }! H* t* S- R
import numpy as np7 E4 i7 R6 Q( p. D$ r, X
import matplotlib.pyplot as plt3 S( g3 f. B/ Z% U7 y/ j5 @( U
from sklearn.ensemble import IsolationForest
( k1 C2 e  j+ ~; n  w
. ]0 a, C1 a, t4 _& E2 V4 \

* P1 E6 X8 G( q! Arng = np.random.RandomState(42)1 [7 z/ R' f  _/ A% ?- {  ~

0 n) W4 n' U. M: I# z

8 g/ s9 |4 E3 o" V: c  f# Generate train data
9 x* s" W! g* L! SX = 0.3 * rng.randn(100, 2)- @1 l# U) c3 S+ t# ]7 O
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]! G0 e1 _) M. }4 ~) K& d& E
# Generate some regular novel observations2 e' A( u4 U  h  y; K3 Q
X = 0.3 * rng.randn(20, 2)3 r( {* k5 o9 d. R
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]  O! A! J0 V+ M$ h9 Y$ S/ k4 ?
# Generate some abnormal novel observations) b* m9 Z4 ~$ k9 B8 A
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))6 G3 q- p! O8 C) B
: ~6 Y0 H5 t( A

( d) p: M6 j: X) i# fit the model3 @! [" n+ @5 Q* _& s( B0 `, Y0 a
clf = IsolationForest(max_samples=100*2, random_state=rng)2 Z! E/ `7 K5 [+ {& S0 D/ D6 g
clf.fit(X_train)
# |& ?  B+ g; E! {( n0 Gy_pred_train = clf.predict(X_train)
4 V- m. j5 ]' R' v' i/ V' A; v, Ky_pred_test = clf.predict(X_test)0 P7 s  o( Z! D; Y- C
y_pred_outliers = clf.predict(X_outliers)
7 K: C; T0 W/ Y, `& ]# k+ e' l, L: C& _1 X4 M" Q" s

0 E! A2 S! V9 J# plot the line, the samples, and the nearest vectors to the plane5 ]8 b4 L" h- b* B
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))' i4 I9 j0 \: X5 g
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])4 I. Q; ]: h- C
Z = Z.reshape(xx.shape)7 G& C- x' l, q; s
, k  T/ E' @2 w5 h3 |) [2 ?$ C5 f

' V* r/ b0 ~3 C6 Z* L$ Q% J1 xplt.title("IsolationForest")
2 _; b  ?! c& }& F) a0 c$ Dplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)4 V3 N  S. |) O" B# W. Z# S
; K6 C; x! i$ V- ?

0 y  E/ |* g: Pb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')0 s: r+ k. U: C5 Z
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
; y& x0 y3 `5 R" j8 M* Uc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')/ n- W$ p& a" j
plt.axis('tight')
) a. I8 m9 l: wplt.xlim((-8, 8)); F5 e2 T2 {1 q0 Y
plt.ylim((-8, 8)); @  u) Y, \4 T+ e' A6 D' z9 H- i
plt.legend([b1, b2, c],
& S3 m$ O/ u9 Y3 B9 L           ["training observations",
  ]/ b3 @% B; v            "new regular observations", "new abnormal observations"],
" n, K1 i* R! J           loc="upper left")
  X: ~% F7 J. bplt.show()
( D, {; l6 W3 {3 d1
0 N' ]* N% ]  T+ W0 ]2
1 g" j7 f) d8 h3# b9 q8 X1 n! n% c) X
4, s1 E! n  t8 ^) m' i/ Z
5
" `4 b3 P) I/ k' K. O! r2 k+ n6- R* m: `/ p4 }/ m% F
7
6 H  |; ^3 ]3 J: C$ N5 R8
! m; h7 j; @4 C: k9 ~1 ?: Q9 O4 j97 U, ?6 h$ Z( T2 [$ A
10) W! a2 j# g4 ], T7 L" d5 o2 [
11/ x1 O& `2 |" \/ z" ^: l: i
127 r( e( N$ V! R: ?7 f
138 s! M. x4 B) d% @7 j7 O+ z# B
14/ Y3 x/ v7 d! E6 {8 x& r
154 Y, M1 s6 F9 J4 v! b" @/ x
16! `. T1 H* y  Z) e! ^/ k
17! T+ d- T9 w9 x0 p1 _3 n( `
18" F# }- X6 ~( V0 {, N7 w
197 d- I3 }) g, V  V& k
20
# r5 {6 x4 W/ }/ Q8 s219 k: {/ D. s8 o
22
% ]1 f( H, L3 R6 K% ?8 e+ Z23
( h3 I% C3 J' J& R3 U  {243 `2 n* v* }/ v( L- l* g3 u+ i
25$ a( G* M1 q& _
26  @6 Y$ L1 [6 n' p1 N4 O* j
271 |3 P, A/ \! U, f( I' c, r
28: ?! b0 X" f3 ~% A8 ^" Q; n
29& p0 z2 I$ S+ w! {" p' K: @
30
! Y- t( Y3 X; u8 M31: X2 P: I( |9 V( v5 m0 [: L
32. i1 S$ Y* B6 {( T
33
8 E! y1 y: k" e! G34
6 m6 k0 p" s3 M& s35
' |. K3 F( Y$ i# ~) _. _: e36, C1 f5 E! p: E4 W' M/ N- t
37% k- w- u  L0 z
38
6 T+ n5 I6 r6 U0 v" x' A. T395 _- H* x& S( p: N/ L/ U
40
8 _, u4 K6 r; R6 e+ u7 ]; p: ~41
; \. m3 |% L5 Z" T) i6 z3 u3 N( w. X' r6 g' k/ T! m
  t" g) g7 Q5 F2 k4 u; d/ [( ]8 w
————————————————
' ~# j* c2 W5 w* K& R9 c版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( l, Q" G% {$ Z) }: \- o9 i8 c
原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231294 [: B5 Y5 O1 k' X4 R$ e* B# {

. t3 g2 y$ N4 R
6 j$ {1 ]4 |' X5 k, u5 H' P




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5