- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563319 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174219
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% i0 l/ o" k2 I
数学建模:异常检测算法. t! l6 l8 _) ^. B2 S
一、简介 – 关于异常检测
5 K0 ^, T3 T7 z j! U. U异常检测(outlier detection)在以下场景:
1 t! X$ D2 W8 h
1 v' ^2 d/ i3 `2 f4 M$ {3 e1 a5 Z) j O5 z3 h, p/ Y: F" ~/ x
数据预处理
! v& v% u6 H' p' E病毒木马检测6 R4 J6 B" U- \0 t, ^$ ?
工业制造产品检测 }9 B# X* ~) J8 t! \8 X
网络流量检测
2 m( N9 |) j( C3 N' D等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:8 M" x8 Q2 J3 U3 `* m5 K1 N
. v' ?& E6 {0 t+ i/ k4 i! T9 a
, `) l7 N5 T) O! V8 `5 T$ W
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。8 t% c4 a0 ^8 X* n k \. c6 L
6 E; V5 O v4 ]
* ?0 y, g: ~- G1 ~以下是异常检测和监督学习相关算法的适用范围:
) q9 O4 N5 \4 y& y& e: Y) N: h8 k# S) u- H% X
0 b, l. f$ p" ^! P7 w
异常检测+ E) j Z; n X1 z- S
信用卡诈骗 M! I8 t/ s* `) h: o! L2 D
制造业产品异常检
# h# d- V5 o- P数据中心机器异常检+ B& B% X ~# v: h9 ?1 x) }& }
入侵检测1 A; M5 k) C' s3 l$ w
监督学习. h9 ^7 s. F5 A
垃圾邮件识别4 K8 @- s2 X; {
新闻分类( @/ T/ m. P( A$ m
二、异常检测算法
# L q( J( F! K( m. v' s; A$ P) e7 S2 T. i, ~6 Z" f, p' e0 ]+ M
3 ]2 j. x0 V2 \& U1 w3 H% k# N8 C4 V1 O
% t F, k/ L! F, i" _% A/ F, r% P+ P6 z! o
/ V" K" W) m uimport tushare
2 U7 a/ y/ u& }, I' M, dfrom matplotlib import pyplot as plt- p6 k4 ?; L1 a2 ^ ~* k
r; k7 J! ~) z b
df = tushare.get_hist_data("600680")
1 M( Z% T0 X0 F, w8 Av = df[-90: ].volume
: [# y( [7 {; k/ ~v.plot("kde")
! ^. s7 r5 d7 lplt.show()2 }. C4 S8 n: ^9 M9 {( T9 B1 h
1
+ d' ~& i$ D% _- c' j+ I4 g2
* O0 l- g* t% t" G3 g' o3
# V0 Z5 q2 q! r4
9 ~+ Z5 i6 e. ]- ^4 ]5
. t. s( G& W$ `$ |& v9 D) l64 `$ U$ Q# R7 }6 Q
7
1 b+ g. l. \6 V1 e0 c3 n近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)3 r1 t/ X* ~& R" i, h7 ?% l/ f
" v1 R0 V1 q0 \) Y! t
$ M. O1 ~& [, I) _
+ p0 { Y7 A+ U H$ `5 U
, h7 d( s% J4 {% s
7 U G U9 y. U: e3 M' G; P }1 [
8 m% F& G4 Q2 }- x8 R% e5 V7 a5 V6 U* i( Z6 s i+ ]
1 S0 E# Z8 s( `! t. S
2. 箱线图分析! @1 P6 x$ V" h
import tushare
0 X: g7 l( l. I7 |from matplotlib import pyplot as plt# x3 X+ V: B) y% B' t# v
" U w [9 A* H+ y! h6 ^! udf = tushare.get_hist_data("600680")( |+ Y7 D' |" L" c
v = df[-90: ].volume
7 |; o6 j; M' k8 Z- b/ Pv.plot("kde")" l- \! S6 X, ^
plt.show(). v$ }! R8 b& \1 A0 M/ a# V, w6 h! Q
1
( g9 g: k; f4 S2
( s& Y8 i3 A6 u ?3; d; z0 C, [2 e- d4 q4 M3 {1 M
41 l0 @3 h, a: ^/ R& d
5
* A$ Q. s2 {4 w5 A6' R( C( m+ L @8 d+ p
78 T* T; w" `& j
4 i, k2 i" S0 [2 n' _
) E/ F, |8 @7 z2 g6 V! G大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!* K3 n5 _2 n# ]2 w
3 A9 X9 T5 \0 k$ V2 n/ i9 K% }% m8 H# ]1 J9 K+ r5 i7 T6 S5 H- q
3. 基于距离/密度
) C# o' f' I% D典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
7 l* R( f. Z1 f2 g6 n9 Z% R8 ^0 S$ q
, A5 f `. V) X }% I; z" p# I用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
( h3 j) k o( R) V4 M" |
- k# _0 N4 ~: q3 q" B# @
1 m& f! a* E" d- R& T. ~! P( R7 x) m Y( r
7 B, |/ b! k ?& w
: S1 o" _# @2 d! t
2 ~- c3 L4 ?. v$ @: k( L( H n# q* M# u# e
" z" y: x G2 w. P0 f6 m) j4 ^4. 基于划分思想( P4 o0 w- [ j3 \$ Q
典型的算法是 “孤立森林,Isolation Forest”,其思想是:. G/ {# m; }9 c- V% K
! t: d5 n. o* N- b" l. w- v. Q
& _) ?2 e5 P& B5 k+ B) C$ g. ^% N假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
% p+ ]1 b7 d% y% U- ?" d. g: w% I8 ? s0 z
9 f5 e4 Y3 F/ x这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:+ m5 F" I D: } H) Q; X
) j" f- y7 Y7 t% E2 u
2 Q' w5 o3 h7 S; g( }
import numpy as np
4 o3 F; D' d. F8 p1 H `import matplotlib.pyplot as plt% G6 n: l; J$ R0 a
from sklearn.ensemble import IsolationForest" c7 l& j, J1 g: i5 c, u1 _
5 F) P# n8 F# d4 D6 ^1 w
3 m I( Q! N; z6 `% w5 B+ orng = np.random.RandomState(42)! w& C9 m. z# J# E
2 a6 D, L- @% T& k- U
! t! w* |2 E6 a# u8 m/ u! [7 ~# Generate train data- \2 h% r2 h5 }! I0 W6 R" X- l5 g
X = 0.3 * rng.randn(100, 2): F# X% D0 J. a9 a! L/ `: O
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
( v* V! D- W* L! a' x9 Y5 j# Generate some regular novel observations4 Q' s- g' e( F* [5 l* b
X = 0.3 * rng.randn(20, 2)
/ F: t: R, \7 j7 ?$ IX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
) Y3 d% G" F3 N- Q" F4 t# Generate some abnormal novel observations
q; k2 F; y. D! B1 E/ ~X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
% w. g' v1 V" p; l+ G6 ]$ t7 {
& ?' H/ c) G6 ~7 z* l! t) G9 X* w/ M1 B* i" O
# fit the model, k7 W1 s; o E& v" O o
clf = IsolationForest(max_samples=100*2, random_state=rng), L& q5 l4 [/ T* @/ e5 s
clf.fit(X_train). _7 t. p8 n/ b$ T+ ]9 c
y_pred_train = clf.predict(X_train)
, B0 Q0 J- ]4 S# e" _8 O# {y_pred_test = clf.predict(X_test)
5 U1 f5 \+ E# ]3 w9 D% x# f8 q. Zy_pred_outliers = clf.predict(X_outliers)
L% e/ Y% X& F- B, o
. w J2 b, N& c" P, C5 Y# h
' C, R+ u/ `7 w9 R* e& c# plot the line, the samples, and the nearest vectors to the plane% t) ?$ a! C; e: o! H; r F
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))! K' D" ~7 T# N% l7 [) v8 Y0 I
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
5 }% s$ |% O7 k0 A5 d* V/ CZ = Z.reshape(xx.shape)
) E0 F* ~- G3 {
& H1 z+ k& r) K- c$ u# Q8 |2 S. K! z3 ?2 n
plt.title("IsolationForest")
! p i& o1 C2 f V3 Fplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)) e3 C; B! o. i9 V
( I. u+ x: L! g5 g, e
q+ P4 i% }6 v! ^, g+ [( e- gb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')5 h, m. r; a: Y4 F. n/ G2 N
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')4 `5 ^7 {& g9 c, l7 m) b' Q
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')$ T0 c, v* H) U8 C, S
plt.axis('tight')
6 s( \& `, m6 l' y' w1 k& }4 Qplt.xlim((-8, 8))
3 K! h2 h6 H! i, q' dplt.ylim((-8, 8))- U3 P, r0 y2 D+ t
plt.legend([b1, b2, c],
2 m+ {0 D( z4 y- R# V5 a: B ["training observations",
0 C% N" _; _6 W* S9 u4 h& ]" l "new regular observations", "new abnormal observations"]," B1 _* s* y) ^/ K8 V; I
loc="upper left")' L$ c8 x9 v' S: |0 d" O( n7 M
plt.show()7 T( i' f: L5 y, _4 E. }1 h3 d/ l
1
. Z% j+ y8 O/ o; J29 x. K6 @6 W8 p d7 S& K
3
/ b7 Z( `* l4 u7 n! f. g. L44 T" A; n) S: k; G8 v
5. Z& Y6 f% y8 K5 X
6) }& N) y% M1 B7 h
7
7 T- \$ x, W: H) n; J8$ S+ O8 g3 ~' t6 q- `. F
9
+ ~% D4 F% C# P10
6 _# [) A! S J6 F& a+ l8 V11
7 u2 i/ D4 E+ R1 B" S12
& w# ^! x+ N! {. w, ~13% {2 R5 P0 V( k7 y% w" X9 ]# `
14* d/ _8 D5 {& {$ ~4 ^ ?" t
151 s9 H7 r8 W% c. ?; z, t! D$ N
16; d( c" e. G' k# n+ J# y+ j* b& Y# f
179 M2 I- J( Q) G) d
18
. }# z+ H& S9 l7 \" o/ M" f8 _19
+ l7 z- X, \$ F# K0 x1 u3 r209 u6 P M2 y. y8 J2 X l& W0 }
21
- ]; ^% l6 s1 y/ q' y2 q( i22
/ ?1 \; A2 X6 J# H- F" _% X7 Y4 U. o# [23& N5 U6 k6 z5 c. `) f0 A# H8 e
24
. w; e3 K7 F3 P' J5 S' z5 c) G25
, v. @* b; @ U1 A% t% V: X26
5 |1 d3 Y( g# v+ V& t/ y27
9 {6 O' r! R9 z3 C5 {28( o/ U' ~4 u( \3 T4 m7 x$ l
29+ J, [3 b8 E" S, }
30% s/ F, M: A2 `# ]- G5 w$ T5 _
312 C' j4 ~& k9 H# ]; o7 Q; }% K) F
323 p, u$ ?) b. [# J; j! r$ B
33" v. M( g* Y$ n. `. U4 P9 s+ ^
34
( s" C1 D+ U6 T358 g" v7 I6 j. j% t# [
36: m7 _5 u, |% S2 j4 j8 Q. W
37
. h: h1 s, d& g9 N! Z38
7 f# K2 g5 B0 `" f. [6 P2 P39' z# X/ `! U/ U H4 b3 q: u6 U$ h/ G. W
40
) g4 [. [3 }1 n1 S7 _* _411 f% b6 C& a1 `+ Q& u
( G6 _3 e, O3 B
r, K' ]* ]/ W5 I1 @4 j
————————————————
( W' Y5 K. F3 d9 `* {" I6 D' Y" r版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 L1 I0 m- w& h& ]5 c: p
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129. q9 @; R' \# M g# O+ G- Y
6 }$ G- H$ b5 l& Q- j/ C8 A6 H
4 b, Q+ B& j4 K3 Q |
zan
|