- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565670 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174924
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
9 |. L* H6 O& ^
数学建模:异常检测算法
& L2 w5 g" a: }4 K: |- N6 a一、简介 – 关于异常检测" l4 @# g+ }9 ~$ f/ t
异常检测(outlier detection)在以下场景: }$ O0 n, J7 p# n
/ o/ r$ H' |" i, @# T" S
$ t, t3 b6 v3 i. U3 t数据预处理
* a* ]8 _4 U/ l# E. H, X& p \病毒木马检测
. a9 ~: Q) V) U, j: h; N" {工业制造产品检测
1 t4 H" @& e+ m$ z4 f- j6 V网络流量检测$ Z1 g/ v- I$ F$ ^4 l* B' U
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:* [: d0 t ~6 ?
$ u" a; f+ e& V; Z* K4 J0 f8 G& ~: L3 M2 I( T n+ ~# O" |$ }6 r
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。0 ]% r6 @! F5 R8 s* {. o; P4 B
6 ~" l: A: O, w* P7 z( g
. b W$ n( I8 ?) a& L) O以下是异常检测和监督学习相关算法的适用范围:
, M8 r$ i& z8 b9 p4 ^) b( C- }! H% L8 ?% I1 y" X% O
; F: x" d8 l: S2 j异常检测- D1 x4 ]+ p; p' _5 W4 A
信用卡诈骗 a% u* t# D" }
制造业产品异常检
( W$ U; h1 [8 Y' d4 ^ J数据中心机器异常检$ k% C6 }* g& K$ l; Z& J/ Q
入侵检测. `% a/ [) Y1 N x/ |0 |* I
监督学习
/ ^9 B+ I( o6 d' H$ a7 a7 t垃圾邮件识别) C* E6 W% Y, m
新闻分类& x) I4 H4 f6 e* }( p, B
二、异常检测算法
/ p# ]$ x; J4 ]/ G; m. `7 O- Y) E+ q; r3 [! \* k: g
4 y+ Y' i1 b# y
' o5 f' S. Q* j6 ?
" V2 F) _9 @+ n& A, ^& W: p
% o: X# t# [/ z8 f1 {
' E* s6 ^3 P5 ?7 Eimport tushare
t( Z( ~) J9 @) \; @# r% ifrom matplotlib import pyplot as plt# A$ F! s) m% @- \! }
+ i& D' d9 g: [2 pdf = tushare.get_hist_data("600680")
4 x9 W2 f( o1 o. `% ]v = df[-90: ].volume. y! O& v0 @. U$ V0 f1 f4 s# F
v.plot("kde")
6 Y4 C% P# B, dplt.show()4 d2 R& E7 U& [: Q; b9 Q( ?
1
! p: d7 Y2 i3 u29 l# f' k$ s% x5 Y$ s6 d3 ^
3
. x/ a# X9 E2 ^5 I& b7 i, d4" N" z8 U( M: L7 {* p: T1 [+ O
5
8 h5 h$ {) b& f6
+ t) X5 l6 d! t/ ]( _# H0 ]7
) y% S# P2 X L! F7 |0 ?2 q近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)' F$ G; f- a/ G7 H% h1 ^' J/ Q# B
' \1 q( b' r$ K2 R r O3 W. q
1 N) q7 Q) a8 N8 o
! Q. M. d: y5 c1 i9 g. Y/ V$ {
) L1 S% U, H) w, p8 g5 J# \9 B# X0 ]. G
* a' _. `9 M/ D4 `5 X* N& w( Q" c/ T+ g3 H. d
5 q U) ?( m I5 ?4 q) c" J. q1 m2. 箱线图分析- J5 k) d" f( b- F; ~
import tushare
% O3 e5 @2 p+ Bfrom matplotlib import pyplot as plt
* K2 s, I3 K `' D( _
4 j' G5 Q( k E- f) @df = tushare.get_hist_data("600680")
% k3 \! q. Y; r* I. U. h: A( I6 ]v = df[-90: ].volume7 u, E7 p6 v& l" c4 a3 x9 `
v.plot("kde")5 q ~9 |' r" x" A2 ]0 }5 Z. C
plt.show()
' ^' \3 E! f* C- w1% I! n6 k4 a) B: A$ a' @, L% w
2
! n8 K' s% _$ S$ _8 `8 ]3# T/ M1 x9 g' n- ]- ]
4
# m9 i4 M$ H% \5
! T9 K4 V; Q- ^* B* d& r# G6 U2 _4 V( E2 v9 f+ N) o1 B
78 {" C0 u/ e2 ?. @: ]
+ W0 g' y7 |2 Y# X
8 f' e; O1 i* k& L7 Y$ M4 l大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!$ V, I2 R, e$ f) k* F
) b+ S$ h6 P: v& E# L
1 h @ d& j# j7 s/ ]5 a. }3. 基于距离/密度/ m( O* Y* Q0 s* X% ` I
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
: j+ x% x; s4 t/ h6 b
- _/ [9 ^% B) R- {+ q- v7 C, l2 q# ~7 ~
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
6 b; } e4 \7 n/ A$ m# `9 f" c+ g# b8 ^) l0 M* ]( i( M6 i
# j/ Y) N; Y, c* {8 L, S/ ~! Q) m- V! A' q! @' I6 i. d/ v, W
- Y# p; g6 @8 t1 w2 g' y2 i
; T+ D* m& @( a
# a& a! {- b7 D. v% s5 ^9 P2 k1 X+ a* T8 H1 E) ?% D$ T0 f; h
( E7 k/ V- H5 q7 F. [4. 基于划分思想
6 j! g2 A7 O/ P1 O) B8 e3 p典型的算法是 “孤立森林,Isolation Forest”,其思想是:
' v2 w/ D; ]# M" z8 u, g$ E- z) n
8 T; l: n) o3 |$ _7 ?) l4 |; P) c: k* ~) h0 \
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。# `, _1 p) [' B q
0 }1 l) \0 f. s% A6 `& }9 w) ?/ R9 g V2 D( ]+ P( _
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
* H% ?$ }7 M. l+ S" G/ Z* K. z0 s; c$ Q6 |3 @* V2 w* i( Z6 }
( [- m5 p. H$ B% l( l
import numpy as np
! Q+ j7 B& d1 ~import matplotlib.pyplot as plt. ~% D; m% y8 q9 P
from sklearn.ensemble import IsolationForest: z7 {* h& M- B' x0 K, v7 |
0 s& v) U& b) H9 t4 `
- ~% N, B: ] _/ g) c9 b2 Srng = np.random.RandomState(42)
3 a* |, Q9 t: U: e/ g' Y# g% g/ y
1 d3 B7 N: E3 C6 C
/ t" p! A1 N% y7 A1 ?) f# Generate train data- M4 Q# M6 n9 U. U: i3 p
X = 0.3 * rng.randn(100, 2)
9 a- z8 P- C# G4 jX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
- h! N( R; M% j# Generate some regular novel observations+ w; ^0 w1 t2 U1 d$ Z5 B3 x1 Q& Q8 P
X = 0.3 * rng.randn(20, 2)% q2 k9 X7 p# h. U% y* _
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]" ^( R1 N+ s+ _; I# i* Z
# Generate some abnormal novel observations
4 I% d. b h, `4 mX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))- A! Y7 i1 I" b5 Z- Z! \- g: ?' v3 T
, g1 ?; K7 R+ r2 Y% T- P
2 N! }" ?( H/ ~; g# fit the model
) _" l* H9 x7 o9 n ^# g! tclf = IsolationForest(max_samples=100*2, random_state=rng)+ ]/ u3 G# m8 n3 w: l- f8 ]+ V
clf.fit(X_train)
6 [! f5 [9 H! z* K- `* R! Gy_pred_train = clf.predict(X_train)
- }! \1 c" C+ T. ?1 X( Oy_pred_test = clf.predict(X_test)$ D; f k1 ^- G; A6 S+ I: u' D
y_pred_outliers = clf.predict(X_outliers)( x9 P! c% Q4 k# }1 |
5 c \& W2 Z, @ b% `# v- L4 a+ M1 C4 g
# plot the line, the samples, and the nearest vectors to the plane
9 ?: G3 S4 ^' [/ J. I- R; ~xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))* e5 Z( p5 C6 s1 Z1 t: B# B, f
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
) e7 b& x* R5 e+ FZ = Z.reshape(xx.shape)3 _7 K/ f8 r& @% K p
0 w1 p" N( [# g* E4 }* X' U
- V- f2 \! K# Vplt.title("IsolationForest")
- Z6 i$ y4 @& O( Q$ uplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)7 y3 C& I: f/ E1 j" e6 r
) m( Q2 z0 u. }5 O0 [9 X' t2 f4 b4 `0 \! l
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
. J: P$ e& O+ v/ _* }4 o9 y5 Hb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
% W* v7 l, } sc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
* U) a, N" g9 f/ \' f1 N8 Pplt.axis('tight')
- C M0 P' Z9 Tplt.xlim((-8, 8))/ Z, L1 Y% {' X! n. Q+ D. M0 m: ~
plt.ylim((-8, 8))
% R7 q0 x+ R) u/ F5 Aplt.legend([b1, b2, c],
% l$ v' M. `8 U: O1 J* I ["training observations",
' P ^5 w9 k. R: U9 [ "new regular observations", "new abnormal observations"],
# ~' R( f- g' b: P loc="upper left")* c7 z3 b! n6 \! o% t8 J
plt.show()" M. [' R% _& I# z" U+ `/ `
1
* o$ D3 R' R$ e/ O/ L2) n7 K2 L! u6 ~$ N
3
# W1 l* r5 a; D! y9 z. L& L, ~5 [. i4
' N6 a* l( A3 b5
* m( c) k6 U- i' h0 P6
8 _% i3 }/ @5 X7
. c9 O/ @" M/ W: d82 N+ g' a8 _: }) Y
95 ^, Q' E8 h; `6 `2 M6 }: G. l
104 M" z/ h- t7 P9 O$ {+ O( y7 ?# ~
118 t4 v+ y* f2 B( F' ]2 u
12
& ~/ X9 M# s7 o% ^: T4 e0 P$ w/ v13! k2 Y# Y0 ?6 l/ ^% _# v- _$ G! B: {
14
1 N5 I5 k1 U; t' U" t4 y4 b: n15# J3 y/ H+ E/ M) s) c
16
0 ?0 t8 o+ w7 k- L; S17
! s6 o) Y" ^7 B' Y18
3 K8 q- }( S B) i19
0 f5 H; y" H% A200 q: h0 ]5 e, F3 L% ]
21- D% r9 U" k* R% g
223 e2 [' u e9 q# P0 `" B* |3 ]
23+ Y: K Y- a& @6 T4 y% l% Q
24
! j8 n1 m& `6 P! b; S25
+ ^( B4 I8 m0 N2 D" ` ^; E26! H7 B c; z+ p* w/ v/ {" f
27
- f6 r6 Y4 L( T9 n3 \' g6 t! ~: H28
( ?" C7 r1 Q: F29
& i. D& d. g4 v4 {& K30' n9 s: Q1 h/ z5 z# y& i5 ~
31
6 }, p J! q8 z+ g* `6 n320 b0 z; J( f5 V0 m
33! e6 V# j2 V* Q" Y
34
, q: N. R4 B/ z }) H: d: l5 K3 d35
3 M5 d& M; E5 _. Q" M# \& p+ T365 T; K" x. `+ |- p4 `7 L. b, w
37
& @! }2 a! h- g5 r3 y0 t% v3 } W38
; q8 O7 u+ | o" X/ C6 @39
2 L2 x; l Q2 r9 a8 G% G40" H* N X$ d- Q, l: t
41
3 [8 F& t* g/ Y5 p( t& |
+ @+ k& e* m* u) z# z
, E, v8 I" K& S————————————————, i$ V' G: B4 @# r- H& `6 r
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 c& |8 s) i8 ~+ b1 o1 f
原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231293 c2 m2 i7 n0 u/ k& |
" E6 Q) n( t# q: n& y& m
% \7 g9 U" Z' z0 b2 r2 g |
zan
|