- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565737 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174944
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) Q( L {* o4 B" a' h( W y. C1 R数学建模:异常检测算法; @2 [. |- R# h+ e) Y8 l. j
一、简介 – 关于异常检测: o4 H* Y+ A, K
异常检测(outlier detection)在以下场景:
4 P) E3 Y% N+ z
; Q2 v) A; m9 c: ^: q7 T
2 K7 I. i+ Y7 e4 T; q5 j$ y2 `! t数据预处理* l# Z" U4 R5 y4 ?: o
病毒木马检测
5 N3 u- C9 M+ |3 K9 W/ B工业制造产品检测* O" d3 T9 ^4 i9 b
网络流量检测1 E/ o D9 |8 S- |
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
+ l5 B/ \0 q3 |
q) \0 C6 r2 u8 U
( X) B- n$ g$ H" g& j监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
! {1 I7 X! _, l1 x% N# C6 z2 G. q8 |0 n" {$ K% A0 t8 V6 w
# \& `- X9 r" F7 Z) l以下是异常检测和监督学习相关算法的适用范围:4 ^8 {5 \5 E8 A$ |
& G' A3 o2 }4 @2 ]+ M1 P
( f8 Z4 S4 U" x$ d$ V$ a异常检测, Y# f0 h* {( c2 |
信用卡诈骗
7 ^% ]' H1 I0 r( ]" }$ N' d: M制造业产品异常检1 v) x, w3 g( t
数据中心机器异常检' Z6 V3 P- U" E. n+ T% r2 g
入侵检测
+ f9 k8 N6 N! D2 B, o4 v监督学习
' f! R6 t" x" s: C$ K- \. C/ d( H垃圾邮件识别
7 t" m. F7 e& |/ _: u1 f新闻分类) T5 H' D3 r' V: O$ t, B1 t
二、异常检测算法
9 e I" r7 n- F' l! x
: p& g. C# z% M4 }4 ?4 W; x" O, X: {/ a
7 J/ n. o' s, c/ d' Q8 p
7 y/ I' }' B; g. @# c
9 Y9 C d/ ? q# z! [7 Y& Y6 g6 L+ Q7 M& D1 x
import tushare
1 x6 ?) q1 G1 ]3 J" |3 ^from matplotlib import pyplot as plt* L. M5 h$ D% \$ B
2 y( U# a5 Z$ n6 ndf = tushare.get_hist_data("600680")4 k) { U; @* M; p. w0 l! q
v = df[-90: ].volume
7 I) Q" u$ t8 i- ^+ m5 L3 kv.plot("kde"); s0 q( N7 R0 s8 {0 B9 H3 r
plt.show()$ L( x4 Y" j& h. ]' C1 O
17 y$ Z) ] w' z
2( d% h; s& u) X" G5 T
3
9 W! p m8 q/ O5 [6 u4
9 m- i( Z C- J/ M6 g( k) E5
2 n7 `( G/ t9 J0 I! W ^) k+ i6( Z" e/ S# S" L4 e* x
7
: _& l0 F8 C$ l u6 W近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
7 y" d. v w+ Y" }, e3 `. h& W- v( ?. r8 R) P5 ~5 J4 S9 a
+ O, D) T7 h9 A( v$ n: j( M
2 m& X6 r$ f2 D$ }+ n8 |, X2 Q' n5 h; ]. b% ~
3 o& O+ f2 ?3 S1 n6 {) A: g
6 ~5 ]8 q: h6 b7 g6 R1 F/ b- l: A A, A% q& D
7 F$ b2 |8 ~# T- q' z( j2. 箱线图分析
6 y5 U1 V* f% p( C, _import tushare
# i8 S/ b& @. N/ z& b; s1 ~$ @, qfrom matplotlib import pyplot as plt/ t Q( T' @' a) w4 g+ z% o% n' C2 t/ O
K+ S, P q0 W: _4 K7 y: cdf = tushare.get_hist_data("600680")
- O; |& C- N4 J% I8 }% K/ I7 fv = df[-90: ].volume
4 S" t0 c7 D/ O/ p2 iv.plot("kde")- ] s3 H, x, B/ b, S
plt.show()& ~% K5 j! v7 M$ O, P
1
5 B$ Q: [2 j* N5 C& D, p% O; x7 s2
2 r2 j6 \ j2 ]1 p. G36 @5 R9 ^" @+ @
4
% F, O- p! g9 p" c' T55 z8 j M+ t* G) k1 _
69 I: W4 Y1 f+ ?: i+ T. t
7
) R! @2 [! x* k, z7 C
$ g, x6 ?8 t/ r- K5 Y9 h2 ]& j
- q* d3 a! x1 X/ y/ y, G大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
# O' H/ ?: G! F# M0 o+ U+ _7 O1 x& O+ I3 Y' ~
' Q4 x; y! Y" z- |+ k6 L, s3. 基于距离/密度& ~# g4 o$ V0 l# r
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
: v8 @! \4 D- P! N3 ~* u
3 q. X6 L) v/ U5 ~# E0 _$ A6 T; y3 r* u r
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
+ X5 v. V) W, C6 k" W! s( X
* a8 t6 I3 U j0 h/ U
7 L( \/ f% A1 y% Y; M- F: L2 e
' w7 j V1 Y' R& i4 p
) a; V e3 v- p- n, J* a; G$ f! i) N6 k ?+ ^$ W* I+ u
: T& W, M: C; ? ]4 a4 m- T
; X. |5 \ o& O+ s* f) t# ~) _
4. 基于划分思想
. P J- z$ y: `+ ]+ ^3 ~典型的算法是 “孤立森林,Isolation Forest”,其思想是:
$ a* f5 S+ n! \ |2 o# x- o: @: J3 w* j9 N; q7 Q1 n
# u& B) p9 {+ B8 `9 A* J" l4 t假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。! u- p2 o6 I. S
# h+ s2 g7 m9 ?& p# ]/ Z
8 }6 R6 K8 u+ r9 l这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
6 C% I0 `% }- a; ~6 z x
- i0 B* h2 A% }/ Y P& g7 B% R2 X+ m U4 h% e7 W9 u! [
import numpy as np
; ~8 t' U0 a# ~import matplotlib.pyplot as plt
$ l& l+ z2 _3 r% M3 b& e) Dfrom sklearn.ensemble import IsolationForest: Y2 H( h1 ?/ {0 d# C" Y m4 R
! C' N( S9 f& A0 k# G( m, c
" _$ ~( p3 m+ orng = np.random.RandomState(42)
I5 U9 Q: u1 @
# w2 ]; C$ d- K. \5 @1 }7 v
' R' @. M/ ^# i6 i# Generate train data8 G7 H( b: d# e3 _. g' M
X = 0.3 * rng.randn(100, 2)/ Z+ `" Y6 ]. F7 V
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]+ U: x1 E9 u9 ^8 J9 H5 i
# Generate some regular novel observations
5 \" [$ C0 d2 n, T/ A( X, jX = 0.3 * rng.randn(20, 2)
6 A6 Y* H: |$ z! I% x9 f2 z8 r. dX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
5 d; j/ ]1 ?9 R) j& Y, t# Generate some abnormal novel observations0 N' B- t; I0 `+ W5 K8 x
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))% n0 `" @4 S6 M+ ^) E
! H9 _) R: @+ G- c( I0 s M8 \6 a# q7 `8 W' {9 x
# fit the model
/ g+ d2 s) t% w( T% j& ]clf = IsolationForest(max_samples=100*2, random_state=rng)
4 X1 y; D6 l- G7 L) g% [clf.fit(X_train)) N4 \ u+ q& c' L& k' e% o
y_pred_train = clf.predict(X_train)
3 Z( ? \: J7 x l$ H jy_pred_test = clf.predict(X_test)0 u$ a# o7 N' p: t; C
y_pred_outliers = clf.predict(X_outliers)
! _1 V7 B O2 S* o. I, Q- v: ]+ R0 F- V
6 C- T1 [3 |5 b2 A
# plot the line, the samples, and the nearest vectors to the plane
. ? O( }. K2 v# C% x0 k) Sxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
9 [* x& j: {$ `2 YZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])& ?: n/ O9 c* O( |' ^
Z = Z.reshape(xx.shape) S$ U; l1 a l5 Z
- D; g/ S9 v* N: N' C& x: m
$ H' J) W1 [8 g, ?$ n q5 ]plt.title("IsolationForest")
- w9 e Z! g. ?5 Y* W, nplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)9 g& H6 p9 W) s- p" q' k! P" H
/ `8 Q# q7 f8 h" O( v( X: n: |; E
% E' ^' H/ a) J1 a1 U) o
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
' ^5 I# c6 M9 k; R$ T$ `" Pb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
) g; B6 b5 U$ g, @0 Ec = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
* _4 E3 F) J+ fplt.axis('tight')) `5 T1 ~ O- u
plt.xlim((-8, 8))
6 |6 { M9 E2 Y( b/ Mplt.ylim((-8, 8))
0 }! f' U0 ^ Q% O# W4 [plt.legend([b1, b2, c],8 U* |' e* T/ z4 [5 N4 r3 j. |
["training observations",
$ m( H( y7 M0 ^, `# y, c9 B3 M "new regular observations", "new abnormal observations"],2 A7 D, k) M. E
loc="upper left")
1 N/ K( u" I( s$ s% a6 ~* G Fplt.show()
. R0 U5 [$ y% }2 r5 P' J' @5 v1
) e: t6 d5 _: _/ o) g& O& `, @% @2
, j$ H5 m- U4 d9 Q8 N3
0 z8 w7 O+ \% U0 T, s* k9 x2 i: Q4
( |& B( Z+ ^+ w8 Y5, ^% a1 R& A% a' W, }- ?# v ]
60 u) O2 ]; o1 V6 _; M
7
+ o2 u S1 O9 L( r; Y( k$ B8; r I! d; v) n
99 x* i% i% e; Q3 q0 y
10
2 N8 i# R. _4 |% m- g; q! f11
8 \% ?- V- v/ g12+ t9 g4 J {- f: H9 c+ J5 t' E. a
13
3 D4 @3 n2 e. z( q- i14# i' [' J* w+ b
153 ^' p2 }$ Z7 _
16
- F4 g0 @9 I' {& Q5 S3 S6 d1 z17
/ s& P+ ?) L) ?18
6 o- k2 e% T4 Z- B& \7 A6 X19! X4 f7 {, Z [# o& R9 o
20
5 ~/ O( g& [" r# E& ?21+ p+ o! e7 i, a5 ~$ c
22
- |, r8 k+ ~% B. C6 \% u2 C1 ?23
' W" l7 ?7 f9 R1 I( t24
, h# \0 K- V7 `25
7 F; t7 A0 `5 g) s26; p* p, o% d2 u
27
+ u8 C1 c' h- V. b8 r7 K% y/ b8 ~& j28; W' C& J" D) _
297 b& l% @( ~$ ~7 W p! m
30% k5 }" @# U# u5 p' u* w+ e1 M
31
1 U e1 @- g4 j; y* u& C- o" }32
9 E* J5 e3 M, H7 t4 l" f. I0 ]33
$ S5 L K: L+ Y& w% B6 s34
- D4 T3 M( \6 s' x4 {. ]9 l35- m1 L3 _+ L) I: ]
36
4 b. b& M- C' {; u0 w. S37
$ w5 X: c" D0 [6 ]" J38
6 v6 a* Z# j6 A# ^6 t9 a. U: {/ [' U39* q4 H u/ t* l# N& t, Z/ T
40
7 G5 s" b# v2 O3 l0 `6 J41
$ c" G! n/ G8 u7 d+ T5 ~% d4 w) W+ P' h
, r( v& h+ w; ?5 G1 t0 o8 T————————————————6 h- D8 c. h$ h5 Q9 x o3 B
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 L0 p" j+ O$ ^$ E
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
: e U8 E! t# Y4 \. o& k. s
4 W4 f3 O, [/ N2 @+ _. ?- g2 j+ l2 \# m/ }
|
zan
|