数学建模社区-数学中国
标题:
数学建模:异常检测算法
[打印本页]
作者:
杨利霞
时间:
2021-7-16 15:24
标题:
数学建模:异常检测算法
0 H* ]% ~+ C. u; I" b/ ^5 t, E
数学建模:异常检测算法
, h) o" w' z/ d# ?- K! r
一、简介 – 关于异常检测
; C0 x0 [1 P! R r; G; U
异常检测(outlier detection)在以下场景:
# Z4 X* R* t0 l! k
9 v- K# u; {, K3 `
$ o- _& J3 q) o# o
数据预处理
: i$ s* x" @$ U6 h% Z
病毒木马检测
7 i" M7 f. }# [
工业制造产品检测
* b$ z$ }. _5 ~8 b8 A: I
网络流量检测
7 z$ h' g6 _- J8 a! D* q
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
+ u0 a9 ]8 d! l" `
" B5 n; @4 X$ O% H4 Y- n
$ Z m6 K7 b& c( }9 [, \2 n6 q9 r
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
3 s; n- `' E2 I- F! m4 Y1 {
3 l% U* I5 \, P- f' p% O7 y9 `
X3 m2 n* N9 r& R, Z* M
以下是异常检测和监督学习相关算法的适用范围:
- y, F a5 _. D6 a% Z6 K
$ W6 x- ?) s/ A! |/ l5 U
7 b5 A# x& Y! A- [, l+ O
异常检测
3 F! C6 \9 Z' K3 \6 k: b9 V
信用卡诈骗
( D) i& Z0 C6 Q
制造业产品异常检
x$ y8 e7 ]4 z! m% M
数据中心机器异常检
: s7 d9 M& O+ L& X
入侵检测
* i) q+ O8 ~5 l! r5 e& B a# g
监督学习
. P6 Z, f3 [% a5 Q- B$ n7 ?/ Z
垃圾邮件识别
9 c7 Y8 \( Y, W; I9 J. T
新闻分类
) z$ y, S8 h( r5 V& q& b2 N
二、异常检测算法
' ^8 K, l$ h! G: {3 _& ~
2 C8 y9 M5 ]# `" B
9 g4 ]. P# B8 Y/ S7 D
. O. _8 Q( V2 Z# ]6 z
. f: \) ?6 I" \5 W' Y
' W7 S. U) o- X7 h! X
. H9 {; a& W l" K
import tushare
' s/ n8 C! T: |- l
from matplotlib import pyplot as plt
# c E" f: K' I* ^
! q) p1 x+ N1 f l- L, |
df = tushare.get_hist_data("600680")
+ [2 N3 Z8 Q9 Z% j' D; _3 e
v = df[-90: ].volume
. `, c* ]. P/ u' Z* D9 ~
v.plot("kde")
) Z) d) `. Y' K) ~( x1 A
plt.show()
3 f3 o! b- Y/ |0 w* Y
1
1 r7 G) H" i( x$ C
2
8 z/ t$ O ]/ v; ?
3
7 X/ P) U5 {- \# b
4
. d" T n. X- k/ U. A0 e# @4 O+ ~
5
5 q$ u t6 [" J; V7 W: d
6
) h% }) W* n; K, b5 p
7
% i6 _) I9 u/ O9 i2 R
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
' q0 l- r+ U% j( @& Y* F
7 S- _ \, x0 b% Y
3 S9 p' A8 ^& d2 v$ B
$ J! j1 o U O/ Z8 {$ ~( B% T
2 h7 ^- G" k+ H) [
! [0 ]: o" B0 E k/ ]
3 O; G$ p z- w2 @! ?9 l- U
6 x9 t1 ?8 P; e
+ K, q2 `6 U/ ~8 J4 S
2. 箱线图分析
& C+ |' w, C* b- @
import tushare
# l, D$ W& E+ }
from matplotlib import pyplot as plt
Z4 h. l4 }4 @2 Z# N0 J8 p
# ~. s. E/ K D* z2 E
df = tushare.get_hist_data("600680")
1 M: h V1 s" X P! j5 O" @8 l
v = df[-90: ].volume
1 v0 @, L( v5 a& L$ Y
v.plot("kde")
4 o V, I) k3 ]( |1 v9 v& ^5 V
plt.show()
; K1 C# ?0 x1 Z. {
1
* i1 H0 Y/ m/ z* d; b
2
6 S* j% s' ~& x; c5 x7 h$ F
3
* ~& d8 I u: g
4
3 Z8 ?6 i0 j' _) i5 ^% ~ ]7 I
5
/ x. E% U! H8 m8 y! D: P$ z
6
% a. |/ L- |- d
7
) b. J! i6 f9 s) V* x5 Y/ o0 c9 V
1 n" s$ \$ f9 l3 c
, g v& t1 m) L% G" b
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
5 Z! n+ h& T, v: E4 l+ s* X
R1 Y9 T* h% x( i) c& R7 F
! t3 R# U3 O& Q6 G% M: I5 J8 [! H9 `
3. 基于距离/密度
& X9 z: [* }+ U$ M' R$ p
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
) D/ y- K% i3 m) k
! K% y2 C% L" H) C: O
( D5 n' v* b( H. P1 _; l/ V( E# f
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
. n- j% c P0 v3 h
0 W' W: y! U* Y* R9 k9 ?- \) h
! ?) x2 U( M3 e
, m5 `" U" ~2 E) W& w G
% |- n: F' J: t% @* P: B; L
) y9 h M& u9 w4 X3 L
9 g* ?& L, c' e/ Q, X; f: `& ^
& A' e7 j' f4 Z
9 X0 v- c- _; g" D# m' C
4. 基于划分思想
* z( Q/ ~. o9 K+ f+ u; w9 p
典型的算法是 “孤立森林,Isolation Forest”,其思想是:
, Y E0 e) B5 K: V$ h
4 v7 o9 a$ ?7 e) u+ r" x3 C
% e9 [% _4 Y2 f/ N4 Z
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
: Y' h8 N! w/ Z
4 t3 a8 `8 Z9 E9 S! D% t
( N/ ?/ N/ ^3 o9 {
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
# K1 L" M j* }4 |6 \' u
d$ c) l/ m2 o, a3 ^
. `9 p% V- r2 O
import numpy as np
8 f0 w' E* L; T# m2 ] B
import matplotlib.pyplot as plt
2 ?) L/ ] a9 F y+ G( g( E+ S$ P) [
from sklearn.ensemble import IsolationForest
% ^$ j# p! W) ?# G* `
% `2 f% W- Z) F9 U
3 L7 w% }3 @( S
rng = np.random.RandomState(42)
# v0 X2 B: b d: R# L0 \3 M9 }/ |
" r! Q; z2 y& J! J) q
0 l, `4 |3 e9 o
# Generate train data
; M/ U7 @5 n5 s+ S6 i. x9 ]
X = 0.3 * rng.randn(100, 2)
3 {$ t: g) u" i
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
& K0 g. d X+ p: b
# Generate some regular novel observations
+ t% F' `/ e% P0 I# @- i* p2 t
X = 0.3 * rng.randn(20, 2)
2 Y S8 ~9 t" x( v# Y8 y& K1 L
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
- c9 I1 y- | a, C5 D
# Generate some abnormal novel observations
2 `; p% _1 O7 T: s t
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
, N8 S: ?) }/ f7 w4 W
8 {& o" }0 \3 S0 b: f) A
2 I4 [ d& b- v) \( @+ e- n3 l
# fit the model
+ }' V c- U8 O) Y: m! I( R- Y
clf = IsolationForest(max_samples=100*2, random_state=rng)
( Y$ m8 @' h6 Z1 U
clf.fit(X_train)
; N) f& B! d. M7 p( a
y_pred_train = clf.predict(X_train)
1 g4 X- Z2 n! B' u! h& W6 {
y_pred_test = clf.predict(X_test)
8 |( p7 g# }3 j: f& l+ J8 V! T
y_pred_outliers = clf.predict(X_outliers)
7 `: n( j% a l7 k0 r
5 C" k) r- B& k l- _
+ j! p2 M, Q4 u
# plot the line, the samples, and the nearest vectors to the plane
: I1 { p( u) J1 w
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
% A2 S! L6 D; L% k5 Z
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
8 w& U# _3 v/ _! D) G, k
Z = Z.reshape(xx.shape)
. s R `+ L: w2 _9 X+ x4 Q
- S/ K& e0 u3 D, q. U" Q, D8 p
% N$ O% k% v, s1 j
plt.title("IsolationForest")
! u& y! q7 D3 Y$ S0 E
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
' F: n8 z5 A) k- y% S" j& @/ m P% S
! o# X$ u' N9 m" p, B8 A
7 n' [6 b ]0 Y0 ^5 j8 i0 ^
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
0 W/ q9 V/ N1 b( \1 [( L
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
?' O! F- ?5 K! L( o% n
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
- [' P$ o: v0 H7 h8 X
plt.axis('tight')
- p" Q4 ?' q* j% Z
plt.xlim((-8, 8))
- W" | L* L( M+ n: Q. K3 t1 D' Z
plt.ylim((-8, 8))
o1 a# Q4 T3 Z* E
plt.legend([b1, b2, c],
) S0 l' [ i2 z) r& b$ \& I0 y! p
["training observations",
/ w+ Z/ @% E( q
"new regular observations", "new abnormal observations"],
8 d" X2 A: y5 R& F
loc="upper left")
3 T2 ~' Q5 d/ J3 f% N8 {) ]+ f
plt.show()
) Y% c2 j+ z6 p1 F4 P
1
$ d' N& M; O5 X @; u* c: w
2
: M2 x" \6 N2 U1 |0 W& x% Y1 O
3
' j& S; P& p- N4 F8 @/ l0 N7 h, o
4
8 k# T, W1 W7 i& M* A
5
9 R1 j0 W5 e( l, r
6
1 P$ m1 u/ H G0 p$ o" t; B
7
1 c; Q- T7 U4 Y; n) M
8
" |5 B9 N4 j `. q9 s1 e; y
9
4 \4 B5 N- T1 I' W1 ]
10
- P" e% ], @, S7 Y/ U
11
7 b$ X7 M( K; P
12
$ A% R7 e) k* Y5 y0 S
13
5 `5 l6 X; t3 C; o9 t
14
5 h9 |9 f! |* A1 [5 P7 K
15
) f$ m: R6 v8 Q3 p6 f
16
& l2 U; p" Y; i
17
! y1 j; W- H, V' @
18
) m) Y4 @0 G; G4 I% i
19
3 `- |$ R4 d2 K: g- }5 i- I
20
6 v$ E/ Q3 @! e% a& ~
21
! i! g4 Q, G" l* O* j; m
22
! N+ Q' B2 a: ?* n% K
23
4 W2 N% n# H i& g8 N- w! i
24
7 {. H$ a& n" u" T7 ]+ Z3 v* \! P
25
( b& d5 w1 `* K2 }# g( J8 f/ F
26
, t5 Y( \ u1 s8 \, y
27
' K- E$ T, ^% Q# \
28
# l$ \1 ]5 L6 l% M" c5 l6 l, Y
29
% x8 H4 \, C& Y4 F
30
+ r. q O; D5 _
31
: r0 {1 z( Y) C0 p( C
32
* N" ]) L6 N* u l" v, o' ?. q2 c
33
& ^( v M3 u7 L) o) H
34
/ a0 Z D9 u2 b3 [
35
4 \# [6 v1 u/ H
36
! V0 B" A: \2 Y
37
7 `6 `9 n2 d* |( c# I) X
38
+ f: _6 `2 Z3 L, Y2 A( h9 {
39
6 F+ t! v! w8 t/ L
40
: a8 l# p5 Q/ S
41
, ]3 t# t7 F9 y& n
. F6 |! j# D+ c+ H
# I7 e0 F F2 U& K. W% a% K2 Y/ b
————————————————
; Z$ ]6 J# I$ C! P0 K) O6 x* K3 c
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ Y6 K% Y. G4 h( D0 }# a- b( v
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
3 f7 Z" J8 [0 m w2 w; e4 i5 Y
- q; N7 h$ a0 F# v+ \. V
1 r. p' g# v1 E( G) u
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5