数学建模社区-数学中国
标题:
数学建模:异常检测算法
[打印本页]
作者:
杨利霞
时间:
2021-7-16 15:24
标题:
数学建模:异常检测算法
* m$ t. _# D) C8 \8 _0 L: x8 |$ t
数学建模:异常检测算法
" ~8 h5 c" f7 J1 \/ l% J7 C- H
一、简介 – 关于异常检测
$ l- |3 y% w* ?+ O
异常检测(outlier detection)在以下场景:
+ K9 o7 b/ ^7 ]6 V. F' U
, c6 k2 w$ @# T
. e* i& A$ }) Z2 l9 o
数据预处理
7 u! E7 o0 s# ~
病毒木马检测
2 i7 g: Y: I3 [! \8 D% G
工业制造产品检测
2 B( m. ~+ T9 p; E
网络流量检测
+ Q: b! Y3 P$ g% m5 {8 Q
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
# [- T2 ~8 C2 D/ ?) A4 Q5 V0 y
' F0 {3 k& {) ?# o v' x" _1 Y( S9 v7 U
4 f( M8 j- h+ l$ x; V! L
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
% O# Z2 i! l8 n: L) ~* |
: a! d/ ]1 I2 A; z. y
% B5 Q7 b# O0 H; H) A" N( y5 M9 ~
以下是异常检测和监督学习相关算法的适用范围:
* T( G9 b1 _ n% U# Q6 ]
]9 @1 b. T: R
Z% T' D- ?& Z; z9 U7 A
异常检测
: }* j* N7 x. x8 M+ e
信用卡诈骗
6 t/ S6 l/ k9 r5 `
制造业产品异常检
* Y* q5 g) l" |0 P4 J& a2 r! Z
数据中心机器异常检
6 m8 o' ^6 d& y. @- T
入侵检测
+ E7 V6 N8 _! ], |
监督学习
, c9 o: Y' [0 l+ A ?
垃圾邮件识别
; |+ w, }+ G- j, p* R x
新闻分类
5 e/ L0 P5 D4 ^) e
二、异常检测算法
* t1 c* F1 j! x! m# E, w0 C8 R( r
: H! J- n$ z" U5 r. |
8 i2 E6 R4 `4 ^4 ~! `+ C1 g
4 |7 P( l) u# a1 u; W
L0 g' `2 q0 a, Z; M. E! ~
7 c! Q4 q% z2 i2 `! a6 E" z5 T
. [. k% g) p0 ?6 C6 }
import tushare
. m3 `/ V& \ D! n8 W' _
from matplotlib import pyplot as plt
! i- `. p* |8 |! M, C
+ h' o5 S3 B4 ^0 ]
df = tushare.get_hist_data("600680")
# J4 b0 c% d: J! c% i W
v = df[-90: ].volume
5 R4 F+ K4 W9 M3 y
v.plot("kde")
3 [. r5 z- c# v0 T8 b) W4 I" Q5 q
plt.show()
7 X v) Q3 D, I$ I
1
/ |4 R3 z# `1 z
2
q& }3 z. z- [' n4 D. S
3
# ~! J/ A& o' T; _; ~% k
4
. B* p0 | j5 B9 n( p
5
+ _- A. J+ H; {0 r/ V/ O; b$ l
6
, K: t2 _& d5 V9 @( o* H0 P2 z. E' d
7
. ]. K# t4 o- N) h1 e
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
; A' l4 Y% k4 C4 B3 N& w7 }
: t& m( f# V( i$ z0 ] d. F4 i
, [9 s5 t; _! |& \8 }
7 j0 O( T* N6 w
/ C( I' n9 R0 b1 N
5 S; ]- V$ B& f5 J! @8 |% Z# u
5 X$ c9 l$ H! v/ z i
5 E- \4 r9 `% ?. m
, [! c* g) h# e1 p( W5 {
2. 箱线图分析
8 G# O, S, ?" Z
import tushare
3 L. z/ H0 O1 S2 v
from matplotlib import pyplot as plt
) P9 n% `- Z- P4 ]
* _, f/ b" R9 {" [8 f9 U
df = tushare.get_hist_data("600680")
' a* z5 l0 c: ~; P2 Q
v = df[-90: ].volume
7 F4 {5 ~5 I7 z3 ~
v.plot("kde")
# D6 _2 u2 _: Y8 U* Z m: Y
plt.show()
! t( [* w" |. L/ ^
1
) S: f8 e3 b+ [0 x
2
4 E* I5 s, E. d# k' L& B5 X
3
: n# g5 v- ]/ S4 d# u' `/ G
4
% O4 \9 p, K1 p4 N& r( r
5
7 ]( ]) u4 p& a8 q; ?# F
6
B: Q7 A9 }" P. p: D
7
8 Q8 l$ g. H0 O" m- }, y1 D7 u
: y- _( m" h2 S& b
; \& W4 T7 F2 d1 a8 W5 a& W
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
4 C: M8 D( n* z" V' t
( S% R2 B9 N: z
2 q! E) H) ^/ B4 W0 r$ Z5 L
3. 基于距离/密度
" {; ?; L) G& M" Y: H
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
: B# ^' M1 h# g! M+ q
: h$ r4 E0 D Y4 e( w' v9 H; n
/ R+ Q) m D6 H' F; u( C+ ]
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
; j3 _7 j& h2 Q# ]
3 i; B1 M( t8 B; C) N& P$ h, h
" k/ l8 n; n) @8 g' A7 F
- X+ A) d# d6 I, N9 c
0 s. Y D; r: N) I- I9 a
^1 i- y1 N* b! N
# F* K$ }7 _! j! O3 t
: k& ~- W3 K8 S( w7 _
6 }; v/ X6 B* e( o+ a
4. 基于划分思想
6 d+ j9 X) a7 {
典型的算法是 “孤立森林,Isolation Forest”,其思想是:
2 M* I" M7 c3 `# L5 k2 g3 X8 z# K
; \% ]8 T" ~+ ]
6 M0 n1 Q: h1 ?: r2 U& Q: s
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
6 |: a) k' \, K# W2 O) [! l
$ J5 D* s4 z" U7 M. k4 X! z& X
! ]5 @0 K3 {$ x' U" Z7 F) c" d
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
0 K' s V/ k/ N
+ e* {* L g+ G. _) y1 q( F* \
' J0 y6 n/ b3 K
import numpy as np
+ l" z6 J) Q# T2 R; x. x) h
import matplotlib.pyplot as plt
" H% k5 \+ n( n; c) p' G0 |0 f, }
from sklearn.ensemble import IsolationForest
/ [! s, O5 n* R# f& ~6 R8 T* U, H
& S8 F K+ v: W- _1 ^
2 V: {* z# W ]/ J& l f
rng = np.random.RandomState(42)
0 m' f' z( p, |' Q5 i- T
; w `5 ~! n/ D2 u! t2 Q) g& F
) }- `9 ?* N( M% B0 u
# Generate train data
9 ?( v4 C; Y# }& I8 M
X = 0.3 * rng.randn(100, 2)
* S( P0 O5 |0 S: O# _% G3 D
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
5 t) T) ~/ x. z+ N% j v) v+ s8 A
# Generate some regular novel observations
1 e$ ^5 c: v/ v9 e/ [
X = 0.3 * rng.randn(20, 2)
9 E9 X5 }( L5 s1 L7 a
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
4 Q, o4 g: R& U" O4 A/ Z. @
# Generate some abnormal novel observations
* n/ a' }/ Y* Q: R, \
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
3 Y% m% U. x5 D! P! n5 d
2 f8 U/ u0 X5 t! R$ z1 g
$ C: D5 x2 I7 i( S2 _
# fit the model
: j" ^% s8 I. P) z
clf = IsolationForest(max_samples=100*2, random_state=rng)
. M# Q! O6 E$ q( w4 k
clf.fit(X_train)
/ p% N1 M% A |/ G Y+ x
y_pred_train = clf.predict(X_train)
8 C8 B' u- m- U l! j) e
y_pred_test = clf.predict(X_test)
9 b8 t! u; f) e v+ o$ W% _1 g
y_pred_outliers = clf.predict(X_outliers)
( T) ~8 z6 T7 \! L; D
, l+ `3 b- L5 h2 {2 {
+ _5 A" Y& H; O" C/ k' W7 S
# plot the line, the samples, and the nearest vectors to the plane
3 b2 d% c( a0 F& c7 ]
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
8 a5 J6 _) f, x4 D S
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
+ `! d- L$ x1 f( ?+ n# x
Z = Z.reshape(xx.shape)
9 H2 z3 X+ C+ D8 m3 @/ i
' _6 m/ X4 n8 x4 E6 u
3 r& ?: h3 d9 P, M
plt.title("IsolationForest")
; A" _; |) x: n- G
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
" g, e4 Z9 D0 X* g
- s# q: [6 j q5 S
O8 y9 B7 O( N' H0 Y! w
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
! \/ b9 z0 G* G1 c
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
, v* g; B8 n2 W* K! w+ h) u/ y
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
* g2 B) a5 R+ q" Y& \
plt.axis('tight')
5 e/ ^5 z/ [& _# D/ C+ ]- ~) n9 d
plt.xlim((-8, 8))
' `) |, b/ [+ J3 k) e# f
plt.ylim((-8, 8))
; o: I4 p- m" F" K
plt.legend([b1, b2, c],
% k% {. B& e% y9 }+ `6 X
["training observations",
1 @* z' w( j, e5 X" I/ n" g
"new regular observations", "new abnormal observations"],
" F$ j0 G7 T `# E. T
loc="upper left")
t% @' K' k: W% m' n4 C. `( p
plt.show()
& }( }$ T# G" A( t6 f" X, |
1
9 N- a. Q! J- G9 t0 |, @1 I. G, j/ m
2
1 j* l4 z0 r- i
3
# X; i7 V& z' ?: ^7 H6 ~+ p
4
5 y6 Y) G- Z0 ~* s+ e- c3 w. m
5
& U4 H; o+ f- `: N" P
6
8 E" \5 ^( n/ l: V" J' w; W
7
. n: x v0 P4 Y, I
8
. @6 }9 W6 |, U, c
9
1 _1 G1 k( k0 r; s+ m
10
1 y, }9 S! I$ ]. f
11
8 y* Z/ U t) w4 ^( ^$ r3 f# n7 z; u
12
& k# q- h, E% Y6 f# n
13
6 x2 d/ |+ R1 s/ l6 P& g
14
7 c1 k; l8 F. ?1 z+ P
15
% X9 Z5 ^9 S- u
16
( S8 g" V% U6 S3 q/ v7 u7 ^
17
1 a+ `7 ^; {& k6 `, O; Z
18
) b% M7 s. U/ {! f. y6 l
19
# W$ M+ ]; p2 E) ~2 ^
20
) y+ W0 J6 a3 M& ^: n% E
21
- }% {/ E; H7 F9 y% G+ |1 `; n
22
% y" X! v: `+ f
23
) B( \ i' E% h$ V+ ?8 j
24
% A4 V$ i2 J7 d* q1 c
25
! _$ H4 W# I! S3 ~5 o
26
, e% ~1 b2 _$ G7 d1 e' S
27
/ F; a, T n* y1 n
28
+ g2 D& }4 Z- e1 c# C" a
29
# O2 k3 D5 D" {( z4 D L
30
# s. Q7 Y; s6 S9 a/ r4 a
31
' V* c2 X8 X9 q/ G" l
32
9 @1 F4 p9 V5 P& } \# m: o/ Y
33
. J% s+ z+ B4 j" ~1 D3 _/ y, a; p
34
$ d3 V- C6 R2 E! d* r3 Z. T
35
5 G, o' ^$ g, B4 g8 k- e
36
; `& K5 f% `' J' ?0 [
37
# g( W5 x5 y% l1 @# Y
38
2 W$ h& C/ N, }: a! t
39
& H e# U9 }0 H0 S" K. w+ S
40
& }* C7 H: c# F9 `5 M' y# V
41
' N% u. X T$ `
4 h! b+ m4 h( |5 s6 t! f: _2 j
' L5 `- Z, |$ ^. H7 u5 X& B/ P
————————————————
. x0 R' \" s- H E: F
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 [) t% F& Z# _0 v, z0 J5 @ u
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
1 i7 p1 }9 N/ `6 `3 C8 B6 @9 S
6 R5 w* Z: M( c/ l
a$ N: S' |0 V3 B
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5