- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565710 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174936
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
( n3 `0 |& d0 u
数学建模:异常检测算法
( N. ?) A# [ a% a- [: f一、简介 – 关于异常检测4 _& B% y' W' u8 D% Y
异常检测(outlier detection)在以下场景:
. [/ s; Y6 H6 |" W5 `0 n# ^$ N/ m _/ G) ], ?& R
; N& R! ?. u7 g
数据预处理9 n4 j7 _: B6 d3 W* ? o+ S
病毒木马检测
$ Q0 Z* h$ O* O" h8 V工业制造产品检测) t! I" J8 Q% v. m- w
网络流量检测
% p! s! s/ a% ?% f等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:% B" A. D2 u; Q, `8 q* c. |
! i* i* g4 F, b5 J& ~6 u
; U4 _ e7 v. \" ?! N监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。: ]7 G1 Q5 v3 k' N; N
2 F: x+ Q2 a9 Z% T( p7 B# R: I
' z0 C; Q: `7 v; ]' T6 A5 r1 o* i2 a8 B
以下是异常检测和监督学习相关算法的适用范围:( e8 j) r* O5 L! O. X
1 f1 |7 C$ d# _) U' M
, ]$ @2 F- ?5 q7 P' d异常检测& K- a9 ?. C* i! o( G) q
信用卡诈骗
$ _7 o- x3 M0 v2 q% V7 q) i制造业产品异常检# C9 y% e$ v; t3 @! x- d
数据中心机器异常检
6 O( H/ G7 u& U入侵检测
# X) M, n; T: ?8 e- Q) q& ~7 J$ T监督学习
( I2 h/ y4 H, K X Z; A# r+ l垃圾邮件识别( _3 P2 P1 I U1 {
新闻分类
; F1 A' S8 o7 \ z* b# g, L二、异常检测算法
8 C3 A3 s$ d& K" A6 ?% o
6 T5 F) I0 i9 t" r, N3 r" Z) q4 M4 V' N
5 r: [; d7 i6 j/ C! G. L
! d9 m# Q- W( M1 P
5 k8 J( {: S+ ?5 ?' G( o* E
5 w2 T9 v4 l% d! Z: p. Vimport tushare
5 I' y% }/ u; k9 H3 c, J' ^, V( ffrom matplotlib import pyplot as plt
7 ?( ^) J7 I- P# z, ~- a4 X2 g
" V$ L9 Z9 N" ~! s) K/ r. \df = tushare.get_hist_data("600680")/ W3 U( Z- r+ c# S% I! P' `
v = df[-90: ].volume
; s2 A7 a0 \0 W8 ]v.plot("kde")
7 j$ X3 ~; ^9 Q1 ^0 D0 s0 Mplt.show()) }) h8 J6 d g: i
1
2 e4 x! c' Y7 U0 y2" g0 Q# s) t9 K# M! C, J9 [
34 X* d Z, L% R) m# }
4
. @: Z2 a+ \4 u( r" j1 f5
* x; `* a0 C# z% E; W% J, O! s6+ C5 s6 o( S! V8 ]" k' G
7
/ j! `8 C c/ |8 k2 d! P/ O近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
% Z- c4 s @( u' J: `) k
2 j+ ?( T2 K$ b; d: | O3 u* Y7 K% _0 \3 x; z( X A
1 m$ Z* x$ k8 g/ L. `% l' W
( S3 O1 B5 R6 x" o d! o2 Y: j! F7 n+ m* Y: F* ~3 O; j
5 ~& r/ g8 F9 v% c# n8 G6 _& a9 I' f: G: @' R* K
% o3 e( D. s% y( I5 l
2. 箱线图分析
& f( l# y( j$ x3 L! y) H7 eimport tushare
. H! I G8 B. g9 U: L0 ^( c$ ffrom matplotlib import pyplot as plt) k. }! E# e' J( y. o. L3 ?( w- W
% c% Y0 p. t$ g
df = tushare.get_hist_data("600680")
# z1 @5 u' u9 V3 O* X! I; Cv = df[-90: ].volume
% U' a' Q+ \/ ?3 K% E6 Lv.plot("kde")
, N% N! y H, Gplt.show()3 S- `* e/ n) Y7 L, n
14 i% `2 s% d0 ~( W; |- R
22 T. d7 J7 u$ m8 J. Q7 ]" ?
3. x/ h6 E! |/ l! f8 \) N, R" i% ]0 l
4
) o* G' P1 ]' B4 T( Q5
# d" G4 D/ D. E) |( X! z6! o% y1 b7 |8 K6 b& v2 e! q9 R
7
# V$ O( a# l) ?3 |" l9 _- o. E4 \, b* Z9 L3 X
4 L1 f+ b5 [7 ^ e" |, b$ e大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!5 Q- _% H1 a0 W7 h4 a' e
$ e0 c* P0 p) C+ p5 O% m% Z S6 I/ O$ z( Q- u
3. 基于距离/密度
; y& G4 m* F% J* T) d3 a典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。3 e# r4 e- _4 O/ ]+ t [$ F
" O$ |( E! [& k* x/ ], l% ^# H
& Z2 S/ l+ L/ r
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
4 d R) X6 X u3 S* D i
3 J% H8 k; l; M# Z/ v% K- M8 I2 B4 q% l, S! S
3 d6 S) I! b" T7 U+ R
+ v4 ^& d* E+ d4 Y1 G+ `
) D y2 d+ V+ V0 x6 @0 N% K
- f ^' p+ {9 ]" I- K$ w8 ~
* l$ h0 ]9 q( u S$ Z' Q% t8 x+ w' {$ c% E6 i a1 z% m
4. 基于划分思想
& b8 s2 a f4 J \0 r+ G& Z4 Q: E典型的算法是 “孤立森林,Isolation Forest”,其思想是:
2 |# w" ]6 s i3 q7 `
$ f: h. A- I/ O& r4 k* x
( i4 s- A }. |5 f6 C假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。4 `7 s' g( q4 V. n
, l4 w' p& m1 a7 [% i. U/ k
5 y4 |: b: O E5 _* j$ A这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
5 @+ i- D% O9 B5 K R: [$ G& J; |/ F
/ N+ I" F0 h, P, j( g- ximport numpy as np
5 K) G% g6 U/ C/ E* rimport matplotlib.pyplot as plt
- g! T4 F7 {3 }) w. b# q1 Kfrom sklearn.ensemble import IsolationForest
. G# N) t6 F* r- ~" {" M/ r5 C
+ j' N- @1 l8 Q$ l
# d6 j9 N# K+ c$ j6 _5 Mrng = np.random.RandomState(42)! H3 V7 ]1 f3 h3 l g5 ^
$ e7 o' E: ], e2 R# U
& ~' t* H; b5 i) o4 e9 Z6 @# Generate train data' f! y4 x* L+ k- Q' w7 A) r
X = 0.3 * rng.randn(100, 2)* C2 a2 n! N8 |" I9 @0 z* \" z
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
. S' e, ~- x, P5 l; ]: @8 C+ y# Generate some regular novel observations
5 J. o% ]+ i' t. vX = 0.3 * rng.randn(20, 2)
: W$ P! W! H1 J. I5 g( r5 G KX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
7 V& Z8 j+ B$ a% v# Generate some abnormal novel observations$ B0 L9 }2 d7 [# m" W
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))$ w- o% q2 O: p$ L3 {. j, o; n. P, S+ s
, B0 f2 }, u0 i) j! V- k$ {1 ~, G/ p0 ?* h$ |8 @
# fit the model
6 \- Z& ^3 u( m8 V5 @. x' pclf = IsolationForest(max_samples=100*2, random_state=rng)* j; M8 P, |6 `6 c S: E8 v8 a v: ^
clf.fit(X_train)
% X- N! J# F. K9 P& Q& qy_pred_train = clf.predict(X_train): U" H0 p% W1 v
y_pred_test = clf.predict(X_test)
/ v) h. n5 ^5 Z* s9 F8 q: H% Uy_pred_outliers = clf.predict(X_outliers)
( d' T6 M; x: G* ~9 D. [; D8 k8 D% q5 a# `1 u# H2 n( f4 J
5 G# P; X5 v3 [ t1 v5 f
# plot the line, the samples, and the nearest vectors to the plane& @& t5 g. M; j% z0 G3 Q G
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
- l. @& k# o% d2 y) @0 V% v1 vZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
- f* U- X: e% `6 ]4 [Z = Z.reshape(xx.shape)
' g U0 J, X) B& V! ^1 H( q% ]" {+ G* k
1 r6 T% P$ q8 A% J: a" Kplt.title("IsolationForest")
$ a! f5 h, j. A. W1 F1 c; iplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
7 Y0 p9 @6 Y( M8 z+ X6 N" X6 g& i/ M$ H+ r) s$ @1 r0 X) B6 ?
. N# }2 Y9 _0 @4 J$ w3 ^
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')0 n { p# A% I- F
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
: u# j- E1 A# K6 ic = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
( W3 H! K% |1 ~! |5 X7 s/ bplt.axis('tight')
2 u5 e, ?! C2 Q% \3 o0 f6 xplt.xlim((-8, 8))1 v6 h' E: M' S2 `7 W$ |
plt.ylim((-8, 8))
( S a" o0 Z& ~% W$ Nplt.legend([b1, b2, c],/ ]8 h1 P- b1 u1 x4 z# u/ h' a
["training observations",7 U9 X) E) j1 }+ d' i
"new regular observations", "new abnormal observations"],' x. l0 p) T m3 u) ~
loc="upper left")
) t6 G7 q) O5 }4 c, E( cplt.show()
- R* C1 ?% p9 C2 P1$ r$ x% B. W4 U' S. e3 E
23 N5 v R/ {0 w, Z
3* O! [5 z6 E+ U( \6 W( o" l
4+ _3 M1 n: a% W" H% i2 b0 a
54 n5 k$ k- M2 X) j
6. J5 \% u# P5 ?5 A* n% ?. K2 p
7& K3 i: k3 |* _; k4 J
8" x: ~+ o L) Q) ^; z
98 K: \+ L1 E. w7 c( P: t
10/ o( \" h6 U$ Q- P
11
% F7 Y5 F# ]! g( D12& N+ I, v m+ @9 F1 d; V
13& @' j- z/ i s. F8 j: I$ Y
14
3 t; ?8 {- C3 [/ w0 e; j. \5 E3 B15
. b6 j+ W B8 h16
% c, A1 |# S/ z. N2 j170 _1 m z3 B& R/ t8 b; F& Y* j( r
18; s( J) r' D- K8 V2 c, d+ H& @
19% o3 U1 {8 T2 |4 j. Y2 ?8 Z) W# e
20/ W+ _9 \8 D3 e/ E- Y7 G) `
21& d! b% T; E! g$ u
22
# v2 c7 {4 y7 T$ ]# |* T6 o: y23; C" ?% q3 v, i& f1 C+ U/ x8 t
24
& V2 ^: K$ z6 a! z' ?25# M3 Y6 Q3 I5 G& s
26; q7 n' T* f8 \9 N
27
: X4 ^; L# v! k# k2 @$ [+ t28
4 q1 H' @/ h9 N# e* G5 w29
! G U: ]& u- F30
7 b; @% X& L3 e8 y4 |# o+ f( Y' f31
' J! z! F. |/ S- B j @3 e) k, h. [327 D, F) P( p& p5 \: p
33
2 R3 X0 a1 N! ~4 l# @3 r34 D0 q; [3 V: Z2 y
35( ?8 v; a5 A; |; P" E. d
36. H- |5 r( L N. M" a8 w
37
! b4 n0 X. e) w4 i! X" u! {38
" B& L; X# j" X5 T+ R- ?39" F8 P! w3 o: a8 ]* l" N
40
, Y8 y! y8 z; `: [/ @3 K41. r! ^# o4 ?7 ^& r. o
( I D9 c: Y. X, V/ a. O; z
3 c+ F. c1 d$ y& d' ~
————————————————+ l& T# V5 e2 G+ S4 S4 Y( X! P: s
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# @. Y& ~: |) M. i
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
* Z+ J+ ~1 t2 O3 a; k3 T; S5 s; A3 Z1 @
% M4 [/ m! d% L' {1 F# [ |
zan
|