在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565615 点 威望 12 点 阅读权限 255 积分 174907 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
) G, ?( ]" Z1 d 数学建模:异常检测算法
$ \5 Z7 P8 r3 X: f, A8 ~3 _ 一、简介 – 关于异常检测 " k: {) T& G, B& i
异常检测(outlier detection)在以下场景: 1 S! @9 r2 \* p; R/ X
/ N. ]7 M2 H! m/ Q
. Z- M' p. M1 |) Y+ n
数据预处理 * U! l: {1 G# N8 j* o
病毒木马检测 $ Y1 b# O( C, o- X+ r1 M3 y. `
工业制造产品检测
* z( w0 _2 z5 u ] 网络流量检测
/ B; _: c; _0 a, W 等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为: 6 r5 N/ E3 w! h i* }. Z) X$ f
5 ? K; [' y. ^: j( R0 L: q/ K
+ x$ V q& w d6 i5 n6 U" L, g0 a 监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。 : J( j! q, d5 F
; O4 t: Q- j# T- z9 I% H3 K
* c4 a9 O0 y0 m1 t/ ]. e* S 以下是异常检测和监督学习相关算法的适用范围: ; H, j7 l3 R/ t! ]# N& V. T' }$ ]; p
- l2 @, c1 i: U+ d+ E
/ g- A& P: g7 ]. W
异常检测
7 n+ ]( X8 Q, ` 信用卡诈骗
1 A. i5 q, V7 r2 h& L2 \ 制造业产品异常检
, A: u% L% f- p- ]; N9 a 数据中心机器异常检 ; {6 R/ l: Y5 C+ d9 s
入侵检测 % j- R0 A4 K" x* J. @' H
监督学习 7 M ^: J$ T3 {, I/ g! Y9 a6 k
垃圾邮件识别
6 R1 w8 y3 T# E4 N& G 新闻分类 6 p# T4 \" g4 A7 z
二、异常检测算法
O4 a5 _. t% {1 d; w( T6 r/ n( N
, k' @- K+ r( j" {, |( m
% n. z0 o! P" o4 i , |7 E! n# y/ l9 q% A2 F3 N6 ~
5 ^( f7 C8 [. ^# O( B% j4 U6 B
* ?5 S# ~/ O: {1 m9 M) z
( ]; h/ y4 b, N2 w/ Q/ O- J. c$ @
import tushare 3 K3 E+ {/ x9 F+ K7 k4 F* x* n
from matplotlib import pyplot as plt : }1 M$ v* K" s( u3 Y% b$ O
8 Z t3 Q! e9 d& S$ R P
df = tushare.get_hist_data("600680") * r; ]5 n( ?1 j5 K* p
v = df[-90: ].volume " k( Q. Q% D. Q1 P% u
v.plot("kde") 7 e, z& T* I* P# V% n& ^# O6 E$ f
plt.show() $ e. ^2 _5 v$ B; S0 q3 u
1
- |( ?7 X! V3 j! R! R. C4 i% o 2 # I J5 Z# ~5 w, t: V" M$ b
3
$ t) ~! p2 X: _3 s' t; A 4 4 }. F% r; Q) Q
5 % g8 H& ]3 r j
6
3 l" R V P1 W" B7 D7 Q t 7
* N* `1 c4 q. E6 v5 Q8 d8 C 近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
, G2 w$ n r5 u- ]9 J . x" R4 h5 O: W' ?
1 {+ g ?& ?. L8 |# k! D5 k5 Y% w
) l9 T2 i5 ]! |* F4 H# Z . c9 \9 b+ H* p, V! B( \
. e0 ^! B/ \. y# [! _! R# M
" ^$ f& z) W2 O5 q
$ I% C( c& i. t' s , N" R2 e3 S8 h6 ~) E( v0 d
2. 箱线图分析 7 R+ Y" G4 t7 v! U! s1 Y) P
import tushare
) n# B1 N G9 R6 @2 @0 G8 { from matplotlib import pyplot as plt
6 M! i9 n( x$ i L7 c$ u0 Y8 H
6 M4 G) g# u+ r. K9 j6 {: s df = tushare.get_hist_data("600680") 5 o. O* }! G. w u
v = df[-90: ].volume
! K2 V! y0 D# Y0 j8 n7 c v.plot("kde") 3 s+ x; x1 D/ l' A" H9 b
plt.show()
+ l. t" |1 Y$ [3 I6 | j: m9 s1 ] 1 , [; @7 R E! a9 m9 }/ l. M1 H
2
. ?5 a( `8 x; F+ d 3
. i- m, K/ ?! H- C% t' o1 z0 T 4
' X/ r: g( y% ~$ Y8 j; ^: d 5
0 r. |3 m2 E( x5 O! Q, n 6
1 M3 A. g1 k3 t& ^ | 7 7 b7 G% H* e: R3 s8 }( b7 i$ \: k& ~
5 q0 ~) ~* T1 K
9 l# \: @' j" J) ?( ?5 S
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦! ( o: E; w- d7 h8 v k7 z! N9 ? h3 d
]0 m9 Q+ I( Q( ~. l8 Q % S0 }) }9 o& s" ?
3. 基于距离/密度 4 H2 b3 c7 J7 a$ l) \
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。 , [& h9 x: [4 W
0 [" {# F! ?/ N$ ~ w' w
6 H% S( b% c6 E @+ u* }- [ 用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。 ; U4 N h4 P' h/ y J2 r) ^$ Y) g
$ U" p' n( W Q3 Y: Z* n
% ^3 v# R- v1 Q0 O0 i6 r# g$ _ 3 b% z) f; J/ }1 a" r5 w+ r+ N. E' O% n
9 V) p# ~" ^- ^7 O
& W. E% X- t" O; A 0 q: o4 m9 i& V5 ]
. [5 @1 b6 i- t
S7 R& @3 Q' S' ?+ E+ T 4. 基于划分思想 2 D' R- s e5 i! r
典型的算法是 “孤立森林,Isolation Forest”,其思想是: ' C4 V4 j! Z; ]3 }! K6 J$ F; M9 Y
* K5 w3 X' T" Z8 p6 E
, n/ w2 l; L3 W3 U" y3 L 假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
9 J1 E; I+ q9 [! O
, Q0 D. w8 t% N" Q7 [ ( { T# v) N: n
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程: z% c* r1 \* {
! t* N" a" R6 f5 g
7 n: `9 B1 {& ^ import numpy as np ) _+ E+ U. B9 V. T
import matplotlib.pyplot as plt
% y1 F% g9 Y3 h from sklearn.ensemble import IsolationForest
7 n3 Z/ Q* Q& @
7 n- L* ]6 V. B; [! Q& W$ ~
% I& X8 W$ I' n$ _! Z rng = np.random.RandomState(42)
* [1 j i" @1 a* V" I& @& f( X . {2 k* ~& r1 w- L+ g7 D, T: N
. y0 t1 Z% d. X# x, _* A
# Generate train data
4 X9 s; H! Y3 N( O1 t X = 0.3 * rng.randn(100, 2) 4 _3 a# x/ f* [& g' B, g3 _) i( O
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
% Y/ o: S4 @ P* a- T # Generate some regular novel observations 1 e7 f$ s4 \' Z0 R3 q( J3 r4 A
X = 0.3 * rng.randn(20, 2)
j9 f8 Z; c1 v7 ^5 ^% G; o X_test = np.r_[X + 1, X - 3, X - 5, X + 6] 9 Q2 Y- Q5 @2 O& ^4 }0 I; V
# Generate some abnormal novel observations
p/ {* K( b3 E* T- r W t X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
0 y9 t$ @0 R: y4 H) T, I$ a
2 Q( l, `# K& E* v( x2 B2 s ! H: y2 a* Q6 N% w s2 a
# fit the model 0 Y9 z; a5 m4 t$ r6 B- ^. z* Z9 G
clf = IsolationForest(max_samples=100*2, random_state=rng) ! D( G% `: Y, E$ j% t
clf.fit(X_train) * _" w; g3 J1 x5 ~! @, p
y_pred_train = clf.predict(X_train)
& [, ~, N9 j# I1 D& z& {0 N: A8 ~ y_pred_test = clf.predict(X_test)
# L( z/ v9 Z& d- Y4 Z y_pred_outliers = clf.predict(X_outliers)
7 K' `& W3 x) b+ a0 j : T: I8 z9 R G% [- O- y
/ z7 W" R9 V, R/ @' H- C
# plot the line, the samples, and the nearest vectors to the plane & q% v# {+ D# r( @
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
( g5 t/ Z% B+ P g7 \! P6 H, I- q Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
; A5 F/ f0 B) ]( E6 R5 d Z = Z.reshape(xx.shape) k( d. C+ b+ \3 Y r) Q, G
1 ?0 k; P. h& V1 w6 n( B
4 T) X4 S9 |1 s7 y1 W% f2 W
plt.title("IsolationForest") ; w) y, z/ p9 |4 N3 C+ ^
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
1 i! Y2 ]1 X7 `/ J9 j% c% n * z9 @1 e" U+ ?: T
; r4 I% _" V+ s b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white') 5 F% [, S& m9 f8 t" O$ [
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green') " B) I* p0 o% i1 G' J7 D
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
p% M; m5 A6 r( X) r/ g4 S. ` plt.axis('tight') - J! g2 o1 R' f6 x3 \4 J
plt.xlim((-8, 8))
' `" R5 i. w4 f7 N& q% [& C5 X plt.ylim((-8, 8))
( }3 F( }% Y5 J% U plt.legend([b1, b2, c],
: v$ a" S) f: R ["training observations", % T& b: q3 `' M
"new regular observations", "new abnormal observations"],
% h( \* _5 k) x3 j loc="upper left")
8 O1 i8 c) a: D( t1 Z plt.show() 7 z0 D2 |! P; f: a
1 * W" v! \0 ^+ K
2
8 ~$ ]$ |4 f9 j5 s4 A! } 3 , \3 A$ O6 ] l2 t7 e
4 ; x% P: U; ^4 U3 g/ j* F: j c4 D
5
# S v1 j9 u3 J' |' _9 r 6
% J& l" ?8 ?8 c$ D0 U 7 $ L3 [' T1 d7 m
8 % s) \& q H b" p/ u+ u
9 " h6 q \, R& x- N2 j
10
) y7 E+ k) l" v/ O# I( H1 s9 K 11 8 O; K1 l( g* g* {* |
12
& \4 l: L5 Y8 T' S/ g 13
; `$ P4 z2 H, Q$ k1 } 14 ) j$ F1 k0 A6 d
15 8 a" N8 @* x/ {$ a
16 " k8 [+ s6 _2 {0 d) U5 X- y1 d
17
# M) W8 ^& g! H% K 18 # ^ ]% l0 v; w" |
19
$ _ G7 L; y0 W3 W3 n# Z 20
) L( g5 i- z& e# j) w/ b 21
0 F+ j# [; }' B2 c 22
# E4 m J4 ?3 Z1 _( K 23
0 b/ e+ N2 [7 i 24
5 I4 [7 ?) x, x, e) Z 25
- S% Y5 `: u$ t: J4 M 26 6 f8 V$ R% m2 Z0 Q E/ w
27
/ ?, z% k& r2 G( v1 ?. { 28
) S! x$ F- V! N 29 0 A$ }: t3 }2 c1 ]
30
3 q5 d3 B5 }5 w2 d) \1 R 31
$ n. b. M' a9 A 32
2 W. K' K0 g+ ]* _+ q5 x( p5 `: |* M 33 8 @6 m6 A: q- m# f$ }: m0 t# L2 a
34
, [( I2 j" u) D 35
) {! y: C0 V0 m% r 36
. Y$ h7 ?5 t& g/ c) A 37
" u, o& `# W/ l p1 A1 v 38
& B( R- l" v/ K1 X4 O7 {% U( A 39
5 _1 j1 u# ^# l3 M 40
3 e, f% v( j4 l8 ?" f 41 ) S1 R/ ^. s: ~# s6 h# f4 t
3 i( C! M9 F: ~: ~& A 6 V( ~# D: ]. D0 M g
————————————————
x5 U6 D) ?. P& E 版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 2 P, q5 U h) M! p
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
& K# R8 f4 \ {: |
: @$ d+ O& G& P* Y& C x! C+ \
% b) [" z+ R N/ T- ?
zan