- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565754 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174949
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
3 t- D6 J6 e% {' G5 {
数学建模:异常检测算法
. X8 J' ~+ f$ g+ d G: @一、简介 – 关于异常检测8 t( _5 q/ _# Y7 f: d5 v
异常检测(outlier detection)在以下场景: d0 ]/ t3 l2 L+ C
5 H" l! j& Y% [
2 b# |' k+ h" ]数据预处理
- m+ O! W4 n- a, E病毒木马检测: l( L+ {6 A8 [5 {
工业制造产品检测; N7 n* B* n0 u; s: E+ V: L0 z
网络流量检测2 w' b5 m* Z* ?& x U1 c8 t; r
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:* r# K$ Q3 P# Z" `) T
* Q6 n& x2 E G6 Y
+ r$ ?5 B6 ^! Y o监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
; w$ Z, }" X" s B
# @- K" ^4 M% e+ y2 w+ s+ H& \/ q
$ x; b' B9 r! Q ?以下是异常检测和监督学习相关算法的适用范围:: q; K5 b' t$ L/ @5 ?) J$ g2 Y
Y4 s1 I5 }: n. Q
3 H- p# X, W, d异常检测
% x) D0 l) z' S信用卡诈骗7 d% e7 m ~! Z- G
制造业产品异常检' s' ]3 s2 `9 H/ q9 m
数据中心机器异常检
" m# X: z. G# C" c; z/ \入侵检测
+ u w: y6 [' ~/ E" a监督学习
8 w& _( n7 {( Z: s+ O1 [垃圾邮件识别
9 v! A5 z) K8 N4 U9 ^( _8 y @新闻分类& j, o) B' \2 _5 D u" [7 J
二、异常检测算法2 e K+ N5 L6 ]& Y) V
: W8 X' b. k/ ^( k
4 u2 J: F' p; d p' ]# |# a* b4 b; a& y- J" e
% t. l6 [0 V& _; N/ a
% Q! f- f% f# A/ C9 m$ t* u
7 E6 C. r: E- K5 q1 oimport tushare
6 I2 W: a9 }) L. O. Zfrom matplotlib import pyplot as plt
! l: y: [ x1 H% ~
$ a% r; W4 B0 A- udf = tushare.get_hist_data("600680")2 t" \7 Y! p' u% ~: [2 G
v = df[-90: ].volume/ U' H: Z/ v& \# m8 k
v.plot("kde")
: a0 m/ l! R! x5 U9 X3 jplt.show()6 X; l. b$ }2 X& l( B8 b9 p
1" S; y! J5 x" f% S8 p$ L W5 L
2
: o$ H1 e" E# b3
: ~7 Y2 t2 D6 J! _' {0 u( m4
6 g6 V" _# Z7 w2 J+ `5' i/ u" z$ C1 _4 P0 U
69 g" c* }0 h# @* O& ~& Q: y, i
7' C$ f7 M# Q% H7 U
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
: p G' h0 G8 t" q: C9 x _5 _1 t1 ?
: B( R5 l9 ~6 L0 J2 ^
5 Z8 {+ q( l8 S8 Y' ]5 l$ Y6 P2 y! f4 N4 w- r( b
! c3 B5 y* L9 G% a7 K/ a& L8 S+ C
4 m% h) L( C' z, d# f3 j1 _
% Y& ^8 @" ]) k: m- _* X/ F
# k0 Y7 ~9 ~% ?* H5 s8 z k+ H" E0 l2. 箱线图分析: W/ ?8 U S z7 a" Q) M! ]
import tushare
' P$ g* c4 F( w* ^6 pfrom matplotlib import pyplot as plt3 j& E% g+ b5 T& s$ A
0 B' P! Z. c0 m' `df = tushare.get_hist_data("600680")2 y3 `% S, ? w
v = df[-90: ].volume: ?- V6 k( e1 n! }+ \
v.plot("kde")
$ [9 Z! @: D& |; _& Wplt.show()
* d* A! `/ ]8 |0 \ D3 j1/ I9 q, H0 r! u" D3 [& I$ v( }
2
: Q2 U1 F, J: g0 @, V38 n4 p+ q7 B3 b9 V/ v
4' C* g, E' w, k" T
55 Q: g4 J4 k/ V5 P) _' S% s
6
2 H5 p9 F6 p( y$ H T6 }4 U7
1 z% X2 d* k/ Z7 w/ Z: q; N7 L: _8 ~) Z S
% f5 {% T6 q+ R) S0 M: o8 _大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
# B; c* b1 ?' I7 h+ `8 s0 Z% a8 k, H4 A) O' x4 c* k
% P! K( B' I+ L- o* ]7 ~& h
3. 基于距离/密度
: {/ ~) y; J! m ]( ^. b& R: K典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
* N0 |8 I6 k6 I; [" _3 f9 a9 X) y! o, c8 k3 R
( K4 o" x7 z6 R3 l( x* w" b用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。, M, {4 M0 l: n8 K& x+ X7 u* P( R
8 u* v2 i8 p) X A: O
% t+ O9 ?& y- a: e @; `4 p' A- T, F6 D/ S7 R* w
7 v6 L+ ?4 G6 g) B
, R! ^5 {+ F- b- Z2 Z. v6 q& B
) d6 L. z6 i3 P3 `- g0 S3 K' c, m x4 s0 n! q
' P: l. V5 H8 J! }5 |8 B" ~, D
4. 基于划分思想
! H( s4 q# R. W' D2 T0 h- n典型的算法是 “孤立森林,Isolation Forest”,其思想是:
# @( U/ s" G0 {, N8 G- Q3 O+ ?! Z
, U" |2 k- m6 [; X- w4 `: r5 v
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
2 O5 s: Q6 E/ k9 z
5 m( V. N5 |4 L9 |+ b0 U( M. T" u0 u6 W
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
/ r6 a" l! ^) O0 c0 v, D
4 }) v0 \# L% W( S+ {
; y* |6 t% X) ]import numpy as np7 ?2 V- w- e: w$ {6 J k% M
import matplotlib.pyplot as plt* w9 C- u/ }% z1 E0 x
from sklearn.ensemble import IsolationForest# e2 e a' Y- Y) Q8 q7 U
6 ~" F8 k1 N# N. F# c
, S4 ? r! G: r$ c; k) @rng = np.random.RandomState(42)9 F6 s, r% y7 }1 L. b! {* l8 @
- r( t, s; _9 F# @2 h) p
3 `+ T5 K h' }0 A. ^# Generate train data
) j, X3 g( g A# |* |9 k$ e2 ?X = 0.3 * rng.randn(100, 2)
) ~: d+ D- T z CX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
- Q) u( h4 K! K7 A. q# Generate some regular novel observations8 }( T. l' E- l: g1 }( m0 d Q' P
X = 0.3 * rng.randn(20, 2)$ T# L5 j- J( _7 i* K$ l5 Y, g! `' M
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
9 k* Z: k& b) T# Generate some abnormal novel observations
5 V, H9 x# A4 R6 l: j- ~X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))2 p- L# Y. r( f
o1 o' ?# d7 v' ^/ D
( P+ q& B! }$ K* r3 U
# fit the model, R5 v' U7 v; C; I1 i3 A/ R+ c! t
clf = IsolationForest(max_samples=100*2, random_state=rng): L3 f6 p5 |5 ~& p W) u- I
clf.fit(X_train)/ a$ ]7 p9 X1 X- \1 T* ?6 ]- \7 V. T
y_pred_train = clf.predict(X_train), e3 |8 {# T. i! q6 l X. M8 B
y_pred_test = clf.predict(X_test)8 p) o6 {" v; r
y_pred_outliers = clf.predict(X_outliers)
f' u4 s& i, I. _& {; [5 E1 n* W @4 W# B1 B
6 v9 Q S" p, J) x# plot the line, the samples, and the nearest vectors to the plane: Y: p/ y; u5 X+ j
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))' e9 z( h" s' U+ q
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])$ w1 b- K. k' _- m
Z = Z.reshape(xx.shape)
! l# L3 {# Y4 J& K* p) m
8 A/ p. m6 Z! x0 D/ X' b* V. w# Z0 @6 W5 |
plt.title("IsolationForest")) ]5 \! G9 k. U! |4 O8 }
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)! B) S. S5 w3 W
4 ]5 P8 {$ ~" f' L7 Y5 r6 {
/ y( ]* f) I- u$ _( a' ]; b; p
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
) ?0 s# f# W1 }/ Mb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
& Y8 m$ _! q9 Ac = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')+ D/ G8 T) J8 ~0 X* \0 ]! {4 _6 D
plt.axis('tight')
8 k4 `/ | Z9 Aplt.xlim((-8, 8))! G1 _# S8 A7 W
plt.ylim((-8, 8))
$ c4 B/ L2 ?5 K( Kplt.legend([b1, b2, c],' |3 x3 s$ b- I# c& Z1 L* o
["training observations",# G! g: p2 H, C5 z9 ]. W. v- r
"new regular observations", "new abnormal observations"],
6 N- U6 L' j" ? loc="upper left")
. y% U- }2 ], M& W$ S' Vplt.show()
/ z* _& e, ^3 e: f# S1 s: C3 V1 N, q1) [0 g' c$ R; o3 u. ?. p- o
2' @4 ~) r1 r* e M9 L- Q8 y% |
3; V! D$ N" b) ]0 J& ?
4
9 t' {$ R) K2 M# o& Q53 ]. u" d& e. l% v5 \
6& C/ n9 m6 f" S. }3 n- z6 R
7! a7 y' [) z9 E2 v I3 ^4 k5 e* f! c
8
0 P9 E8 z! U. n r/ S$ W/ Y90 u; @% m3 t/ l3 v8 X* p" b9 D
10" i+ G; }7 ^: |' F
11
: `8 |# c& u6 H; z" U12
2 M. Y: P, p9 G) b) T s3 d) X13
$ G$ [" q8 u) l4 `9 R, V14) X( B, q1 `1 W" E: M7 z
15
' j7 ?* o3 e8 x' N- m) v8 |: k16
* b( c0 }! o8 w& B17- n/ y/ t) ~) n+ `
18
1 z5 v" ?* s5 t" e- l4 R# u19
" x- Y8 n% |% A) C# O: X: k" [209 j0 t& X( O. L0 z# L
21
" r5 G: [7 [0 e( p22' F: P; n/ T- B b; I$ m# B
23
8 E' M. D5 p" N. k: t6 z& D24$ W. d) ]5 d9 H- X4 N% [
25/ H: y; h+ D/ c* v% ~
26
4 e7 K a* |. R27
5 o0 J0 g+ ~0 F282 z1 ^& O- \8 U
29
, p) a, O" z' q0 y; a302 D( O g$ J; \
310 h6 L! y" E. ]. q5 |$ E
32
$ q. Q9 Q1 l w/ P6 ?% V3 ?7 d33
" J: S; D6 ~# v4 }/ N) l34/ ~: z% N0 m& \6 C) c4 ~
35- C' ]( c0 k0 {. ~8 Y' q
36* R3 X. C1 t. L1 U% O
37
& X; K- D( Y( T7 a1 S385 E; l9 E6 ?) S9 R7 \
39
) s. r& A( y: H4 b3 g2 P4 h40! A$ o9 {0 v' ~: x
41
" j3 I, G5 c9 ]4 Y) {5 o! X b. c; ?" j
& z! C% O! m# K2 [1 w————————————————
q w; j9 M$ `6 A$ Y$ c9 a版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' O6 Y+ g: y1 _3 ^9 Q6 d原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
# y/ r3 b; {0 Z: T) }& c K2 t7 _# E3 w8 a9 [9 [& [' r2 e: r% T
( a- h$ k: e* Y% U! @+ d; s) e
|
zan
|