- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569176 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175976
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
, n* d1 }, p9 z6 b& M
数学建模:异常检测算法
' v8 V" |7 H: b3 N( `" L一、简介 – 关于异常检测
* z; b& F! S5 ]0 W/ ~* {, K异常检测(outlier detection)在以下场景:
, W+ o$ ~8 c( C% u! X3 M
# D6 t) Y. J W# P1 Y5 Q1 ^; P6 j0 V6 z" Q
数据预处理/ L# Q! _' ^# c' u: X A7 L$ D
病毒木马检测
# Y0 F& u1 {7 }" J$ p工业制造产品检测
% v( }# u) [( {' i6 @ T网络流量检测
! w1 w! D3 x% }2 q! N) g% U等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
( X' @, b# h& m6 T" a4 O
! z4 d- e( s# H! R/ t3 ~! R. C
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。$ o; B- m4 W$ o( \ M1 i+ d
, i6 Z$ f7 [; _# t4 Z% R# ]) ^
5 Z+ }3 Y1 k, }& K以下是异常检测和监督学习相关算法的适用范围:
0 x* b2 M0 q$ h' M Z: V9 W' F( Q8 T. S6 Z/ J* F. }
' l# _. G% ]" `: @* W. t
异常检测
7 ~( K: F: v6 L( V信用卡诈骗2 M9 l) n- X5 \4 j
制造业产品异常检
4 ~, x+ u4 ], R8 [数据中心机器异常检( u7 @' Q, f( e
入侵检测. F/ M) V6 r% S
监督学习
+ y+ c2 m2 W+ {7 X V垃圾邮件识别
6 E/ p8 F: ?2 N& ~4 ^新闻分类: M l, T( f$ I |
二、异常检测算法
, o1 I3 J! g: Y# y* a2 a# z% H- C
/ S; u& S; X0 o% x. ?, { T/ C* W
' k9 Y% w( f2 j0 y
( G F* S9 c3 @, S
2 q# d9 b' s0 q* N
3 I8 E5 q. H" Ximport tushare# E- |/ c7 S' t1 x
from matplotlib import pyplot as plt/ ]% M* B1 ^: i8 H
% {( g% E' }) c( [3 M
df = tushare.get_hist_data("600680")
) i& [7 o& C2 E9 y' \) Z* Kv = df[-90: ].volume- [6 B( z# C* U% H) o
v.plot("kde")
3 H/ P) M5 C3 }. U( mplt.show()
4 l$ H G6 u$ G! H/ Z/ c6 C( `$ y1
) l. n5 n l) a* G: W* Q/ k3 O) R2
7 @9 v6 R" P6 m8 ]0 G30 H% y4 I. J1 f
43 z6 V% I' {2 Y- M- I
5
$ G, x& m" j6 u5 _1 j2 g, M$ D0 X65 ?8 d `, e* T! }0 G1 |
7
9 g* q4 u6 q5 }4 ]% u0 {; Y, x$ v2 q近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
2 f# X, U/ A2 X: k, ^7 E* A: L1 b1 T0 m9 p5 V: E( V {0 B0 W2 i: Y
* P" ?6 ~4 {. V1 }. \0 u7 {' K7 V, i h3 x9 p6 `/ o# |; @0 x9 o+ ]
S/ q) y6 Z4 Q; t$ \
% T) P2 v9 L1 q, B2 [+ u4 J
2 W" a7 Y0 f$ K/ d3 }( V9 O) ]; S1 D: F6 h" v% V; U
/ `, n+ u/ _: g. @8 A; R2. 箱线图分析
4 }" {$ `5 _2 `/ o& Nimport tushare
4 s. E+ x6 O; s0 W8 Q- `' ~) }1 ]from matplotlib import pyplot as plt
- \: C7 ?. X V" h. _ / l; e" G T- z
df = tushare.get_hist_data("600680")
, X5 v% ?& Q+ T8 Iv = df[-90: ].volume
$ |6 l0 B0 d o2 W0 s8 |0 @) jv.plot("kde")$ g4 T1 G: M7 D5 M- a: Z
plt.show()# U( c _" ?7 i5 {
1
( _0 _0 k$ _8 ]; v+ Y) {) a2
$ F$ u' O% O/ n( l: z3 o30 ^7 A) {# _, b
4
% c' J4 @' c, q5+ X1 U) f$ ~" [9 m% f- d" g9 _
6
( Q g k7 D5 [+ g( U7 F7
0 P$ j! }! J) h6 c, D$ p/ O2 [6 N. q+ Z) G! n5 Q
J* i- s" M" E大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!- }2 I3 [% i) V$ n: V, R- n1 J9 _
, N9 o2 b, u4 U3 Y- B- o0 ^8 Y
( W" h! l- b; V* E9 c8 V3. 基于距离/密度0 O1 h. g6 @. q* E
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
& `, F4 E. b# Q# T! l6 D! s2 r E1 \2 {/ r( ? V& J% Y
+ q/ p, @& |( u. ]/ M. B2 \
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。2 W8 V" Z# j' N6 T, h9 b
$ {* V& Z1 O: o- s. u+ T8 \8 O* Q* a, C% I# v
" W% U E; H2 q9 {9 z, S+ P9 v. p1 i: N6 Z7 l$ `! u
: x$ }6 B7 i' s& \, w8 ?! I5 j3 M6 R, t+ b* H- z
7 T2 H. o2 D' Q
7 S I0 z S# u4. 基于划分思想1 o! ~, T6 f/ m _
典型的算法是 “孤立森林,Isolation Forest”,其思想是:/ L# o6 I. b' X5 K% g% u7 E
1 H( O- Q/ N4 ^: w! V
& r1 t5 Q- q& Q& D; I- z1 i# y( Y
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
9 f4 `- L# F" B7 F( j+ m% E. B0 c" f* |
7 R6 ]; O2 J5 E% W: P% M这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:: u0 ~4 `# e& \( _, Q
. x9 u M/ w q; @
) D: D F5 K4 v z" g3 P3 R$ F2 n
import numpy as np
( j4 ~9 x# d2 L! _import matplotlib.pyplot as plt( m* D' I5 T* Q
from sklearn.ensemble import IsolationForest% ~) ~& `' j6 f _& {
4 @- P. W% u6 J* Z
+ q+ Y/ z+ l. i8 \
rng = np.random.RandomState(42)) O" i; ]4 A( Y, [7 H7 d2 i/ Y4 I
$ |: N' D2 E: _, D! @
7 R+ ~% Z) g$ h, Z
# Generate train data: e8 ]& I; e- C- B- W
X = 0.3 * rng.randn(100, 2)/ {7 U5 T1 ]+ Q5 A
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]# B1 N; e3 w7 C7 t( ~& o
# Generate some regular novel observations
; T8 v) d# t: p A7 SX = 0.3 * rng.randn(20, 2). e: \! h7 S2 Q& t: B2 r3 x
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
! \- [' j2 Y& r: k# Generate some abnormal novel observations- i2 k- f3 W2 _/ ]: r
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))* l0 Z: q: _& d; f9 J
, @' a# U4 J, X
7 S Z; k# y* B& `( A2 Z# fit the model
0 o0 w, [& v2 |5 nclf = IsolationForest(max_samples=100*2, random_state=rng)9 L9 J( j# m+ h r; `* P& _
clf.fit(X_train)
4 w, J! ^0 K2 W V5 m7 T5 g1 \y_pred_train = clf.predict(X_train)1 i* ?- s, }: B: x6 F; a
y_pred_test = clf.predict(X_test)+ I- J F; T3 ^/ V$ ^6 k. _! F- t
y_pred_outliers = clf.predict(X_outliers)2 h; ]' c. G1 j5 N
- b3 A5 h1 j1 M" }! |8 W2 H% N
% b, b8 F2 o8 K, A% \
# plot the line, the samples, and the nearest vectors to the plane* v( s0 h4 }$ s% w$ b4 P" y
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
( A4 {9 Z) O( ^6 ~* h, T8 FZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]); ]3 N3 s+ c. p# X/ K% O! W9 y: l3 d5 V
Z = Z.reshape(xx.shape): w$ H; R( L P! q! o* W8 E; E
- _: Z6 J. o2 ~7 A
3 ^/ z5 w* v6 x8 C
plt.title("IsolationForest")
" o3 F" _% L, J1 l7 l) {' xplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
8 Z' e, w9 f! `0 \
" F, B# ^" t0 l3 R u1 s2 c* h
$ _9 b l- j( Wb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')0 B1 ^% }9 a* s! h0 M7 y7 S
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')# J, p2 D" V j+ D
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')% P, R5 F# ]4 J0 O6 \6 t3 ~. E
plt.axis('tight')1 [' R& }+ v6 ^' r: z
plt.xlim((-8, 8))
5 {/ O1 y+ V* Eplt.ylim((-8, 8))7 s% L1 X* r- @
plt.legend([b1, b2, c],
" i/ h. t% F6 z+ a ["training observations",
5 Y* w* d. P# g6 r3 p "new regular observations", "new abnormal observations"],# B& o' J% h9 U l0 y! W
loc="upper left")9 M& U& y& i4 W
plt.show()
- |9 [+ o) J4 ^: {# c2 F# [13 m+ j* t* N; v3 p4 }
23 t# o9 Y- K) {$ B4 I5 U4 R' ]9 ]
3
- w. _/ V5 m* a2 `7 ~! v4# s P: Z, x* e( Z+ {) k
54 a6 p O/ B x: Q: K' L; c1 C1 t( |
6
5 b9 N! `9 X! N) U* ?7
% Q' F) [9 z* H p4 u8
# O) ] D4 c( o. c9! K) f$ a* j) [/ \ c8 x
10' Y, t: n; k6 A1 ]' a
11
. d8 K. m9 E1 j. C12 U# E: X& b$ z# M4 k
13
. B# P6 U+ p' _% T14
) ~ j; k' |/ s; W% z2 F15
$ Q! e! ^7 d$ F( l* [3 r: t161 W4 T; j7 I3 C- W, C
17
+ \$ R* f- h e S$ D( W18: m5 j7 W7 N! K2 r4 K$ @
19; o) s; u" R9 t- N- f
202 T! V; }( z0 S/ C `
21# J# y4 c6 \/ p( |. _
22
. h2 C7 j3 Y E' \# H3 w$ B! K23, \0 k8 V0 B7 P% @6 G5 r; x
24! o; `$ P& v' P; z" h
25
: \% g2 ]8 c' H26
- z4 J% {& v+ Q, `8 k27
9 [# _- ]: r* \ o289 A+ O; W/ I% S) ]2 g3 e
29
' N) A( Q F9 w* n4 C9 C+ T; v30
$ J% b0 t( Z5 F7 r4 n7 |5 u31# I$ _ B' a( J
32
: s& h* n! C7 t% L- u33
+ m: Y7 A4 l1 R3 w n34
, ~1 o$ Y" [! h% N$ E35. S/ z9 g+ d, d
36
0 [ v* ] d2 i E37& C6 e1 H* Q$ l# V/ H7 \' b
38
" _+ s" B4 ^9 ]4 j& G1 x. a7 J5 l39: d2 y. A8 }. d( {1 R
404 U4 h/ E6 ?$ M v: ]! _
41
. v" B7 i! v" f) `, P; i, I4 d) M* I" [; Q9 x% S
( }( T: y1 ?- y5 }3 G/ W————————————————
' W0 F& o- ^6 V9 c" L. a+ G版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. R! ~# |+ n2 ?; S2 ]! {% ~7 g- C
原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231292 N, o+ j3 V1 ~
7 u2 ?0 E& E8 G% W, o( ~
4 T$ `7 ?+ k; p+ }' i |
zan
|