数学建模社区-数学中国

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

作者: 杨利霞    时间: 2021-7-16 15:24
标题: 数学建模:异常检测算法
2 M; f: k) M$ p4 c# x
数学建模:异常检测算法
9 }- j% \0 ]( h7 {一、简介 – 关于异常检测' O8 ?# D- \1 L0 _' Z9 G
异常检测(outlier detection)在以下场景:
8 F" e0 ~! @9 ]% L' g, ]* o
' D! l" C* l; i3 n& i
+ U5 e9 a3 I$ H3 B4 j
数据预处理
  p: h7 n0 d& s2 d! Z- Y病毒木马检测6 c$ S# T- D5 a9 V* ?
工业制造产品检测
( g. Y+ i' f( w6 Z$ K网络流量检测/ Y6 d( Y8 T3 Y5 {- U+ r1 z# k4 ?) q
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
( I; P* Z; I/ c5 H9 z! [+ ~, X) v8 B+ r7 t; U/ C) y0 d

9 b$ {0 ^! l3 Z监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。7 A, \' L' d" V; w6 ^9 w* r  U9 [

8 @, I" I4 o, L( w8 K- I

* R" s9 b# n2 X7 f以下是异常检测和监督学习相关算法的适用范围:3 H  G. r: ^' u. A; @. K4 m+ [, T

* C+ U- z1 G; f3 }

7 h1 `$ W5 `7 S* ^( ^9 i1 {( ?异常检测
( C2 ]  d( ]! X3 `6 k信用卡诈骗% |6 Z" x' d5 t3 R5 M3 J/ {
制造业产品异常检8 p* D- {; Y: n/ y# I; H
数据中心机器异常检
! G" Y; j4 h5 w' \$ h入侵检测+ S7 T2 _1 a" I3 f6 s
监督学习- ]. R/ D2 M; w3 e" c) {/ v
垃圾邮件识别/ y$ Q) |. i" ^$ Y' r
新闻分类
% R+ W; S* U+ A+ i+ W二、异常检测算法9 G. t% D$ ^% W7 v4 N1 K& E

5 K, Z6 T( q$ y( m* X5 c) ~+ F
# r$ q" Q& R& j! P7 F+ M

7 j4 h7 @$ C4 B- y3 A
6 P4 f& I) m3 ^! z4 n

; E5 a" G5 I$ _2 m, k

+ k& Z! \+ \: d: n- C# O, Kimport tushare8 |# H* \( h7 O3 S$ Z! t$ W* W: \
from matplotlib import pyplot as plt* @. d, u8 }0 q! c1 @
9 e) X; o, `0 P! d, E
df = tushare.get_hist_data("600680")
6 [$ M* j6 }# N, d. lv = df[-90: ].volume& j2 I9 H* U3 j" L2 q) V6 \
v.plot("kde")  c' k. N& J" W' E$ L7 U
plt.show()
; M& m" y: F. u4 _3 l1+ ]* }! f/ b; K! Q; x9 V2 j
2! g! c( Y1 h9 [( u8 @
3. B9 D$ E# X% m# L& G
4" D2 ^5 Q0 R- Y" p
5
$ L# [! }2 d1 N: t! J6* [1 E5 C- \$ M1 R* F2 B5 t: B) M
7
7 w9 B. i  M4 p5 H7 v5 R, o近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)) D. M  B( y) N' M/ h9 y
+ Y) s# E5 |) M/ e
5 x6 K* i/ y  x

' {/ u2 |% F5 K$ H7 b0 X

3 I- r" s+ B! M" G& ]8 y( U5 P' x: ]" h3 N/ ^- ?/ C* ?

4 X5 \' s& F' e7 t' H) D
" j4 f+ @  \; b2 A
0 c3 z, H. l8 v! r5 y4 d
2. 箱线图分析7 p7 H  K8 g. e% N
import tushare  h6 I- _) L3 {' S
from matplotlib import pyplot as plt* x0 f- u; Z$ P& M; R; p, m
! j$ }8 P9 I4 Y& X. F' G
df = tushare.get_hist_data("600680")& X5 U: h' x, [6 m( X7 ~
v = df[-90: ].volume7 X: h! M/ l% V. ]! w
v.plot("kde")
" M  c  H# ~5 K) G- I" Oplt.show()
2 |6 ~9 C* `) b) s+ g1+ y0 k+ z+ n) c4 j
25 @+ q! J4 I; m( f
3
0 _; f8 a; x2 |6 y4 N8 ~4
0 R* Q2 ]& j# _( E( R5
1 h; ]6 K& E/ ~6
& r* Z* B$ z4 u: w7
7 d: h5 K' h% S" u  V2 @9 Q( Q: H: _. s
& c" Q) @* q0 W$ E5 h# J: A" e
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
: ?. d8 R$ y# B# P- v( s( w
1 A1 \3 {7 G; l( S( h
) W) N- l, y% h1 R2 W
3. 基于距离/密度
. I# s* s' S. h$ h典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。# |* `  Z' b4 }+ g

* [% l4 N& V( y8 D" _% F1 Z/ b
5 b) X7 d- Z+ s2 f2 K" f
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。) x& U8 b6 O, p/ Q6 i

7 ?8 n9 l0 D2 H/ \7 W% |4 [$ Z
5 m9 I: J# d, E) W- Y7 G% W
+ W3 f) i6 [/ ]+ J4 O; }

4 V8 O' W: m  O& I/ t! |/ L, A# P9 N9 F) E

: }! V6 t; V& V* t0 `8 M
/ o7 {3 H( d1 a5 A
; u; |( k( d" D2 u# {: D
4. 基于划分思想2 w6 {0 z( B+ ~+ G
典型的算法是 “孤立森林,Isolation Forest”,其思想是:8 Q2 B; k. Y$ g& G) y) H: [% A0 }
% E# {9 R, E% G
9 O  D0 W1 F: O6 b3 b
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
1 a  S6 q4 [1 ^
3 i* W5 `5 B# u. e
5 s: n, z2 g/ Z; j2 X! J4 i: D
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
: v% o7 Y# g4 r7 i+ v9 h" }& [+ D
1 M% m* I9 a" N
- G' L2 f9 ^2 W" F9 L5 ?( ]' V
import numpy as np
3 s# }( e8 ~) |0 u* Q: s: ^5 Pimport matplotlib.pyplot as plt
4 C8 ^) g2 d2 A- J; Nfrom sklearn.ensemble import IsolationForest4 {0 @! }+ ]7 v4 s7 i

) D3 V( x' _" d+ ^
) M, j/ w8 ~! Z% {8 c9 `
rng = np.random.RandomState(42): o# ~: o& M" G. {

) L  e) g. _9 F6 d1 [  y. Q4 H! ?

+ N. G3 w& x4 X6 N5 S# Generate train data
" l9 o0 H( I9 W1 H2 IX = 0.3 * rng.randn(100, 2)4 n0 ~" c, n# ]7 P
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]5 T( B9 e- n) j0 F$ D3 x6 `+ C
# Generate some regular novel observations
# M; B1 V4 s% o: P3 K4 I4 d9 _X = 0.3 * rng.randn(20, 2)
$ d; m; ]5 B4 h; s" A" P( {  RX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
3 s0 R' x% m3 d# Generate some abnormal novel observations
% j; n0 g9 {) y/ W$ XX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
8 o8 M- W6 f1 d2 C3 i3 I' ]5 i; {6 k* `$ }/ O9 o2 h
( L0 X. e8 y* a6 e
# fit the model
; s' v9 q8 W% f8 E- s; p3 W$ Wclf = IsolationForest(max_samples=100*2, random_state=rng)
# i7 j+ y: _" _" Y+ \clf.fit(X_train)( c& }- a1 {8 _) a- p
y_pred_train = clf.predict(X_train)% \7 `, f$ j* G' U
y_pred_test = clf.predict(X_test)" I* b8 O5 \( f6 `( \5 x; y
y_pred_outliers = clf.predict(X_outliers)
) p& i7 z7 [2 u: C, B
; V  k% S" j# h. D
( _6 _! s4 G4 m- I$ t" f
# plot the line, the samples, and the nearest vectors to the plane3 n1 j) |: f% a) ]: a  w
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
2 _3 N% x) G  \, R6 MZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
# ~# \6 \! H2 u. @! T. a! Y/ m6 h; nZ = Z.reshape(xx.shape)" ]& b6 N$ g6 Q: |2 a1 J7 T

' F8 g1 J& u& F4 Z7 C! z
3 x& V; a" O- N) ~- F) x9 k
plt.title("IsolationForest"); ^8 o+ c3 k' ?4 H
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
- c% U3 l4 U4 H* h3 h4 s8 Y0 a1 I
; T$ R! Z7 X3 x  T

+ V1 k* i5 n) K% ]; }b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
+ e6 H1 [# {# ~) f& N# B1 v3 ]. Ub2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
& ^# _& V9 R" o) T% s3 o7 d2 dc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
5 X: u$ Y6 l# |plt.axis('tight')
: a( V6 p3 y# b) N5 \plt.xlim((-8, 8))4 s7 i- ?+ K* p2 A% D- D" S* f
plt.ylim((-8, 8))
' l. \& J4 H( lplt.legend([b1, b2, c],
4 b( [- ~- Q9 m9 D! F  L           ["training observations",/ A: o/ m8 e( ?; Y
            "new regular observations", "new abnormal observations"],
2 p" C. O4 l% E% N7 O           loc="upper left")) b8 P- \2 P0 Y% V2 O7 L: n3 k
plt.show()" i; W$ D$ h' J, A5 l+ g
1
5 |+ C1 X; ^4 z6 O5 a2! G  E% R8 C# P6 ]" [. ?
3
  @# H/ C/ u( V4 h+ }43 Y8 o3 p% F, }; ^% Q" g
5
# \; q* I: h; q' X' L* h$ g6
; R; L+ X' M5 R+ j  _7
/ O  O2 c; S+ a7 ?1 G  Y8/ W+ A8 t/ T! E3 G3 n
9
! k) }: W" N" L/ M* K6 X10/ M" [) N% a% w, w) w9 ^
11! l2 J" N# w. w; `. `. m
12
5 w& t6 y# F9 W' b6 E; m$ b13
' J  H+ l* \# e& @0 S0 z14: r8 Q/ w6 ^  p  I* e- Z& C  {0 a
15
  ~' F- I# n/ G4 \0 ^/ O. z16
/ s: O- r9 A1 y/ ]2 H177 ]: G" }, i! [4 U1 P' Y* u: K7 T
18
; L" W# n/ w* w- O/ G  q193 d& E: e6 {( Y' e( m
20
. B) c5 x) g# R, T/ x3 ^& w" G218 V! [" w3 V+ Q/ Y+ Y! ~. J. q
22
- A6 A- i0 E" f6 Q23
# C0 u- [0 Z$ ~% S$ s24
5 k3 V( B5 u" N* Y7 T$ d: O& s- r25
4 O+ p8 }3 X! c" ^" U, u/ X9 W/ L26
! O! G+ v' G5 X+ n4 b" X271 @: W9 P% `, T
28# H; O+ ~" e2 J1 V
29( O  O( F; r2 b& `: J7 |4 x( N
30/ g0 s1 C5 U$ \& X
31
9 d1 k. W7 D) ^( ?$ s! C/ s. [32
2 X/ n  T6 M$ r* u; |* b33, F6 o# B2 {3 Y/ l% B7 t/ \5 a
34  j: U  o: y5 ^+ {1 N
358 d* F9 o9 F. t' m( v$ O
36/ _8 ~; k# ~* K
372 Z7 V6 J* q0 Q  A, c, v
38
* F, k5 D/ X8 @* ~4 ]! F394 `0 c9 |- r, W5 m
407 S" E# }) ~/ ]& C3 V+ w
41
5 `3 `5 W& Z+ a7 f% p
' o  o8 b( u* X0 G; _' z* i" D  @
& |. C8 ~! A) @+ P2 G9 }9 l
————————————————4 F: A: [, y8 z5 o6 n; Z& I
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 v" t( H( b/ g! J2 l
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
7 ^% @3 R$ d/ ~0 E8 c4 d& H7 _% ~+ I# P+ {; i: V

7 ]2 I& l3 \& W/ f0 j* z0 P




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