- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564453 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174559
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) x% @. C# s9 U: H, L1 l+ z
数学建模:异常检测算法* Q. W4 h/ A' Q: ]( G6 l- H
一、简介 – 关于异常检测
0 T& U7 J2 ?9 w! W异常检测(outlier detection)在以下场景:
" e$ A( k) r2 s* a: {) X& Y, D& S' v
; Q6 P4 b1 x, ^6 x. Y; b' e
数据预处理
8 m0 G& m" R# {, F6 R病毒木马检测
5 `: S0 C7 V1 s; }, ?! T工业制造产品检测
+ x8 i9 c( t( A2 G$ r) F网络流量检测( J' O1 w1 U& s% u% l
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
& A3 [4 k7 S( G8 _# y% K0 Q J- l9 C- @+ J: M% {# h
1 Z! i% M; B7 J+ @1 Q
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。 y f( K) k8 M5 C; r8 k2 `! d
0 ] X0 e6 S/ k3 t' r- u
7 e5 r+ T/ j3 h" a以下是异常检测和监督学习相关算法的适用范围:4 Q9 z& a1 Z/ h, k4 q
) b" b- @0 @5 b# ^4 a/ P# F
$ F! H; N4 j3 o3 V异常检测2 ^3 k7 k- [ ]+ U& c) o
信用卡诈骗
* J8 L i# {. n7 M制造业产品异常检
. Z& J5 K$ l! G. J3 A" G数据中心机器异常检
8 O* @, P6 e" W: I7 k+ L入侵检测
5 s: `# z5 L* z# }# l! J) Z监督学习
7 P1 Y/ G# D* S0 x2 v7 I2 }2 j垃圾邮件识别4 @: _4 G! _! i
新闻分类1 h% o! |- [9 F2 x' A5 R
二、异常检测算法
7 i* S3 U2 H1 U% c6 A; B: y9 z" }
' r6 G+ i* M3 q
( R' D" ^8 B: [8 n/ d- w8 z! u% F1 V. w7 o
7 \6 J U9 ]" ]$ @- f6 v
9 j) b X/ g; y- M
- X q4 A4 n, J, s: k+ \% Mimport tushare
' f# h7 W' n+ m2 Nfrom matplotlib import pyplot as plt4 E, Q; h0 }, N" Q( D: D
3 ?+ P4 }& {' g1 ndf = tushare.get_hist_data("600680")% L6 X& x3 U; J& J u" h
v = df[-90: ].volume
4 f0 T+ X0 T, i9 s8 Y% T7 W0 P. g9 uv.plot("kde")3 d5 @9 ^7 g2 s6 o
plt.show()
6 q, z" ^! ^+ w, b1. k0 O3 B4 x9 Y
2
. u' G+ R8 |* C: k5 E" K34 D3 A; B7 M6 s* s/ s! w) d
43 |# A+ P w6 [9 Z' G
5- X2 r- H2 [3 g" P. U3 K
6
+ F6 u, _, ] ~8 g* M7: z9 q( v) }( V* f6 W( ~
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
6 v o* v& D; T! u z
2 y6 R4 C3 I! @+ S; A, f# d8 Y& t
" s8 J/ W1 d9 G1 q$ m
9 _, e: h L5 \9 \( `+ W |% ^, p1 P
# |8 E! Y9 \: i( g, E
) C$ Y9 c; M* a5 `( F) g1 w, f3 B: @8 N4 l' k) \; J
- T& ]7 m: ?/ Z! |
2. 箱线图分析0 L2 N) n# d! N. _; P- H
import tushare0 T2 q/ [: U7 j" m( o* O* ~* F9 _
from matplotlib import pyplot as plt; v5 C3 y, Q6 e/ [% T! W0 @1 q: p
( ^) a6 x0 P* m7 @9 ~% D2 t+ w
df = tushare.get_hist_data("600680")) P8 ~4 C1 `. V' D2 }8 T
v = df[-90: ].volume' C3 u8 Y" x* U' | v
v.plot("kde")$ W N4 |: R* {7 ?- m$ t6 F/ T/ T
plt.show()
2 o) b a+ g7 v, @* N+ W14 Y1 }3 n4 m3 Y9 D( u$ e; \9 M
2
" _8 h5 i, s, @6 l+ D% u7 A9 x3
* Z5 E! I* S: j% r4
# W: {: k( O. K+ ^& ]2 u$ f3 ~+ k0 [5
& `+ v6 _, @" q% I" [& [6* Z! N" {3 ?* ]# @7 s' M
7( F1 ?6 l$ P7 g. c# g1 T
2 P3 }2 M- g2 H6 q) k4 ?
; G" Q7 [$ }2 f3 ?9 S3 [大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
; Y* v7 w- j1 D. ]- d2 Y6 k6 ~2 p( x4 G2 k2 ?+ S; l
) w( c$ {! S* F4 }6 [- A
3. 基于距离/密度
" @" n* X; D0 B8 ^' L% j* ~" M8 J; d典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。: ~& u3 f$ l" d* [: t
& F+ t1 N! o1 g8 M
" R$ {( V) o- T
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
+ {' t( g* d$ g; }7 a+ k* O$ n H+ t
* s& O; X# z" r$ ?9 }/ p* `0 v7 M. t
5 w1 ~ L$ i7 C" G8 N$ Z. {
7 R5 F2 n" f) S7 F. Z
1 p; O# s( E. B
; ?' I& o6 l6 ^: l& a! Q; O9 H" Z1 O& B4 Q
4. 基于划分思想3 b0 H+ K: g$ D6 p" ~' e
典型的算法是 “孤立森林,Isolation Forest”,其思想是:3 |, [# y! U S, d, \
- T/ t6 f: r) O i
; S, Q2 v U, a R' L- R1 O# d% `
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。0 k7 B+ g' i' k8 U
/ C+ y# q7 k, G5 K Q" w
. Y9 Q- _! j3 H% L这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
# @: A4 B6 X, |+ [$ B' l. x' M+ H5 O& N- N+ A8 o' R3 ?
7 U% @0 [! v% ?, N+ y5 s
import numpy as np
& c' p& z8 W/ c& k6 @import matplotlib.pyplot as plt
6 k. i( ~+ y8 J Ofrom sklearn.ensemble import IsolationForest
. F9 F$ B% `( B8 R( h& ~
9 b" i1 r# O7 G: y$ M$ g9 V! g/ C0 c% I5 v2 a
rng = np.random.RandomState(42)# e- L! V6 w8 X7 k8 q$ _- A2 l2 @6 b
' |# I& u' h2 a9 z: r1 s- s, G
5 }$ L& o; u% H) M# t
# Generate train data; x2 g4 R: G! w9 w: p3 L+ q$ m3 ^2 h
X = 0.3 * rng.randn(100, 2)+ Q# B" A. z6 R8 T% E
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
+ T" ?( r* S9 [. P- J# Generate some regular novel observations
4 t+ P1 c( W, {& ?: d% dX = 0.3 * rng.randn(20, 2)
' F% b, j2 D5 e. V# dX_test = np.r_[X + 1, X - 3, X - 5, X + 6]4 Y2 q' w- @) Y7 c' b
# Generate some abnormal novel observations
- H" t9 n) q+ q+ gX_outliers = rng.uniform(low=-8, high=8, size=(20, 2)); F6 d! z8 n. z( Y) z
$ Q% a/ C; U; Y7 j0 Y7 O r( O" M! r5 U( {: H l( _
# fit the model
, B/ d9 c, `7 ~clf = IsolationForest(max_samples=100*2, random_state=rng)
* t8 V/ R. F# C2 h; c7 P' Dclf.fit(X_train)
8 p9 \+ w) N/ t7 K: E* sy_pred_train = clf.predict(X_train) e5 t* E; f8 a! s1 @, q9 y
y_pred_test = clf.predict(X_test)* u7 J3 ?9 g4 E3 C# B9 T' R
y_pred_outliers = clf.predict(X_outliers)
# Q7 a7 A% d- r3 c5 K6 z* L6 _/ k- W* X3 j/ C3 A( F3 r3 F
% r& Q; f1 N" U- b) w% y& C( i1 P
# plot the line, the samples, and the nearest vectors to the plane
( m, ]8 `5 ^* K {, Q5 R% j3 Hxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))% Y k& t9 |- }' |
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
9 U3 g' n8 R4 C; YZ = Z.reshape(xx.shape)
" r$ q3 u" k! K5 f' ?/ @6 M: t
, c3 I1 C2 [2 Y( t3 s- ^) I+ i8 a
plt.title("IsolationForest")
9 ^1 s" d0 w& w' w9 \plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
& r( {( t/ X% A) n" s1 q5 ^4 ]5 j0 C8 _2 j
% O8 ~% V5 a3 db1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')- ?1 e2 }/ ~$ _( Y+ ?$ |
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
% G2 v' j- P t+ C3 hc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
% R3 D& ^, X2 ? l: V0 S9 aplt.axis('tight')
' }, i4 z6 E. I6 L; l% oplt.xlim((-8, 8))! W. _/ E; l a( A! j
plt.ylim((-8, 8))# S8 f4 D+ E: Q1 U2 {
plt.legend([b1, b2, c],/ m. b7 ]7 L6 W- T
["training observations",' D: Y* m) o e/ b0 Y; \2 J
"new regular observations", "new abnormal observations"],+ W, S# B% q) P: v9 O+ q
loc="upper left")
! m' d+ M- n5 hplt.show()
. b6 ?% A$ n* {& ~8 Q: d) D S1
5 p% ~% T- O' v H" q+ J2
' Q- l7 w8 Q9 k8 F3
5 L* }7 ], E; C( b0 k+ T48 @0 {+ s" F5 H7 \0 k
5
# y4 y" `$ U& D67 A; S, B6 P+ C) z4 A
7
$ ?7 [# W. Q1 L6 V8
+ R6 E9 \& I3 K a) A9
! S4 {; e; m3 r8 `' ?9 d10: z+ \" g6 G/ B8 ?
11
0 x0 A3 M% v: t& Q- X2 p T12
# _: ]8 a6 y1 g* o4 P# i e13
\# J; a% J8 e3 K, @, s6 L6 K+ b) i14" U7 p3 N4 {0 Y
158 [$ ]* I3 ^: v* }! o
167 y( m& y6 p P( J! u. O
174 X4 T' Q( x. g0 \- n
185 m7 X6 O! m+ Q: Z$ R, V' w
19
9 I% n9 |6 s7 _- y% r! r8 G20
5 p( }2 b$ X7 G( }21
8 k" a3 U m7 Y" s5 O Q. Q22
1 H7 G6 E, H- t' ^8 g: I: y ], o8 X23
+ g9 ]6 j: w# l$ D" X24$ |# p5 S2 @5 B/ \) x
25* H9 u: V' E7 Y/ U
26
$ C& s6 t' D# H4 C/ |; k27
) e0 d8 x1 O6 o* p; r' Q; Z282 W' x. x7 K, g( }
29
) {# z/ D1 g" Z) U+ l r" @5 H30& Z3 w: L! f" U( M! W
316 B/ X/ }# ~1 M$ Y" ` r/ n
32* }3 a% r& m! }! X
33
2 s9 U2 z( B7 L# A8 {9 {34
3 m, U v. X H7 h' D3 I2 _) U* q35
( a6 W/ F. t0 e& D" {3 h) |; x36
/ J) O1 P' @3 B37
# q5 X2 }) l' L' Z f2 Q. U( Q38
+ \0 J) e3 j' z, }39
2 y( C9 E T. j3 S# o40/ v$ Z/ {! K( y2 x' |" R
41
+ p" f, F6 G7 F* t# K9 Z3 S
7 h% z* ?2 [' ?: O
; v' Z- B( j- P0 H————————————————% ^ K- ]# s/ w4 c3 M
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 l5 j- P& ]4 }3 t! U0 q# Y: f, X9 O原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
( X) K( d3 J4 N4 Z5 K
3 `" M7 C0 [& e5 `- K/ |5 F4 Z. [5 W$ B
|
zan
|