- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565783 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174958
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
0 |4 h6 u9 v' u1 A# i数学建模:异常检测算法
d5 k- z) [7 w' E- u一、简介 – 关于异常检测
/ n0 M6 X$ G+ I) C异常检测(outlier detection)在以下场景:
6 ~0 j. _* e9 Y7 `; Y0 u
- V0 q4 \( Z7 {/ `2 ~' o2 m. }7 e6 V- H4 l
数据预处理
" s' K. e! v1 F2 N' F' q7 [病毒木马检测- w q; Z' n- u" I& S
工业制造产品检测5 z1 e: B4 q% }. Y y" c
网络流量检测0 L1 F0 y% A. X
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
0 S4 g) @$ w9 e
8 Z, [# A9 P# {% O9 [7 }" e, s4 M$ L7 A8 p3 A3 J! u: Q4 U- z
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
; ~# c7 }% E1 D$ `7 K; F2 \- }. J8 f6 S$ {1 Q- J/ l: E
" o. t0 q, k; C* }- q9 {以下是异常检测和监督学习相关算法的适用范围:
' Z+ o! T/ A$ q X( ~; J* y8 m6 m+ A& U- X
# ?' U1 e* t& Q- p% e& F异常检测
: ]& Q' m' J$ E3 Y; `9 u" f: ]1 t信用卡诈骗$ H/ X7 h7 b i0 m8 j/ ], W
制造业产品异常检
3 Y3 o6 t' k4 h0 N数据中心机器异常检4 c! E: u3 Q9 M y- y
入侵检测
' @, ^: v) e m S/ Z4 f监督学习4 ]* j. F/ K) m4 O7 ~' [5 y& U
垃圾邮件识别
! j5 I- q9 C- W7 y* B5 Y新闻分类. F, }8 M1 f e9 g) L
二、异常检测算法
H) c' e( L8 e, S. p. ~5 L w$ c/ h$ O5 `2 D# c: r: s/ a l8 V7 B
" D9 W* b1 \! [; a$ L" J! \9 C
" |- f' j: g; m5 Y$ ?! H7 a6 E: k2 [7 o& f% A! S1 ]
# e- W! L9 }8 C# e& g$ z5 Z! p
2 I: c4 X% Q ~
import tushare1 B" I" b, h4 N
from matplotlib import pyplot as plt
7 {5 c' z/ l9 h) o/ y; A " U7 v) r: `6 F6 B. u1 h* i8 }3 N _
df = tushare.get_hist_data("600680")
+ ~& D0 u3 q& ?4 X, hv = df[-90: ].volume
6 O2 C- k3 R* _$ G0 z; L. n' n* gv.plot("kde")+ h2 l4 _2 c$ W9 A
plt.show()
! {: [! \! l: m/ B3 M( m S* K9 n1
$ d$ B9 ~# j& `: R# v2; ?: d; Z* G" _2 X" P
3- p4 ]! t% M; Z' |- d
4
+ v6 E3 ^' [: f2 R+ S0 ~, q6 C5
9 N0 t- A6 p; h! Q2 v0 K/ K, L66 h# m: o- P( _
7
! j: X% S0 z" Z3 Y1 u5 B近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
) c% U. P/ @+ b' i2 H: o1 W
0 t0 r Z% W* P$ Y+ }( u. z5 E8 s9 g U+ q$ Y Y
R" ~# i7 T$ u2 n6 t
2 f( r- n7 Z* T3 J) U
& G+ j! x- |' c! R+ T9 _+ M9 O G- R: H- M: ?1 e/ b; i
G, C8 p( T# B; v" a3 U' u+ W' @1 }+ T( |
2. 箱线图分析- ^2 U7 X( I% t; Z3 T) {$ S1 b
import tushare* a( z# ?& z# }1 m( c) _0 M" m
from matplotlib import pyplot as plt
2 z! b, m- x, d4 M2 Z& Q
' [. W. ^+ s; j/ R6 @9 gdf = tushare.get_hist_data("600680")
2 m* r$ ?3 F$ J0 K8 Ov = df[-90: ].volume6 J) C& ]7 _2 S$ {$ w
v.plot("kde")' X9 K- q' T0 y; `" U4 H {7 x
plt.show()! m4 i/ j5 s) z; e2 }
1
+ Q2 \1 e$ J0 c6 d# o2
: N0 i3 S5 T6 n# w2 M2 e! M& d3% c8 c& E" d9 |- P @; B9 F% o0 ^
4) A4 f: j, M1 ~/ Z" s+ P+ P% s
5
5 m4 s) j" l& U; m, W% v- u6
/ D& g0 s) T6 f7
. U* z5 M) d& s! H% ] F
4 p. W1 o* K' l4 b& }. F' H8 S: L+ [* v- I( M, z1 D3 W
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!# D+ v0 [: Z$ ?- ^% }
0 }% u' c* V, \+ D" X, P( e1 R$ `0 d1 ~! |4 G
3. 基于距离/密度& i. |+ ]' a* }# w+ w, r; A
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。$ r' N& j+ \0 T; Q, k2 p( w
- M7 m9 g" z, k: s
2 }/ \& {( h3 G! Y, ~( @0 Z用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。( I+ I& d8 v$ @+ j0 T
! y* X/ E& T/ v
# a. }( k8 u8 p, C) h% o8 D
0 K) B( ?! L) e" C# G" g. k
% R& p" U- k" j/ n0 v- s9 i+ M' k/ i' l; T/ ]
+ `; C9 y/ w/ X7 Z5 i( Y* l
& S& h( e% {/ V
, ^- n D9 g4 `& l0 U5 X- h4. 基于划分思想
) O% `9 [/ T% t8 F典型的算法是 “孤立森林,Isolation Forest”,其思想是:* d" k% U5 p1 @1 V6 Z8 O; z. ~; W8 u
6 W t* V# F) y0 w
* x3 d+ E( G7 T8 Z$ c# Y& C
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
* X+ _* d( X/ |$ k1 \8 F" e3 N# D* t6 Q" q- }6 \% [% [; [. A
3 G% k8 T/ a# @这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
# a2 v( h/ i \7 Y0 Y; B/ M$ }4 j) }6 I$ `# Y; N$ L
+ G3 {$ V j; V$ U8 e0 O$ \7 ~
import numpy as np
$ D T( Y, D+ y7 R- ]( d, uimport matplotlib.pyplot as plt* u* ^0 g0 _, {: m x/ g# ?2 _# p& f
from sklearn.ensemble import IsolationForest$ l2 V0 T2 u$ D2 M, g
2 e' |0 s5 d2 n; h' G& m
6 d: B/ O4 i* Rrng = np.random.RandomState(42)( p) t( n- B8 h) m
: }6 r m3 p5 S' s. C" x6 f
: N3 ^7 A3 A9 n) u0 D( N7 L# Generate train data
1 a( Y |) a) f% _% xX = 0.3 * rng.randn(100, 2)
E- ~4 L5 F/ [X_train = np.r_[X + 1, X - 3, X - 5, X + 6]& `8 H8 \" B5 y8 J
# Generate some regular novel observations( W( s" `2 `0 n2 [( J9 K0 ]
X = 0.3 * rng.randn(20, 2)
9 L6 e+ f$ [& W/ ?X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
- i3 L9 ~: s" K% p# Generate some abnormal novel observations, E" k8 ?4 b k. x8 Q0 w
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
8 B7 w. ^+ e2 j4 l
1 H% i$ F9 f5 r x0 k( r: N
! V- o* }8 ?/ i5 i: m# fit the model) m9 S1 d6 d4 {+ X0 V* b$ z$ }; \
clf = IsolationForest(max_samples=100*2, random_state=rng)
* Z6 L: T( Q6 C9 _ m; Uclf.fit(X_train)3 C( z+ O g _0 z4 y
y_pred_train = clf.predict(X_train)* }9 H7 C; W' }0 L
y_pred_test = clf.predict(X_test)- c' F- R1 I0 h
y_pred_outliers = clf.predict(X_outliers)6 m, s! D# |; s
1 U' q# \ V. Q c* N$ Q7 H
$ l, y- E) `8 {: Y# plot the line, the samples, and the nearest vectors to the plane
( H6 Y; b' ?* s. G8 C, qxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
5 G( H. S# |/ N) S( a5 ^& d' HZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
) {* ~5 l" r0 {+ o& Q" v) LZ = Z.reshape(xx.shape)
8 n* J: c: @, R2 Q) ]/ `: S& t
# h- W; a! c6 }" k8 ~
plt.title("IsolationForest")2 |9 K; Q' x( x' c/ ~* |3 r
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
! j- y s- X0 Y0 ?% p) `( Q! V; U! }$ F) R- c' O3 S/ q/ u
5 E6 t& G5 R5 ~4 f* \$ I Fb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')+ D0 }1 {& T5 h) S8 b+ |9 M
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green'). H0 E1 j- D. X7 }% r7 {% v
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
% @6 s1 m0 Y; E# [# p& f6 zplt.axis('tight')
* Z3 n4 ?* e! S% @+ H kplt.xlim((-8, 8))
- N n4 @* z$ {7 \0 a0 F: b- Cplt.ylim((-8, 8))/ K* J3 v1 w8 C; W$ `% q
plt.legend([b1, b2, c],
* p1 z" j( d0 C- R ["training observations",
/ H! X2 z/ v4 [( ? "new regular observations", "new abnormal observations"],& \2 X+ t: k$ J1 n3 A( O3 i) |
loc="upper left")+ A+ `& G0 T* u8 R9 |
plt.show()
, g8 x0 \3 _2 M" A1 B7 H3 N& l1
! ^1 S6 F0 z1 m/ q1 g0 \21 P: C" S9 D8 ~, Z3 b% |% Z: s
31 }+ A- N0 Y1 e+ ?- }; Y9 a) ?7 D" S1 M
40 K4 r( f" m4 [% Q
5
' W5 B4 d( U% h4 l; S63 i! H' T9 `+ P" E" q: a
7
' [) i9 l, `( A# M/ o0 E3 |4 `! {8
. h& ]* A' @, V! @& ~* M9
! N0 J- M9 H1 M' x% n10* v& `' e( `6 H. I; Z8 J( ~
11& g# M7 X# A+ I: t" C
12$ k$ f8 s% Z. b6 g
13; j$ s9 g) G7 `+ }
147 ^$ O! e _& A; q
15" u- n' I* z7 O3 O1 ^5 o. E5 ?
16+ w2 r: J9 e9 |6 E8 V
17
/ A# C9 K- F( h. \; c+ G7 S' ~ N18
9 m# Q. j1 F* \6 C3 Q19" D R) N/ T3 S L) ?4 \4 l
20
' Y- D. o# z: H& ]2 Y217 g7 S |% ?- }
22; h8 @4 p0 f# V" r& k7 \
23
3 h% l# b+ \3 p4 e24
2 a4 b# a0 t3 F$ r, b250 T/ q( j0 ] H* P8 b
26! e. N' n! i1 w& W1 P1 @* v4 E4 R5 @
27
_+ C3 C" ^. B8 |. ?( J# m# H28
( A9 e5 g: v `* m9 m7 e6 z29$ e: e" A" x1 ~; O
30
& l8 I2 {# r# u- w5 H4 u31: [7 A Z# t! m" Y
32
/ L$ R$ w% @5 Z/ H9 S8 q. u33
w6 C7 X% s5 S34 u4 x7 l$ @& |# N1 k3 Y
35
) D2 j- U/ d0 A$ T& G# A36/ q9 `; u, h: U
37" e! m; c @4 d( d6 X
386 d5 ^, D# r! b5 }4 C
39
7 o: E8 d$ l4 ?4 O40
1 e g! s8 F! D9 z41
: B. {* R* w- z; U
& P9 Q' f9 H* Y/ N. N, i8 s
9 k* g l$ j% c/ P————————————————
6 ~+ p3 a4 C3 t+ A& I% m版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 D5 F8 o% _* M% K原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
. g5 m4 k8 y/ d7 ^" f) K& r- H0 H( i( P
% s; a/ R! @4 G6 ?" `) [
|
zan
|