在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564460 点 威望 12 点 阅读权限 255 积分 174561 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
1 N5 k$ c6 I& }- b$ S; ? Z( @( T, Z- a 数学建模:异常检测算法 + F/ T* `" w/ S6 L
一、简介 – 关于异常检测 # ]5 e0 O/ p5 Q4 q2 k
异常检测(outlier detection)在以下场景:
# `) e4 y1 K. J4 v% y# W1 I ( W6 e P8 ^; d9 G3 }8 q0 w2 t4 }
! B! f9 I9 q- ~; J: @$ l 数据预处理
* u, F# s9 t7 S" B% S+ J5 o 病毒木马检测
. o8 j# \6 a7 ?; x* @! q 工业制造产品检测
7 ~5 W; p2 Q% s( ~- b, r7 Y- ] 网络流量检测 ) k$ T. ^3 U7 C& h
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为: / T% B5 g3 _4 c2 }
& e% S0 b. t0 i! ], u B
6 ^, j# |" o9 C+ i8 T' B7 b
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
% e. e6 |+ l% R. p# p p5 s) \% B1 R/ v& x" T
5 w! h* y7 T; M: \/ k 以下是异常检测和监督学习相关算法的适用范围:
9 E9 J5 _% z+ B, e7 }; p( p( v # y' L+ f: q( ]. i0 |. [% y. u
* c6 N4 s: R4 s) }6 G- M 异常检测
: O$ X# m( r8 A/ D. H2 X4 s+ l 信用卡诈骗
' S* d2 L5 W$ i4 G) z/ L 制造业产品异常检
# t- K$ f p% n- d0 @0 H 数据中心机器异常检
- I4 k0 r8 B* q 入侵检测 / e( X4 V6 a! e9 b& L
监督学习
. O8 o" }' n4 y0 f 垃圾邮件识别 " _' y" F; c |- w6 n
新闻分类 / A, z. z# |, w2 |* c' g
二、异常检测算法
3 Q7 `* B1 }7 a+ ~. _: h8 [, J 9 h% {& _* I* f1 y" a5 _& a( M
5 l7 c* L# V* }, { % C9 [+ |& s+ d$ o9 _) n
; g0 X1 t7 S2 l/ a" p( P F " s. g' s! c* T+ |! y" g
5 l0 I2 {; B. s& o. S1 Y' H import tushare & q- z8 f( H- |& B- G) y
from matplotlib import pyplot as plt , Z, Z/ {& P9 C( S! \2 P; U
9 c( a! K8 Z% k- w6 f df = tushare.get_hist_data("600680")
) o0 I0 g( n) S! O: _6 ]5 t' d v = df[-90: ].volume
% Q6 x+ A9 a2 k6 j1 c v.plot("kde") $ z$ ?5 S0 J- P! P( @% T
plt.show()
) b! S, v& {# X! j" R. V 1
) T+ p* F! H1 }- q 2
0 G9 Z1 C1 w4 _, I k 3 9 E8 l/ H& P2 b8 I& ]* d8 h( q
4 ) y3 u& x# A% d- k4 O
5
! r$ {/ i) s( ^; x y 6
. ?" A N) h) S3 ?4 @8 b 7 8 q' A. t7 R& h, R
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
. `! |1 \2 O2 ~! \( h . s0 T8 R: J" N* x1 \$ o: I& S
- k3 M8 w I6 N4 e% s2 E' k# Z
. W! B1 z2 Y( Q$ _
5 ^ f9 { T' H+ K
7 i! w0 V3 V; M4 B1 r& i+ h, Q + S V2 E9 }2 s' P2 \
* B# ^# w1 p$ u9 w$ h. s9 s + M/ L! W- X- x3 e1 @
2. 箱线图分析 / S- v v' X' }6 M) W
import tushare - v/ e3 j4 Y* Y3 M0 O
from matplotlib import pyplot as plt 5 q$ x O4 W& O; A# o9 u2 `
) |( Z1 h# k+ ]; F0 T0 F; a df = tushare.get_hist_data("600680")
" W5 K7 {1 A/ A# j2 k3 u) A, L( X v = df[-90: ].volume # g" o, B: q6 C
v.plot("kde")
}$ L+ L- }/ x/ k plt.show() + J1 ^/ e- y; F% |! o. f
1
- M1 y9 g' d& ^$ a) C* n 2
; L% n* `$ D2 D/ \1 v2 V( [' [7 p 3
% Q6 k3 {# x5 Q6 K 4
2 A# z7 _# e4 E" |, q. G. J5 u4 R 5
[: h4 R9 J& @! a5 _- l, o! |; u k 6 ! x1 G5 @+ w+ T
7
f8 C4 W) ~! i; H) r Q% @# v! h+ C u1 u
7 t$ A: K, P; @. p# B, M# Q% R 大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
0 K# S9 Q+ ^2 X# r
' i4 d/ F4 w: x7 t$ B2 c; }& f $ z, z9 ?5 }. P$ ~5 x
3. 基于距离/密度
: Q5 j6 e$ Q& B 典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
) ?+ s/ {# }' m
- a0 F. i8 m) K& T: b
6 l; z+ d T* ?- _% K) ] 用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
; r$ E% m, u& z) [: M
9 z/ x( F( I$ W! w
0 m9 f2 H9 u F- t6 F1 w/ `
# ]3 n8 {+ Z! ]$ N8 O) l" K3 k % ~ M$ ^( o. ~9 }) G* X; k$ P7 V. ?
i6 p8 N- L8 {* s" U2 t% Y: ]. W( }
" }; Y+ b7 C/ i8 t% ~( v 3 E% I3 `8 I/ G- H
' G- C+ I/ |9 G1 O: M0 p
4. 基于划分思想
# @( K( t X& i 典型的算法是 “孤立森林,Isolation Forest”,其思想是: H4 ^3 L6 N; d
% O9 ?# R7 Q) `! m* _( \( ~ x * Y$ P# D$ m0 x; f
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
5 g; _3 Z+ ~7 F4 U y) f5 X \4 P' _; O* Z/ @/ M( S0 F$ F
! t0 v3 s: |9 |6 j) c4 ^" V/ _& g 这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
+ ^8 ?8 [" D% o4 y - e! X# w( D9 L+ K B
9 u/ G# E0 h5 W8 ?, V5 l
import numpy as np ( {; _4 ]7 u* D4 G$ c+ i% N) Y# y
import matplotlib.pyplot as plt
5 T6 D$ ~7 \1 A3 }* Q4 I( N" a from sklearn.ensemble import IsolationForest
) _* t) f1 S# W4 ]' k% z ! c/ [! Q ~, D1 n0 P
/ n; c: y! B9 }% J" p rng = np.random.RandomState(42) $ E' t: w3 G7 ?
9 ~9 j! l( S, v+ Y% v+ u
( Y0 k+ }8 d4 f3 {/ Z # Generate train data - p2 ?0 p5 L# U8 q5 x! D5 {/ n
X = 0.3 * rng.randn(100, 2)
5 d9 U$ V* ?% y2 ~: @) I. C X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
, r9 j! X! j9 C9 V # Generate some regular novel observations " |1 g) a B# ]+ ^. g& U( N; j& T
X = 0.3 * rng.randn(20, 2)
, g1 W3 l! p1 V8 ~ H* L X_test = np.r_[X + 1, X - 3, X - 5, X + 6] 7 w# h1 O- i1 W* }6 y! q
# Generate some abnormal novel observations
. ]% p7 y( y& k X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
' M3 p+ u g/ x5 j# V( B7 Y w5 G
: }0 E0 t& ~3 c6 r4 Q9 Q
* d% H, B/ @! ]2 X. h1 o, J # fit the model
8 h/ | a6 s' s clf = IsolationForest(max_samples=100*2, random_state=rng) ; D- D3 e- ?' C# t. M4 c
clf.fit(X_train)
4 Q( M' r: I2 ]$ U y_pred_train = clf.predict(X_train) " M$ r4 |$ F4 p; k l
y_pred_test = clf.predict(X_test)
G ]) I0 @5 {: T y_pred_outliers = clf.predict(X_outliers) 7 p' e3 i Q0 d
, u, e2 g0 K% ^- Z2 t% h
$ F7 ?9 \" F \ # plot the line, the samples, and the nearest vectors to the plane / O2 [! q. M( i* ]* w
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50)) & t( ^6 m' o& O6 \ f
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) + W! A" ^* R# C! }& ]/ O( O
Z = Z.reshape(xx.shape) 2 r! e; ^% h( j+ Q' U f
2 v! o) g( r/ O # q! ]% n- _) `& l8 l8 Z
plt.title("IsolationForest")
+ [1 ^0 m3 A5 J plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
) z8 \. j S$ `$ \/ q 8 `( _0 G6 A" P+ @
8 X4 f D$ q8 r$ T9 F0 @ b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
% l4 E1 D5 B! y- i% [* p b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green') $ f/ q# a/ H% X; v+ q( ?
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
7 z6 }: |* W: X plt.axis('tight') / e }' l2 p/ w1 p
plt.xlim((-8, 8)) / l% k% D8 B& N# J2 g6 o' \' i
plt.ylim((-8, 8)) 5 Q1 f1 m4 ]) g; ^- Y x* M
plt.legend([b1, b2, c], " i! y* e) t* P, \) s0 A e0 o
["training observations",
* M6 r/ ]1 l! ^ "new regular observations", "new abnormal observations"], - ~2 F) M- U' D' D
loc="upper left") ( T' R+ s1 f4 O0 D1 H4 z* L2 ~
plt.show()
6 Z! U- c, U1 r; s 1 - h4 Z2 d8 z. l4 R% Y# w
2
i C+ h) Y' I' X" j9 A 3
* Z8 z2 M s9 B+ i/ ?- x 4
+ _0 H V! r: @% [* Z 5 + B* M2 A5 L5 a4 e) g: p% u
6
9 p2 X1 `& i& D! c# ` 7
, X4 Q* O# Q% ?4 }! z w 8
5 i* ~# N$ c+ @ 9
5 |) z! x: |0 E* |! n1 h 10
, `3 T! [4 G9 E( O0 O3 ?: K8 u 11
) u" W* m9 u/ q4 O a' a2 }0 O 12
1 ?1 T4 ]- t8 ^' k& c- q 13
' s# @) r/ M/ U0 z0 q 14
/ A7 R4 r& i' c, B 15
* Z+ T$ l& a* A2 `5 r$ F 16 # u9 L- Z/ M$ e0 d
17
. f! s1 r; Z% |% S v8 b. } 18
# K: P7 O6 ]) p# p; A1 F 19 2 d3 Q' C5 ?+ d, _9 R. k
20 7 `3 u) I! w5 o1 A4 p
21
; s* h7 w! L4 W' J4 z. G 22 ; [5 h: W9 o3 V" W7 d" v( O& m
23 3 C0 ^$ h6 J3 i8 {& O
24 % A A' n7 v! h/ Y, e
25 2 J1 D2 v6 w6 ]+ ?* A3 j: F
26
9 I4 |. h. O. v I, _ 27
$ o' c. y8 `& K 28 ( S3 M' K0 R3 G. k. R
29 ' M6 f; Y" j! J3 W# B$ d# Y
30 * W1 w, t/ Z! t4 P& x& i# ^4 h# B
31 0 H. O: m+ ?+ o8 `& R0 n* q
32
# V3 ^4 \. e6 C) d6 ?4 I, K' I 33 ; y) `' F7 U. y7 Q& s2 P4 i0 X
34 * y% \% f) Y% r- V6 |+ f( n& ^
35 ) A! m; ^" |0 o0 q5 E
36
" L* d5 x" ^' w( g% i 37
; R" }/ _) D, F" g, i* s; C 38 6 \$ k$ U. ]( L% f1 J
39
. Y L- G8 G0 C, R- D 40 $ @4 v2 g* F' c- d, e
41
: n* v; I# l8 M
) n7 ?6 K, {' O0 Q5 Z9 q0 X+ ~
( M, C" N W4 g+ N ———————————————— ! _0 {. z3 X2 e
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 $ U O' C2 v# a( x/ f! C
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
) C m+ a1 E; P# M' _3 a
8 _2 ]7 G* v6 I& _; `2 d9 V h + D2 G' |# c, S# f& L) z
zan