- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 567268 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175403
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
: i; I9 B9 D/ g* g( d: a7 `% l2 ~
数学建模:异常检测算法1 e2 S/ x2 x7 u" h6 \; _% s0 l
一、简介 – 关于异常检测( A. m; l- q1 h5 @& A
异常检测(outlier detection)在以下场景:
8 v! ?0 k; O$ }& `
$ Y' _% k5 [2 x& g h" ?# \# a J. r# r8 v' N2 x
数据预处理
; h) l; p! B# }2 F, c1 a病毒木马检测
$ z) t1 b& m: n1 r: C' J工业制造产品检测2 d, x2 {# e' `% a: I" U/ P
网络流量检测# T( s7 B- x9 P6 A& _. |+ f+ @
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:/ m( P% m& @8 S: w
2 E. V6 V0 }; G, l9 r# ~
/ o, x: i8 a1 [* u3 F, l监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。 e) x$ M* m. Q. I' X8 ~" e( k7 `
* F1 w: |9 ]6 D3 ]/ `
* Z3 |* T9 }1 |9 g6 j以下是异常检测和监督学习相关算法的适用范围:/ a- a; ~$ O, Z8 R$ F
# p9 @- n: D- p( ?) _$ `( u5 ]) D; n. G7 ] z% {& R
异常检测
" m! Z" h' {% e( ^+ C信用卡诈骗/ f. F9 K. l$ ?6 ^- s
制造业产品异常检
0 ^; f% |& _7 ~8 j2 t数据中心机器异常检( B# w3 o7 n& ~( H
入侵检测
. l! t8 q! J' {) Q. b监督学习
* s$ L' _+ x7 s- I% W( e; V垃圾邮件识别4 X1 E1 k3 ]7 W
新闻分类
! C- Z6 \. J5 B' i二、异常检测算法2 L. L* N5 M- ^ }2 b& N
2 G( Z. j3 b' J, N! p. D0 O$ Y- I1 v6 n: b/ i$ o* U# N
4 Q0 K0 Q: m' l/ U- }, H+ o) d
4 P7 V' k, W9 K# K! N6 s. _4 S! p' T( B+ N
: B- k& G9 Q; t
import tushare3 `, c& t* }9 A3 O9 @" x5 M" D4 \
from matplotlib import pyplot as plt) p) f- M3 D5 l" E) C
0 R! y' Z3 a- w- t" V
df = tushare.get_hist_data("600680")
/ F/ A7 z4 T; B) [9 r4 x4 S& B" [v = df[-90: ].volume2 F7 R0 x, G6 K1 H7 }2 j7 b" ~
v.plot("kde"), S6 ^- x8 o: D+ i
plt.show()
& ` E/ H+ [2 K- N G/ z. {1! I0 f& v/ y/ q. c4 j0 C. p( H
2
- f* G5 [7 Y+ Q( a3; x' [- u5 x/ h# \8 J7 I1 G, v9 @
4) ~: m4 b+ x4 X% l
50 }0 v0 v N8 j8 _: q! W% b6 t' s
6
$ R% @4 i& ~+ P) l- T74 Q& |- ^. z5 B* C# }0 \
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
1 x- Q U8 x. V; {" z+ Z
/ c" P6 V' Z0 X1 K( R) f n" a* H. c* I2 O1 H: j+ B
$ E: w. ~7 p3 B' h/ w: ]3 s2 O
" @' H8 \/ c# o' X i
. `" H5 }4 b2 D% r3 Z3 _: W' D8 y6 j" {7 y+ T, i
& ]8 T' L3 }" p" e% T# _$ J% U) r- K3 u# n
2. 箱线图分析
4 _1 V4 Y# t# H; E+ `1 _7 m8 q( oimport tushare/ V# V9 S4 a8 t( ?5 L
from matplotlib import pyplot as plt" Q2 e) b9 Z' c% @
. z8 h9 i! a4 ^: _! z) B2 idf = tushare.get_hist_data("600680")4 C! s2 d* R7 P/ W
v = df[-90: ].volume
6 d; {3 l0 L3 q4 Qv.plot("kde")
N) t: e' h4 W: s1 tplt.show()' g7 X" E+ {( P& y* n
1
; D" R" k1 Z# t; F. F2: J& F3 K' I1 U) I6 z' r# j! D; a
32 N; }4 z) H( }
4" f! u- E( f$ |; I; s
5
. U3 j" O) Y9 @6 t. z* ~6 M0 O& x1 A" z6# ~9 s+ T$ _, c* @8 X- u
71 l7 G+ `0 }! I# {( X$ v
\& Y2 p% B0 X3 R* i* d
% U5 I: I7 r0 r
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
8 ?2 k/ S4 T) O- f2 p2 o! ~( Z
4 N. c6 B' `. ~/ f& z' D& l" G4 J C3 H
3. 基于距离/密度
3 k0 \+ j' v) k1 b+ P典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
2 a5 e* i+ p( w; {% o7 k0 ?
- o+ C8 K! ?+ C" W' f, {3 F4 a' }4 W; {# D/ G" e
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
$ O: w- n P5 S' ^, |& N9 G/ X- O% D$ Q) i2 w* W
* e4 A3 ~1 `3 |
% J1 k& `& N- A; K* g+ e
8 L0 X( Q$ a% J3 U% a6 g% X2 d" E3 e/ g$ f: J3 V
; c" l4 b% B, n" J9 K: ?9 a
, X |8 @5 L; {' b# U! S0 B
0 n: G* [# `* I4. 基于划分思想, s/ K7 d0 C8 W9 s3 E0 U( S% ~$ e
典型的算法是 “孤立森林,Isolation Forest”,其思想是:3 m6 E& L3 A U1 g
% D8 T" A5 o" S9 M; r; n
/ K- I) @! A1 L' I假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。4 z' J+ f+ p0 Y( @+ [" M. }# t
( C6 h# V; u8 B; q' J
" t) Q' ?( I( o& F2 N- |
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程: y) \/ z( q, n1 i k( }
8 m2 W9 T5 Y2 w3 w3 w+ R9 ?3 F
& _" r1 }. e7 _7 q- P. Jimport numpy as np9 w% V5 ], b/ Y9 p! e( T1 z" i Q
import matplotlib.pyplot as plt
; @6 k( e& H; b4 J6 q, ?0 Zfrom sklearn.ensemble import IsolationForest- j5 [+ c4 f9 L; i4 n( `4 K
0 C; O2 u9 I) ?0 j: s
% r6 R) U+ j" t9 D
rng = np.random.RandomState(42)# T u% {1 A) N
1 T7 z$ f' B' h+ K8 Y
# B+ b$ e' H9 d
# Generate train data: v0 ]! v8 _ V! L2 r- B: Z- S
X = 0.3 * rng.randn(100, 2)* Q5 ?: h y/ w0 [8 |" {$ ~% O
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
2 V' H3 d; p2 B% G" M# Generate some regular novel observations
' {/ A% S3 K, A7 J/ XX = 0.3 * rng.randn(20, 2)
/ g4 L/ t. H8 l5 V' ~X_test = np.r_[X + 1, X - 3, X - 5, X + 6]1 U3 v4 Z4 R+ V' a% o& E7 u
# Generate some abnormal novel observations' I, M1 S1 j. i! Z4 L6 D4 g3 a0 Z. q
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))) C: m2 T# _9 s* X1 `# Z
1 j, U, P6 ], N: B4 u
1 m# r$ P/ b" A/ V# fit the model
: o) B+ ^, m6 F1 b. I; n. k# rclf = IsolationForest(max_samples=100*2, random_state=rng)
. h. o# S3 H8 H( f, K. a/ Qclf.fit(X_train)
4 l& y3 D n$ B* `y_pred_train = clf.predict(X_train)7 v2 I6 A! K' H( h+ `4 B( p* z4 P
y_pred_test = clf.predict(X_test)$ A- ^$ U/ a7 F5 F( L( P/ |, d1 H: G0 ?
y_pred_outliers = clf.predict(X_outliers)
) o- h: o* v7 ]) h
- h c( u' _ e7 `$ @' F& r6 I g! Y8 w' u
# plot the line, the samples, and the nearest vectors to the plane& T' e) o6 ^- @' Z) G) U* ?; F9 U; u
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))% r# W, Y! c6 v, Y8 R* q/ E" P
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])$ K/ v1 y' p& _5 e3 s. _; J7 P- G' T( J
Z = Z.reshape(xx.shape): j! e# o' H: Y
0 M+ ?4 M8 b, J) K8 R8 o
. y' N! A) }5 r8 E0 |# w- I% V: @8 hplt.title("IsolationForest")
( j: { d* v4 Cplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
: m5 {/ ~5 L, O" B
$ ?' W2 g8 O! A6 h4 @. f C+ v' }( B7 h7 e6 ]
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')1 s2 P5 ^4 V1 v+ r, B5 a
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
. W6 v/ q9 c( y t7 Zc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
1 }& X; i1 q: m: gplt.axis('tight')
6 O. g4 u: |8 hplt.xlim((-8, 8)): w9 U+ Q8 O6 [- P7 ]1 ~0 s
plt.ylim((-8, 8))
1 o$ [7 P( u( \* g+ V0 [( L/ Bplt.legend([b1, b2, c], P. |8 ^( o' [& ^' W P
["training observations",6 X* P3 |/ v4 a& L1 P8 j, }
"new regular observations", "new abnormal observations"],
- u9 r X n k3 e, {8 z0 i loc="upper left")
9 `) D! A# f, _plt.show()( O' o) n ~# U* v& C
1& F+ r: r h5 z6 }% ~1 z
2
5 ?/ @/ n) W+ Z7 ?: k1 Y30 I; o9 P, I& A& w, M9 H0 ~
4; M! B5 c# o$ N
5
% Y. w4 Z2 o" T5 ]1 B4 I6
: D% h. r; Y+ @* J7$ q9 R; X' @2 C7 G
8
- u' i& s- X) F- N% Q9: E# L( e6 S0 H, s2 ~
10
+ M: r2 l# W$ w; w. l11. F( o3 O8 |5 X4 x# h7 G
12. e8 c9 W3 K7 M" k5 y9 @1 c
13! o1 {) P: d m* L# t( A- r
14
- G' B3 H( C; Z" @7 G7 E15
+ a' i8 ^+ u/ P$ @! C16
) m4 ]# Q( ~: j1 { `( d. I17
2 E5 A: e+ }5 d9 m18
! ~3 U5 r! i" F# P* h7 y& W, C# z1 y6 R19( O, c' ]7 y- Q' S9 n) m
20 }- M) m1 N0 m- ~3 p
21+ J: i# _* ^" e$ }
22
' `. ~. p' l) o# w233 G9 D- y! E; l& q& D
24
! y& A. J. l4 p3 u7 s* i7 P25
$ W6 w/ ]) a v. a, ?) p# e26
; a9 i) q& f$ K+ L2 \$ h. x& [27
6 q# k0 ]' Z. _ Q280 I( Z* q3 w+ @8 A3 t
29+ Y: I( v1 {1 W& y9 ?; P
30
8 j& \5 X6 G1 P31 |8 d5 X x6 p1 G9 V0 {6 G5 f
32
3 h( E; `+ E! k8 j) d8 z+ z33) k& O# ~% I# J2 a8 x4 ~
34
8 L" D6 l/ h0 w! J% `* F% X35) C4 c4 n" N9 b# U* {
36
0 _3 g0 ]3 D) E1 F. ?; p% |* O37; D/ @( }! E$ E
38# k8 e+ K1 \) o+ h6 b' S# Z
39
; i I5 }& V" V, F% j' [. H40% t5 u- a+ f3 h+ I* z
41
$ S8 l6 f7 p: h7 n; S4 z T4 c: T7 j# G3 Q
. S2 U1 L6 s& I0 m7 I0 N————————————————6 N# l# c7 V- s. u* a3 z3 K+ b& |& g
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* X: o5 x: h* m' y' z# _
原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231297 C9 Y+ G$ ~8 W% {& f2 i
0 a, k" T" H1 P0 W. @
" [" Q; C* \: K; P/ r/ m |
zan
|