数学建模社区-数学中国
标题:
数学建模:异常检测算法
[打印本页]
作者:
杨利霞
时间:
2021-7-16 15:24
标题:
数学建模:异常检测算法
4 i. q- m( A' X4 o
数学建模:异常检测算法
1 D: U+ d& B, E L( F! q6 ? t
一、简介 – 关于异常检测
: \3 N+ ~/ v8 ?# R
异常检测(outlier detection)在以下场景:
( x4 A6 X6 B" O5 s
2 q- Q+ x- {, k9 v: }
, h, K0 @4 B' a$ ]( {. S
数据预处理
6 {7 {* U& Y+ o+ J; ?6 O2 k
病毒木马检测
1 `# C# }% B. D9 ?1 X
工业制造产品检测
+ c1 W0 L' ^& @+ {' l1 v7 B1 V
网络流量检测
/ r7 a2 Q& X/ d J
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
/ g, P4 G; V/ T/ u1 k3 \1 ~( B
4 e1 ]; K. c* _1 ]2 a5 S- O
+ P1 ~. [! ]2 D1 e
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
) u# d5 S2 ?, r6 L' W# w' H
6 h5 I7 X* ?% z" h. U& j* f) d
$ D, K7 E7 L4 r5 ], b
以下是异常检测和监督学习相关算法的适用范围:
4 J" z* u+ A1 O0 h$ I
! L* a0 l+ H! X% e" j6 y
+ g; X' w- B/ [5 q6 g
异常检测
+ v) ~( h/ b2 I3 F/ [' l5 h! O9 o
信用卡诈骗
" b9 q8 m; Z+ G0 o$ h0 d
制造业产品异常检
$ M4 l: s( Y6 K6 t2 f5 W% C! i. z
数据中心机器异常检
8 A1 \% Z+ u: _2 }1 n N
入侵检测
6 R% X/ F) z0 p& r6 t
监督学习
& Y' r/ O# i; D2 m0 Z3 R% j
垃圾邮件识别
6 R4 f3 i; V1 W- K
新闻分类
, q3 W; Q( o) o( M4 A' n7 C
二、异常检测算法
" ?. k4 v# M9 z% q0 h
& H% R( Y+ f/ [: y |/ B2 i( H
' O! h. p$ w' W& Q7 X# r! U
$ n/ b2 ^5 b) c3 S/ C
2 a L, s& Q p
2 ^2 S" f9 i0 |* j5 w; {: W
: |1 o5 y8 Z1 H' N# c; @
import tushare
0 ]0 h0 `( U5 e: s) F
from matplotlib import pyplot as plt
$ z- `+ z+ ~! Q8 l
; a: i9 v% x( P; Y% n) [' i
df = tushare.get_hist_data("600680")
, o; e2 V* b% Z. j5 O1 Q4 {
v = df[-90: ].volume
4 W# G& a/ S# [; {) ~
v.plot("kde")
* N- ^# {) ~. c2 k. X
plt.show()
% @, a& X9 k: B# W9 C$ t7 G
1
! H+ ]6 _% b% \! \
2
: p( J# H- r9 l) R
3
9 S7 s; B& x, s
4
% ]9 Q7 M6 J% y, w
5
) C$ P% b3 b; S
6
6 x o# b* X9 }" Y0 d' C1 f
7
$ [& E5 q/ W# Y
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
% i! H: {8 J+ c2 ^
& q: m0 E4 U; [$ `* L/ B' F ~
! j+ O4 A+ {- O& n8 i% K, q
& ~, `2 |4 i% g: s
4 y- D9 o6 T6 M) t2 s" q& q
2 ~6 y* X: v; ^2 I. c' ^- Q; w
: Z I) Y* n8 s# e: h
8 P7 b, B* q" c1 \) u j
9 G. R* F% }* \9 S/ i3 P4 g7 O
2. 箱线图分析
; O: X; q# L) l- r; c, t
import tushare
3 j$ L4 i0 f. o& g
from matplotlib import pyplot as plt
7 o5 G4 u4 a" J+ M
1 j: k( {9 d: g( X( e
df = tushare.get_hist_data("600680")
) g& m6 u$ K5 A. \$ P5 \
v = df[-90: ].volume
0 U- @. \+ M% v! `3 H$ R6 Q
v.plot("kde")
: k/ T+ j8 T, h- D5 ?
plt.show()
" N/ e% {, G( m ^) y
1
1 V6 p& b9 @& ^' X" Y; W3 v
2
: a* I2 w/ G- ?" m
3
" s5 p4 J$ Y* a
4
! N! t- v8 G/ N: \8 Z# F$ X8 y
5
& O/ F! C# {9 |+ u& g+ }) Y
6
/ J7 I0 _3 T$ c/ h# F
7
; m7 L) t& L) A9 @. O( z
" T0 o/ D# N4 q* K- s2 H4 _
' p3 P' B& u- H' G
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
4 N, E# ]( A7 b% t: h! s+ G# N% g
5 y1 M7 l; W% l
9 I6 c. Z1 j! n
3. 基于距离/密度
0 o3 j. n+ O) d* ^ W# Q7 D
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
0 _/ ?/ k" ?; \6 D& A+ o+ [- ^
e- E& K2 e+ l3 n, B4 I' M
+ ~/ b, R4 e" l% W: o$ o
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
4 v+ p7 [/ A* G- }9 u
0 _; W1 h3 J5 w2 H
( u2 R; v0 d; N7 Z& Y8 A( s+ r: ]5 T
, t% s2 i( h! _6 y$ ]
5 d4 ~! Q6 O! w2 f, k
& p+ R0 }5 ]* F S$ b
( s- j: O' t h" u1 @
+ g; @3 R* d# R% ~$ E
4 K0 ^' t2 n# K8 ~& l5 y, c
4. 基于划分思想
# y6 b9 F1 @: t7 ^2 v" g
典型的算法是 “孤立森林,Isolation Forest”,其思想是:
1 X" q0 z- y) a7 n# R$ a
8 ^: p$ }9 ~. q
3 L& K" z7 I+ r; v
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
7 a2 \, q* Z, u8 g8 B0 }
! g% J' D, c2 U/ \
$ N1 P& W* w4 z7 D7 T( P% r4 y
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
1 M* K w S# {7 H
# d" }) m# ?" k. \8 E/ f
0 d* D9 X* `% d# K
import numpy as np
6 Z# H& D8 g0 D. p( C
import matplotlib.pyplot as plt
" G3 a4 P: T1 @ |: P2 p
from sklearn.ensemble import IsolationForest
% O0 @% Y1 w5 [; w: Q2 ^
0 z. p/ k9 A' y! Z! Z% r M
. c ~% M3 N3 E
rng = np.random.RandomState(42)
) W# Y' ?4 ^. q: |, |7 y, x- i& k
6 g* `0 d4 a' x( v
" |# e6 p% ]0 t3 d0 i2 J
# Generate train data
8 B) N1 @; |) |
X = 0.3 * rng.randn(100, 2)
$ H% I6 F. M% E# A; `; y
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
: _2 @, w' `7 D
# Generate some regular novel observations
3 j4 K0 Q f6 U; }3 t
X = 0.3 * rng.randn(20, 2)
- P4 C% y6 C; n0 w9 i! H! M) c
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
2 p) }- S# p! Y* W3 n) b6 x+ `- ]
# Generate some abnormal novel observations
2 P A; r" y: T# M
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
) v* n' m$ ?- C4 j& {
& O6 ?& Y0 n# o+ {: g
% w" v9 v( K4 I5 [7 N k
# fit the model
2 H7 L- T: _# q6 A
clf = IsolationForest(max_samples=100*2, random_state=rng)
9 @% D4 F% N9 m0 Q& y
clf.fit(X_train)
5 O$ r' G; w o, H0 s
y_pred_train = clf.predict(X_train)
4 N# g) }/ f) A( n `2 B
y_pred_test = clf.predict(X_test)
# v) _/ F* w5 t
y_pred_outliers = clf.predict(X_outliers)
2 d0 y k8 @' |% z7 C
* t7 S; ?9 ?8 D$ b T, w- @
r/ w3 q, i5 i5 t
# plot the line, the samples, and the nearest vectors to the plane
l/ i, c! m. ?2 O3 o3 Y
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
# q- r5 n0 d, R' n( I- S& g
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
: r9 Y/ ^5 Z* p! T0 u4 O
Z = Z.reshape(xx.shape)
2 \" d( O0 d0 ~, x" k* \
3 a( X6 a( ~6 a# \( V
5 Z6 j' Z. L. f+ U2 \2 ?
plt.title("IsolationForest")
/ `- c" }3 x5 B
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
# v$ ]% A( b0 ` a& t
. D; i, Z1 e/ }- A! s$ f
3 l% q) ^7 h. e6 `
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
5 w. r$ t1 p( k) W+ x
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
/ U) q9 K9 x# H
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
; q2 K& H$ E( K3 J* p9 v$ e& Y, [
plt.axis('tight')
$ l: j b0 {/ k
plt.xlim((-8, 8))
0 ~; |; f2 O8 A8 y7 B4 ]: q# W# C
plt.ylim((-8, 8))
( V: f8 q9 ` E+ u1 q) b) ^/ h6 E
plt.legend([b1, b2, c],
% K& A1 V2 I- d% z6 K* _
["training observations",
/ z- \5 B" I9 H! T# e C# e
"new regular observations", "new abnormal observations"],
0 Z! H; f O% d. c# c
loc="upper left")
/ Z. Y+ ?. T- L$ y9 w* D
plt.show()
% F: b, _% }; f9 x3 z$ S
1
, ^2 C) x- S u8 G. P
2
3 K7 H8 S3 V" ]9 Z* y
3
" l9 X8 v& w' H2 M5 m/ p g
4
: M" w7 W% y1 H7 P
5
' F5 F% d- V3 \, l' n: I& c1 y
6
" l+ ?" g2 p- Q8 t6 X- Z
7
' |0 b$ j1 p% P5 w( g" L n
8
( H7 L! b7 {/ C1 j. _! ], b
9
% Y" D* V* n" [7 f L" T
10
" D# P5 `8 W' B% m# g3 D& Z# b _
11
! k6 S8 T4 Q$ U2 ~# h4 Z
12
9 U7 ]7 u* y9 |4 Q
13
3 w6 \' Z6 Y0 J6 ^+ P
14
) K6 t6 u% |7 V2 r0 n! u
15
/ [9 c* }! B) a, |$ \! b
16
# f# {5 \( g% u9 B, ^ w- M
17
; L J/ A' J; n& ~
18
/ P" I5 ~4 j- j4 E
19
% \0 U, z3 D1 F' H3 C
20
, I8 q2 Z$ N0 p. o3 }
21
- C8 ^4 y$ u* D1 I, ?, s# j
22
1 S/ e; h: s" V; J/ H1 e/ D
23
1 X3 e0 J5 V( o) I
24
) ^% h6 w% [2 s( W" d
25
D R% n& f! d
26
% e1 [8 l& J, ^: Z" f
27
3 a' [# g) r4 m; Y. R0 S
28
- |8 p9 B3 q; l5 U( z& L7 e
29
' C0 {- i/ o! Q4 }" g6 B
30
8 A. x% e" o& n0 u+ D3 A) f0 P
31
& K& @; H8 x. C* l# r- y/ V
32
' I U4 F& `; b+ X9 X1 H
33
/ z# D, j Q0 [; H# X; ^ b2 e( n
34
2 @$ J! K( G) l; h. R: z$ e! k2 T
35
' P, S0 W3 G/ L; r# {* i
36
# l/ f5 H. X( N8 U2 q7 v! H
37
4 a1 D2 ^. M4 f" ]! L ?" @
38
/ a* I0 l- G i, @
39
: I9 g: ? u; C8 K N" r
40
1 r* _( c6 ~7 t
41
# w6 a# x. m/ h+ }" ^
* D/ d0 l8 {& [6 X
& ? ]1 D$ q) A2 a6 T& \) \; ^# K
————————————————
) x9 J( Z( v2 u( ]: x- f
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- x6 U3 e q& d6 u
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
. F4 q2 m; g$ n: g. w" v
; D9 u+ h9 j5 O- `# I+ \
; C7 G" K4 b- X! d$ ^
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5