- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565711 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174936
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
9 h( x" M$ R! Q3 F0 e5 I/ F2 U) h数学建模:异常检测算法* B ? Z: m- e% n5 [
一、简介 – 关于异常检测
4 k2 q. o9 z9 a2 B3 Q异常检测(outlier detection)在以下场景:7 R K6 Y1 a5 Q" e/ X6 S% x
: {% \/ X1 g, s0 [5 n
# _$ K$ l; B- `, ?2 a
数据预处理: X# y; W7 U+ P
病毒木马检测/ o9 G4 e5 G& P: D5 F+ C; u7 d
工业制造产品检测
9 g1 f2 p( ^) f% E4 X d, H网络流量检测
4 q" d0 c4 G7 o" n" ~% ^( O3 ]等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
1 s- e" R4 |* k1 ~. v8 T* b
$ x% v9 {. L9 H) {, X! L$ z5 ]# d K/ w3 E0 k1 a4 N
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
! u. W) a0 y! J0 B2 }! [. R) }
$ g' I6 D$ X5 ~8 j4 g" m$ T$ ^" F; k; G
以下是异常检测和监督学习相关算法的适用范围:) j) k' V# f/ B
0 ?. Z: J# j/ D: _" J9 ]; F6 w# k- L; C4 l( @; B
异常检测
) L% T0 ^& F8 Z0 X' v; c8 A* M信用卡诈骗
7 {& s3 J1 _- O# G7 D" J制造业产品异常检' e H: N2 x2 K/ o. K; a7 q. n5 T
数据中心机器异常检
% D" T$ z Q( F. @7 H9 S7 l入侵检测
% w/ U. c, |2 [6 x. C. @( }监督学习
5 ]% j3 h( T4 u* C/ ~垃圾邮件识别
9 \- W6 w8 Z! [$ ~新闻分类
: y* h5 ?" s1 y5 M B; A% x7 @7 s" \二、异常检测算法
% w4 W+ I5 g ^' m
3 W5 F% u& B# q% P4 e) C9 Q
0 V: g# N8 |' I1 h1 \4 Q
, ]+ Y* l2 Y2 |5 a+ |4 T: r$ I+ A5 C7 a
; H' n$ Z/ A5 {* P* G! x1 L
) T4 l3 x* D" |: K Pimport tushare
6 ~6 X9 k/ c0 h$ D# n" nfrom matplotlib import pyplot as plt$ l: F: K1 \+ _. ^* k7 T
# Y" B5 L- O1 Y
df = tushare.get_hist_data("600680")+ ]1 I+ ]) Y% N# e g+ t
v = df[-90: ].volume
0 e! N' u: S+ M( [8 V8 D& @3 tv.plot("kde")" e" Z; [- @/ _5 m$ G- f8 n
plt.show()8 A; C2 S3 Q/ a, d# g( k: d5 L
1
5 ^. r% F' Q) w" v/ v5 g2
/ i/ v& k* k+ f* f2 D37 r- a3 r% S2 J2 \
41 Z& C6 Z( J; W
5
+ U4 a Z& A1 s3 Y6. q/ C8 t+ E- U# R) @1 D. A, P
7
. t( R0 t0 l e+ `近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)5 f% B0 i4 V' E1 A7 p
1 n: G' b: X7 n+ G% |
8 |4 E1 \/ t( g% E5 {+ m! G0 _" Q+ U; X! S" s. C
' K) O" f! ~3 ^+ ^
' T# M: C0 d9 }# ?1 Z5 t. R5 x
, {9 ^+ T, L# {! R% x S
# ~6 m) u/ ^" H) A9 d% N$ T( T+ D$ u) o1 q
2. 箱线图分析
- l7 g+ C/ r+ [" t( k- ?import tushare4 A0 H! K6 L- z6 s, C1 g' |
from matplotlib import pyplot as plt
# Z7 r' h& B7 J0 `: S }) \ ) d1 D% z3 `4 N1 g2 D( b* |
df = tushare.get_hist_data("600680")
$ q, e( G! D+ h+ ~* l# a% fv = df[-90: ].volume2 P/ i8 V7 u6 H
v.plot("kde")# f% |7 b3 u# N) p
plt.show()1 O& f* ~; T2 t
1" s' _0 V' I/ N1 v1 {7 D
2' t5 ]: S& Y4 s; G* Z' Y
3) b$ v# V) s/ k( Y
44 m5 q9 w7 V% R; e
5
. O" R: v; G, y- R) e6
. m/ H9 j- [, S7+ L0 t# b' r4 h! I* e. C4 z
: w4 H5 E) [6 ~% W+ B. _& z
9 _" A' h) o9 y大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
+ ], P' ~! n' C
6 l: i2 d, y( S; w
1 p8 T9 @ L, z ^; {8 n8 Y; {- G3. 基于距离/密度$ |& O r: L- ^7 L& v( n* w
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。- t9 H- {$ @& w2 ^
; b; K" {8 U, ~" i. q" \6 B7 @
& o7 k: A" d! p, [0 D1 A" x用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
( I4 e, ^ I1 c$ d7 j/ M0 s( W2 }% D7 Q" ^) Y8 n; g# I
9 S1 e7 j) E0 J6 @+ v7 A
; u1 E" [! k. H8 `% r; E
6 w8 M2 w4 c4 P1 h- d3 U8 | S4 | s. b, Y& z; Y0 I5 ?
2 ^, A! w# s- R3 C8 ]2 e2 [6 N% w+ g/ i; o
/ w! `9 Y8 r: C2 d
4. 基于划分思想! H' b" R' G" Q* i, j
典型的算法是 “孤立森林,Isolation Forest”,其思想是:: J; k& D! Z) d6 Q1 K
, |9 Z9 J6 \* U9 {5 |( f0 T7 j' p5 i) a2 d+ [0 Y1 M
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。9 N1 t0 w: h: ]# p% {1 c/ }
- \6 ^ ?0 S( i) l: M$ u- V5 o% C! S# w6 L
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
& k: t/ G2 B" \" _( N) M4 o
2 f$ x h& G8 M6 Q3 p3 q0 l+ R4 }4 a% c5 ~7 R& o9 D. _
import numpy as np6 ?( v* e; W$ L1 U' W: X, \6 t
import matplotlib.pyplot as plt
( ]! H0 C! s$ b% i3 L' S8 ifrom sklearn.ensemble import IsolationForest2 R3 \2 p: ^0 v2 e4 I
# p( q: J% e, U* e' o* R
0 |/ l) ^0 u0 grng = np.random.RandomState(42)2 Z) p$ Z0 ^4 x m+ G/ V
8 L9 G/ z; C$ c: M" R' I, b! K
" m- C3 D4 s% z4 Y
# Generate train data
$ p" Q% Z1 T9 EX = 0.3 * rng.randn(100, 2)
# S) G$ x) K3 J# i' w% B. S YX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
/ n9 Q, W3 Q1 F2 k# Generate some regular novel observations) r. F0 Z, |' @* C% X4 u
X = 0.3 * rng.randn(20, 2)& g! J3 T# N1 F2 U+ c! m
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
0 H* [9 U: }; P. B# Generate some abnormal novel observations
; M+ ]# @3 p7 ~0 l* SX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
7 q4 R5 @9 Y" }. m8 [+ L% N" E! Z& x7 W
2 Y- I( t8 i5 c% o7 e B
# fit the model( w, \, I3 L8 ?
clf = IsolationForest(max_samples=100*2, random_state=rng)7 P: @6 }7 v& R5 y/ _' B8 ~1 v
clf.fit(X_train)$ A F7 |% o. E! q6 [* ^
y_pred_train = clf.predict(X_train)+ u& t& G: R4 x4 x z3 P% V" M
y_pred_test = clf.predict(X_test) N; F, q6 g5 Q6 g, }
y_pred_outliers = clf.predict(X_outliers)
$ f+ X! L& m% }8 v* ^6 a5 k* y
$ U8 G$ b, M/ O0 U
7 X7 y. {9 p. X0 @9 s, v, P# plot the line, the samples, and the nearest vectors to the plane
# p$ X5 x- F9 h( Yxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))8 l- @8 j) \( s* H$ I
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
9 h) Y. w# W* R1 Y7 a. C1 fZ = Z.reshape(xx.shape)
, T: [5 g% t* Q4 d5 \9 X6 y
; q. l, Z2 }' k
+ v p u }5 }3 k+ }& a7 A; T2 o" }( Jplt.title("IsolationForest")
2 W5 f. l! c/ m I* v; n! V. A& ?plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
: I6 `* n2 z% B' I% F. d* O* u* p+ O# u8 J- [* }/ @ q
( F/ ?2 Y1 K% U7 c7 C) Yb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')2 q2 D# J+ E* ]0 V8 \( R( X0 s
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')9 T9 Z3 x) [/ d
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
) x1 X# m( l8 o1 _" O1 Cplt.axis('tight')0 `& G$ p! r7 \6 p# j
plt.xlim((-8, 8))7 W2 G" f Y. }# c$ ]
plt.ylim((-8, 8))7 H8 z, z f! i; {
plt.legend([b1, b2, c],
. `" P, R( D5 T! x! D/ @ ["training observations",
% v$ W' s7 K1 u; z9 `! F "new regular observations", "new abnormal observations"],* b* ~+ p; N$ z( }" z! m
loc="upper left")
# ~) n1 h! ] C" Y* c. l# p# oplt.show()
% }1 l9 T5 Z% `4 i% f; X8 E$ h1
$ [& X' Z$ n" W2% O2 X9 n* v8 U4 |9 s8 @+ A/ M. D( c
3/ v& F: _# c1 _ c9 e
42 ~2 ]8 }- }( l" A2 L1 b
5
/ A8 a% E# `8 A% [0 u+ c* X6' H: V$ w8 T/ I
7
+ x) z& w3 U) ?* N8
& g) v: `" }: G) _9" p0 H5 T0 [+ W4 C2 h4 x) q' x
10
2 H3 I( l4 D! i1 C11
3 z `2 u+ \$ l7 [' y/ ?# t |125 f5 J$ ~* e9 b4 P0 M
13: P) y" _" x9 T1 _3 o
144 |/ c! |5 [, r5 k) P
15* |- m9 F1 B( V3 V& C0 ~' l
16
: |# H G. G5 s: H3 d, `0 D* X; m17
, I5 @5 a- M6 w# C2 P18' S5 g0 T5 V( W+ d
192 u) D4 v1 r9 t+ z: ]
20
) z6 i. O. H" Q21
_$ v( x- @8 y/ Z1 i1 v2 d22
$ Z/ ]4 C$ v ?' O6 q7 {23: [% t/ Q4 R. R) G' i- S
24
+ C6 G6 D0 g0 O7 B2 F$ x. s2 B1 _25 G4 V' l: L" i8 p4 C! a6 V1 s# W
26
8 t9 C( v4 l+ O, O* l! s27& v2 d. L( {: `6 ~. _9 L
28
0 {; d, ]0 e ^' p$ @. }% Z3 I6 {5 V293 L0 V6 q j; d+ u
30' S) K. m9 r2 n) c) n
315 M) n" q5 R& \( c- ]
32& f. p' ~! h! ~* X' h
33
1 G+ W, o9 b9 }2 M# T) t34
3 m# ]2 e% o _) R- [: l35, z" g: U5 [2 Q. u5 b& ^
36
, [* I2 ?: t9 J% A, s. C! z37
6 f/ Q% y6 ~3 l# {$ C8 C! R& E0 ^4 F8 q38) ?# l' V" F& r$ ~3 }; x! n
39
7 X4 H1 e' W( L- {% L m; V* ~7 X40
) W, g$ j! _) K$ {; H41
; r) M1 G6 }# ^7 c4 ~; D+ p/ Y. L+ n! t1 t/ M
9 Z) G z: ^& O4 C# g1 i# \+ O————————————————
1 k1 G' ~, B" o# t版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- R% f& G& E' L) E% b' d1 ?1 d
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
, k7 P7 E+ n* Z% C# I5 \. W1 y8 a( v* C5 H/ L
/ F) b* L4 B, B+ a7 A) d |
zan
|