数学建模社区-数学中国

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

作者: 杨利霞    时间: 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 s2 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' H6 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) Ffrom matplotlib import pyplot as plt$ z- `+ z+ ~! Q8 l

; a: i9 v% x( P; Y% n) [' idf = tushare.get_hist_data("600680")
, o; e2 V* b% Z. j5 O1 Q4 {v = df[-90: ].volume4 W# G& a/ S# [; {) ~
v.plot("kde")
* N- ^# {) ~. c2 k. Xplt.show()% @, a& X9 k: B# W9 C$ t7 G
1! H+ ]6 _% b% \! \
2
: p( J# H- r9 l) R3
9 S7 s; B& x, s4% ]9 Q7 M6 J% y, w
5) C$ P% b3 b; S
66 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, timport tushare3 j$ L4 i0 f. o& g
from matplotlib import pyplot as plt7 o5 G4 u4 a" J+ M

1 j: k( {9 d: g( X( edf = tushare.get_hist_data("600680")
) g& m6 u$ K5 A. \$ P5 \v = df[-90: ].volume0 U- @. \+ M% v! `3 H$ R6 Q
v.plot("kde"): k/ T+ j8 T, h- D5 ?
plt.show()
" N/ e% {, G( m  ^) y11 V6 p& b9 @& ^' X" Y; W3 v
2: a* I2 w/ G- ?" m
3
" s5 p4 J$ Y* a4! N! t- v8 G/ N: \8 Z# F$ X8 y
5
& O/ F! C# {9 |+ u& g+ }) Y6
/ J7 I0 _3 T$ c/ h# F7; 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! n3. 基于距离/密度
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, c4. 基于划分思想
# 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# Kimport numpy as np6 Z# H& D8 g0 D. p( C
import matplotlib.pyplot as plt
" G3 a4 P: T1 @  |: P2 pfrom 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& k6 g* `0 d4 a' x( v
" |# e6 p% ]0 t3 d0 i2 J
# Generate train data8 B) N1 @; |) |
X = 0.3 * rng.randn(100, 2)
$ H% I6 F. M% E# A; `; yX_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 tX = 0.3 * rng.randn(20, 2)
- P4 C% y6 C; n0 w9 i! H! M) cX_test = np.r_[X + 1, X - 3, X - 5, X + 6]2 p) }- S# p! Y* W3 n) b6 x+ `- ]
# Generate some abnormal novel observations2 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 Aclf = 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 sy_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 Yxx, 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# Hc = 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 Eplt.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* Dplt.show()
% F: b, _% }; f9 x3 z$ S1, ^2 C) x- S  u8 G. P
2
3 K7 H8 S3 V" ]9 Z* y3
" l9 X8 v& w' H2 M5 m/ p  g4: M" w7 W% y1 H7 P
5
' F5 F% d- V3 \, l' n: I& c1 y6" 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
129 U7 ]7 u* y9 |4 Q
133 w6 \' Z6 Y0 J6 ^+ P
14
) K6 t6 u% |7 V2 r0 n! u15
/ [9 c* }! B) a, |$ \! b16# f# {5 \( g% u9 B, ^  w- M
17
; L  J/ A' J; n& ~18
/ P" I5 ~4 j- j4 E19
% \0 U, z3 D1 F' H3 C20, I8 q2 Z$ N0 p. o3 }
21
- C8 ^4 y$ u* D1 I, ?, s# j22
1 S/ e; h: s" V; J/ H1 e/ D23
1 X3 e0 J5 V( o) I24) ^% h6 w% [2 s( W" d
25  D  R% n& f! d
26% e1 [8 l& J, ^: Z" f
273 a' [# g) r4 m; Y. R0 S
28- |8 p9 B3 q; l5 U( z& L7 e
29
' C0 {- i/ o! Q4 }" g6 B30
8 A. x% e" o& n0 u+ D3 A) f0 P31
& K& @; H8 x. C* l# r- y/ V32' 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 T35' 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" r401 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