- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565618 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174908
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% F" M6 X4 {9 E# @; x' q5 o
数学建模:异常检测算法' ^ H3 Q5 A: \: K) O
一、简介 – 关于异常检测' u- V. |) g4 t' b# {( ^9 R. U
异常检测(outlier detection)在以下场景:" h$ u( }7 g1 n$ L k- D
/ N( x/ q X2 v0 ~' E3 o
; u# S' |, n9 r7 S( u s0 y
数据预处理# W- T9 T( ]* y; O7 o9 V+ s/ s% ]
病毒木马检测, f4 H8 a+ W" x5 ^% X1 X4 h
工业制造产品检测- o) _3 @" m, s& a4 M6 W* Y j
网络流量检测
3 p7 p3 M! l2 [& K" F6 k( t9 L2 Q& j等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
* [2 N. k+ R9 _$ O" w
' b! P( ~+ Q m1 O$ f. j+ D x0 r& t/ K
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。* W( S) X" v# b& ]# ~# c& y. ?
2 ]7 b; C) J1 Z% q9 r% a0 W
% V2 U0 e; n0 A+ _以下是异常检测和监督学习相关算法的适用范围:! ~# P# n5 Q9 n- `- ^
, N8 s) M! J4 d" g3 g
" n* Q4 } o5 x, a2 Y6 T+ _& P( c( W异常检测1 Y, B" H! x1 q# q
信用卡诈骗) x* p# ]' x& ~
制造业产品异常检* K% u2 n; v7 W
数据中心机器异常检" i3 y( U" J& U/ W# n- L% S! \
入侵检测
) ? [& |- b* N' z3 Q3 a监督学习
4 `8 S% F4 ]/ G9 {/ d3 d垃圾邮件识别
7 W; k/ W" F7 Q2 i3 m新闻分类4 O$ }) s* \! v& b# S
二、异常检测算法
+ J- N. |' V; Y @$ K ]
+ |! F4 n% t) }
O; K1 i; b/ \6 C- D: W* i/ g! q A4 ~
$ t; U* D8 Z8 @! L! k; U( ~* e0 z4 ~! @
8 h* Y. `% @ f k, Timport tushare
/ Y- ^! F8 E4 Ufrom matplotlib import pyplot as plt
% Q1 A. N0 } q7 |# L# o j3 z, v7 F' \# k4 I0 _
df = tushare.get_hist_data("600680")
( N' v3 X, i8 X) r6 V2 u% _9 lv = df[-90: ].volume
& p9 [# |) _8 ?9 W, R5 bv.plot("kde")
; p6 u% {, W+ d- f+ \9 jplt.show() }) G3 ]9 q' P% R. [5 O
1
}5 X# [5 o% x5 z2- m. X7 [% n d9 i1 f* T
3
. g/ c: g1 K. Y9 ~/ \: m# b1 k& I4
' i% W, _+ E( I5 b( d" l54 S0 E; T* i+ a5 t: F
6
% G; Y; A, h) e h1 {3 ]3 \1 @7
* y6 K& E3 B3 i# L% u7 ^近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)! @5 k! r5 F- i' R6 j
4 z& T& X) F. y7 b
; x+ s) F8 E8 J7 a
3 |) _9 X8 o. T2 f
( q$ ~; j) [5 L u7 O9 g; @. Y9 w
* I5 a2 E p2 I) g* a" |& N g' {; Z4 C F3 G7 y; j# \) I& _% T- O
: n0 S7 w5 Q7 k. K' e: o* v2 x- o0 w# Y! U, c3 `: \
2. 箱线图分析
+ w% }; y0 l8 @9 `3 I: g- r: \5 a6 R! `0 Rimport tushare* i- x0 w0 \/ B6 d3 v4 m, y6 }; H+ y
from matplotlib import pyplot as plt
g5 D$ v0 c' v T& Q, Q. U % H4 G' d) c$ W* s6 p
df = tushare.get_hist_data("600680")
8 A' a0 e% s$ O4 wv = df[-90: ].volume
, g' g H7 h* d# P8 b: Nv.plot("kde")
& b# W6 C/ r+ e$ U; O b. hplt.show()
d& P, a" O: e. b' M13 y5 M; n' r% P' }5 p0 d7 U
2
8 |; o2 Y# v7 f; C3
* L; p2 P+ J W: T5 y+ u4$ X R( ]! Q, m8 \
5
- P1 O& f: {/ m/ u+ [2 T# M* G6
1 h. Q) m' q# I7& E7 O# w2 Y6 M1 y" ^. b2 U
v# S7 [: J: v% m2 P* B# J' Y }) x" D" L
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
' h1 _; j+ O. O1 ~# `! k! z$ A1 g0 }; d# s
1 ^) R G/ _1 E& G
3. 基于距离/密度7 w- B2 j3 F, a6 _2 G. |1 e" ]% ]
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。7 b3 Z u0 w4 `) x! z
( Q% O- j1 q& Z6 j4 X# b* k$ w/ v" ?: K- C
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。+ @3 B$ ^' M3 K# ], E: x' n
/ b! z7 W) U! L' N' g
4 t, \. n4 R# e& {) X0 M
; \* q9 J6 Y' K U1 T8 h9 [
. C) K) @ O/ o' D4 [% [" p5 u7 O$ w6 {9 x7 d# w
, o m! B g7 o
( A1 B7 B J7 J+ b
- {4 R$ B+ `* c8 C# m! k# U, \4. 基于划分思想
8 `5 ~! [9 v, v典型的算法是 “孤立森林,Isolation Forest”,其思想是:2 o9 }# c. \& ~# _# Z
) I& T' h5 \2 \# [1 j) P* S
$ Q K: {% K0 D/ o' m假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。& F: o6 ?4 D- e( k* p: J
! D; O$ G' p+ {
' U; v# H# S" J0 P( r这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:; Q2 P- c* d- w/ }( `
6 }9 ?4 k: X Q- G) w1 ^
2 `$ f* L1 @4 A' w9 z9 }7 e% dimport numpy as np$ [' ]- j* x' D5 y4 @; h# v V* h
import matplotlib.pyplot as plt d4 Z0 N2 g) e$ {
from sklearn.ensemble import IsolationForest
]" W9 U! _* {& n2 S! V) X
: Z, r2 A; h9 Y: @, W5 H! i% U4 W1 f! p
rng = np.random.RandomState(42)( ~) J# o/ v, |8 C5 S+ N3 Z8 G
6 p/ Y, ?! V; ^ L+ p' c
5 k9 Y3 x5 }4 n+ q4 I* u# Generate train data4 c0 L$ I7 B7 Q* r) n
X = 0.3 * rng.randn(100, 2)
( g" `! x2 U$ k' e* ^9 zX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
( |% M3 u$ o- X2 K# Generate some regular novel observations7 g% n# c$ F; z" H; g: y g+ g
X = 0.3 * rng.randn(20, 2)+ H! u5 o* r. |% |, U+ r
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
7 a, s1 p7 o3 Q0 I# Generate some abnormal novel observations5 F: L6 W+ t7 `: t
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
0 ~7 V% n% ]7 A
; {# w0 K, S& L' V( t7 q; R# p
1 ^- O2 \2 c4 y! _! {# fit the model- [: y# o" I/ v3 r
clf = IsolationForest(max_samples=100*2, random_state=rng)
3 b, Q. ?6 K& [: ^! x" e' T& @- fclf.fit(X_train)
1 T1 r' n( C5 _; A2 O- g% }y_pred_train = clf.predict(X_train)6 @8 `* b# s8 X+ w- J
y_pred_test = clf.predict(X_test)
- p+ b; k% u8 b- p( Jy_pred_outliers = clf.predict(X_outliers)
+ N! F1 a% a2 R7 R7 S
9 y0 y% }' S- a L5 j+ G5 ]5 I0 L8 H6 X
# plot the line, the samples, and the nearest vectors to the plane! R# ~+ r( T1 _' ~' p. s
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))) q Y: z7 s7 k; h6 A" X* M/ c
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
0 W: C8 x2 u8 K3 G' mZ = Z.reshape(xx.shape)
* a: W( ^2 ?% z; P( s
! c5 M, R ?( u3 q9 m. m1 W1 q* J9 L2 N0 c; q* w
plt.title("IsolationForest")
, B! s' v5 {" {/ cplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
' e( `) g! @7 ]; ^5 d0 V1 P) H) W% y9 }7 |' c* f- {
! U- q, G8 a+ q: n! H+ t" {! |( mb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
) x2 v! o9 B3 eb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')+ Y J j' W {) w( m. g: x- Q* w+ F
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red') n' T; B( w/ L8 j9 _4 Q: i E' W# h
plt.axis('tight')
, d8 J5 P9 ]* v. m- P) splt.xlim((-8, 8))1 m0 [/ u3 {/ q* S* e, T4 F6 c
plt.ylim((-8, 8))
: b! e. @/ y$ }$ l1 ~ \plt.legend([b1, b2, c],
& M- g; a; \% L* ]$ p% e4 v$ p ["training observations",# ~9 A; R. ~* q9 u: Y& Q% W/ n
"new regular observations", "new abnormal observations"],
1 `, d6 m- U' b1 A/ y loc="upper left"): S8 |! H" U, u! p! Z! t
plt.show()
( D" v' V4 X) w0 {15 m& a1 Z/ F9 e
2+ g; [- A, o l. V
3' B. x6 e7 s% N* V6 m
4- }/ z Z( T8 d- e
5
4 Q: f2 r& u6 P/ F; O* x& O6
0 f# D. D+ {6 E2 _7
8 B/ @0 o6 X& x8
. U& N& C' g/ C9
3 C% w+ T+ S9 J/ e10' |1 ?( s6 a2 A) {3 n0 `, }
11- R) T U/ G7 S' o( @, _
12* d2 k9 Q9 Z" R2 O3 ^( f, O
13) O% G! r) e2 v3 t& G; \
14
+ f- V( j0 ~% | j; C8 h0 P' Y; @15" X' F6 i( M! _* S
16; V+ T5 }/ \" j U2 a+ @2 U
178 ~/ E8 m) L( t
18
( c; [) c+ }+ G% N19
, ]8 C c7 K! r' G: |; s20/ a0 W( o3 w6 y+ |
21
# S6 Q+ Y. b0 T- `22
# W W' b8 r$ H; P6 O: G# \23
- F/ S0 C2 [4 n" [) k5 M s% [% L24
1 N9 S! {0 M1 B/ h5 M# }7 Z) I25
4 r0 p( E8 L, b9 \! k# O' h$ E6 M26& W; M8 N/ O# G6 S4 G2 q5 P7 E
27
0 o" [) v$ x1 q4 J, w" h28
0 M7 O. g0 \/ x1 h299 b) S- j% l+ x" U( R# i' J. F6 Q% H: G* u
30
1 F. w G+ g" `5 M31
" J; m% Z2 l; R, L32
5 j5 f0 m5 F* L2 ~, S; }$ `, B33
! J+ d& Z0 R3 k% A& X" z0 A34
! j6 O0 `, _" f3 w35 q0 r3 {% y" S) a% C8 I, e
36
% E+ Y; |* k: m7 @1 H37
1 p7 ~/ B2 }! u& m' K" n. D) Q, _, {38
& m. N' M. o5 K3 X4 W" g39% R+ `/ M2 o4 }" y' c
406 d6 ]& k% Z8 [: g' y2 ]" I8 `
41
8 ?6 ~! a. U8 | a# r4 W: a7 b, A _: R) `
; |( I+ u e4 a6 r4 r! x* Y; U6 e
————————————————9 C+ u- x# F& H
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ O- E- G# V# }1 p% Q9 [1 | ?7 q
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
3 ]+ O1 `% O+ s- t
0 A6 y, }, F8 X; G" Y
, W3 Q& ~' e5 \1 t3 D. V |
zan
|