- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565718 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174938
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
& V$ P5 N9 m5 N( S _数学建模:异常检测算法
& ]( c9 Y* y$ {' m, E一、简介 – 关于异常检测% }* P. v2 K: ?) a* l# K
异常检测(outlier detection)在以下场景:
& x' \6 B# n* ^/ N0 W0 ~3 K6 }# I: ~7 s5 l" s2 A
7 ?4 R0 |# i0 Z- [, Y p数据预处理- J5 z4 V/ X& V$ g) a) l! ~ S
病毒木马检测3 P7 i6 E; w. n/ h. @ d5 R$ R0 X
工业制造产品检测
4 {9 A8 G7 b3 ], i1 w) l' z C) W+ r网络流量检测
9 ^, ]$ f3 _1 k4 F( Z等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
+ v+ \0 e j# R, Y4 V& g0 r! Q* r) [( V& @$ F5 ?8 P3 G: E
5 ^, Z( N% M- H E5 q1 O6 U监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
. I' h2 Q. p* D3 a; a
6 \) n* K6 R; ]' y3 l0 o: I6 X- ^$ Y7 Y5 p ~0 c# W
以下是异常检测和监督学习相关算法的适用范围:3 a- \# C' k5 _$ ~1 S; E; y" Y
6 @% F0 p" x5 z4 I
, H j9 u: m2 M; `: z异常检测
3 T3 z3 z5 a$ t" p* u信用卡诈骗4 d9 |/ H6 J" u' D" C# [
制造业产品异常检: }' w! w n/ e0 K5 a5 t' b. O6 A& l
数据中心机器异常检
. `7 _! @7 b# i/ z. k6 D4 x入侵检测
* j, g1 j# F, j& q监督学习! b0 q7 ?! `! K
垃圾邮件识别
* a' e0 }* D+ f9 c& k新闻分类
2 E' F9 y% J5 H @6 N2 y二、异常检测算法
8 }# c" N2 G4 w' |- ^
4 {+ A1 F5 W8 z# b6 U* r/ U+ g
4 W1 \3 d( i4 I1 B, ?5 @
2 q0 j0 l8 i1 w9 s( j/ I& F2 K1 f1 ~0 }0 p; @3 r3 q4 O: D
* V. N) @7 ^, p$ i' q% [7 m3 `# m- Y8 B8 v1 t
import tushare" n- b ~- q- N0 O; G! `
from matplotlib import pyplot as plt1 a. M9 h [* H% j
1 J" c) p, Y' f+ o5 Y/ R
df = tushare.get_hist_data("600680")
$ ]5 U9 ]0 q. f$ w1 E$ sv = df[-90: ].volume
5 Q8 A; ^' ?: p1 a$ r# iv.plot("kde")
, x9 G% F# Z, @* Nplt.show()
9 m" A' `; i6 y' M% z1 ]1
$ E/ C6 e$ W. e; u9 \ |2
9 ]3 V) S4 E( p, L! U! E5 g3+ u, d! ~. e# o
4
1 A4 P6 [2 j+ b8 A' W9 C" @5
2 o+ c/ I# [! ^8 D( Y65 ~" u0 \" S' w5 g; e9 [
7
3 M; a' W0 m) A- [近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 O# F' ^9 M! s
0 C% V( e, M/ p d$ F
6 R1 h4 a1 C N+ D; M" I4 @
& j" _* j9 l5 o" T" k% D7 [% W2 q
% h0 F5 D, U* M0 }0 p: [% n% ^4 l9 l* d q
$ G& J* d2 w/ ?- i( R8 E% f# X, F* J
2. 箱线图分析. _' \; ^7 y( E) K! a6 W
import tushare
- ^# S" f5 I% I, i6 X/ ufrom matplotlib import pyplot as plt, U+ N. j6 z& B6 y3 [% y$ B
' S8 u7 q; k/ p2 C; J" Tdf = tushare.get_hist_data("600680")
( F' Y/ h9 X! u: k$ rv = df[-90: ].volume
2 J7 s9 w# b: ] dv.plot("kde")# n, I9 \+ o2 o2 f2 R
plt.show()
) ^# Z) x1 c; T% n1
' f- h, r1 z8 x4 Q; t4 F0 L6 u2
5 V* D9 w' w. y8 C3
2 J* X* L y( D+ ~" g5 ^0 ~! F4
! J6 T7 w$ z# q! X, g0 }; K5
8 o( @# A9 u9 h: c# R# d8 _$ `61 D$ g5 a+ a. L) e
7: c3 I) d+ |" d X- o
9 f2 w# v9 s4 i: i
% p" P- K H2 _# a大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!) { H+ h. B: J7 o" M
- l* |, c5 D4 G1 c+ S& u
# l0 d9 c% ?$ C& y* A
3. 基于距离/密度
# v4 P! K: K' ?4 x0 D* Z( }# D典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。! \/ \. E) G& i% p( \6 }( x
! @; z, p: B( H4 N3 D; \4 l
4 h5 L" g& l+ E" h2 B; U; U用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
. }3 R) h2 E9 v
, a: D% _4 q$ N; A* `
2 A7 {# x. Y2 ~* x
& F6 x& {; ? t1 T* y3 z. B4 `( s5 R2 u1 x1 G) _ Q' H& W
) J. ]; W5 l; k( O Q
: n$ ~$ [' m, ]& B: `1 @
- @# A9 X0 y6 ]% Z
3 ?1 W& Z# o( s) w4 i1 Z# B& x4 B
4. 基于划分思想0 i' E: C. O8 C9 U |5 k
典型的算法是 “孤立森林,Isolation Forest”,其思想是:* j: |* Q$ x4 a3 j X
9 H0 a5 U# W' ~' Q5 p3 u
3 z! j9 ^+ c/ t, j; E
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
+ X: s l6 x: I& B0 X# Z$ S) t I d1 Z7 j0 I4 ?
4 s1 {0 E( S7 d
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:$ @% w* P) B: x8 _2 S7 w) M- }
% H* g1 h4 {6 T8 r5 Q3 n& w j: s) S/ i3 W" ^: o7 y! b
import numpy as np- [* ?3 q) O& k( ?: y3 B. _" c
import matplotlib.pyplot as plt
# g/ A4 I- G3 K5 H% ?2 y6 Xfrom sklearn.ensemble import IsolationForest
4 n1 h! t, y! W' a# A" @! L5 w* Z2 t
3 V# x+ T7 H0 w, ~# ]$ L3 q
rng = np.random.RandomState(42)
4 J$ k `, N. K$ c; d& ]
2 n" g9 P8 E( t E
( a Q& T& U$ o: D1 g# Generate train data/ C7 F% p! H; Z$ H- v
X = 0.3 * rng.randn(100, 2)5 Q3 S V# T+ H
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
: C$ d$ g( _3 M4 ~# T* R# Generate some regular novel observations/ J( Q$ |4 O$ `2 g: i7 o
X = 0.3 * rng.randn(20, 2)4 a( g- s9 G9 M* N2 D: `8 u4 z
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]- [1 i' j/ ]5 v. Z% H6 Z
# Generate some abnormal novel observations1 r9 A7 P$ x: e+ g) _5 l6 c
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
y: O* J. y9 z: F) D2 a. i" V" R# a$ B1 A0 m& X4 a' n
& t7 Q9 W! m, u( o# fit the model" s2 p. E7 A! l- H
clf = IsolationForest(max_samples=100*2, random_state=rng)
. Q# v( k5 w: {$ Jclf.fit(X_train)+ ^6 [- ]* ` \' A
y_pred_train = clf.predict(X_train)' A( r9 t; e8 [
y_pred_test = clf.predict(X_test) a8 g5 [/ m, N# Q7 E. {
y_pred_outliers = clf.predict(X_outliers)8 P, }6 u/ K R* o
" w5 j( \0 b( Q& P+ t: X" U' }3 Z" c3 @
# plot the line, the samples, and the nearest vectors to the plane! z6 e1 R+ \6 c- @+ Q* H9 w1 y
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))# H+ Z% C4 r7 _. r, D$ K& h
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
. A$ f& v( c' F& i$ iZ = Z.reshape(xx.shape). W8 G) B0 M+ x9 T5 M
% E8 S5 v6 I% \% p
/ |8 ?% D( G4 D8 C5 g1 [# xplt.title("IsolationForest")/ {" @0 x8 N, Y
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
9 @3 [6 m1 u! z2 l+ P4 Q, h: h: ~5 t2 H, `4 O
2 A. n3 W" r$ n g8 h* M p( H
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white'). M" q: P$ f9 J9 h/ V
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
: r p0 E6 [( [c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')" v; A" W: X" \7 k
plt.axis('tight')
# S& A3 ]' Q) R" ^! g: Kplt.xlim((-8, 8))
/ ]7 i. c# s: m9 j2 a/ g5 p7 d# gplt.ylim((-8, 8))0 t4 s# h- F' f0 f9 C4 A/ ]
plt.legend([b1, b2, c],
}9 g8 {9 p4 N% { ["training observations",1 {) M' g- K3 ?9 M8 L
"new regular observations", "new abnormal observations"],! ?( ^+ U8 N/ @9 G
loc="upper left")
$ ?, F) l( C: k- hplt.show()
4 [$ ^, f& ]/ C6 D9 w+ ?5 i% o t1
8 G5 P4 d) g, r6 ~& P9 I2: x( O+ t+ Q4 D% K$ B
36 ]4 a. M: z2 B; o$ u
4( O' C; H8 e- _1 C8 X( |7 M
5
2 d! l% N/ y( }8 s5 T/ r& C% V1 y6
, E) G# r, Z3 \% z% Y4 e7% v$ [: ^' _" b9 a" `6 K
87 n$ o1 J r7 \
9) m' A# C' b+ K& ]
108 F! O" a( f6 A7 D2 `
11
) ?3 n; \; b9 Z12
) b+ F+ e' v. M# B) P13# q- m& L) S. b8 R2 L% ^
14# d' e: C1 l( G
15
( a: J! n6 u9 o7 P/ `168 U- D1 ?; U! j7 a4 }
175 E0 c. @ |. o
18/ ]6 k( o$ j; Z V8 N6 @' E
19
_1 k% R6 `2 C. z) @20
2 C& W' J" b3 `# `$ K( j$ `0 D& P21* u6 D& V- c6 q9 t/ c
22$ W' ^2 [4 K" y* v
23
2 ?5 ^( @+ |/ ]' E+ A; |' n$ p! n; X245 i1 ?1 A/ N! h/ x4 ~
25! B1 V/ c' z r
26
) r. u: d! ], h& X; Y& q0 u4 R3 U27
/ i; ] E2 T, m, U) \ b6 H6 I28
, z. s: K# w' W. V29
5 ~; i! c8 V, T30! ~1 q5 a/ z7 I
31
% [2 q" d' z" p- D) B9 P9 k32+ \! W' E. u1 T8 t
33
# O' x. k# T5 {2 c" V! v: O34
; h$ i1 U* a+ V/ n5 y35: ^, i* d. P+ n+ t0 `
36
& H8 [' i- | S) W* d! y; f37( Y1 e) v+ g+ X3 [, p; Q0 O, N* P
388 ~+ s4 Y; x+ b) H1 D1 A
39
4 o4 H9 I) \7 [+ M40: r3 ?8 [+ D" h5 A- n5 q c8 D
418 E2 M. [) v3 ]7 n
" R; m/ g0 L) `3 M
* F% G+ J) Z7 a3 e8 P
————————————————
- d, z+ d+ P% v5 ]' d6 {# L版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
! P3 N5 W, a% ^. q原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129/ m4 e+ m0 Y% c1 g2 u
1 I6 N3 t* I; n" c$ I O
7 L/ B0 k2 P% ~7 M' A- [5 F. g |
zan
|