- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569178 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175976
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
$ z6 k. V/ E4 m: A- y
数学建模:异常检测算法* G; X5 ^& o# W+ Y8 S
一、简介 – 关于异常检测2 A! a# w8 {, [6 e. J
异常检测(outlier detection)在以下场景:; q3 o6 ~) [& v8 \8 n( w. F
9 H1 {& v) Z: T( E6 _
" k0 Y" R9 `, O; ?/ |1 w
数据预处理5 j# @ J5 z; G$ x) `7 }% P/ K
病毒木马检测
2 \+ k: i5 f+ ]. R9 d工业制造产品检测 o8 X' f! J! U. E& u D
网络流量检测
, _9 o# G G' b" E1 E$ E7 I' i等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
+ c7 v' m" G2 f# `0 ]* [& j) K/ O* O& l1 H2 g
, c' n1 [! U! O) D! r5 d# T N
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。- h5 F- c' L8 o6 H ~
" O. k7 u- ~! M7 U6 G" P
3 K5 T P; G4 j. V3 n
以下是异常检测和监督学习相关算法的适用范围:
$ V" G% u s* N
/ k$ p8 R7 n& E5 b7 h* {' Y+ M" R' S2 r D
异常检测
; A) d* w: ~# ~& Q4 p( v7 t信用卡诈骗
0 J7 ]4 V0 H9 o, c# w5 W制造业产品异常检
' a9 k/ Q. c+ e8 I* Q$ z5 M& I数据中心机器异常检; \5 U8 Q, g1 ~1 X/ I
入侵检测
1 z, \, r- t; g! |监督学习
: e* @9 S& q4 x垃圾邮件识别
3 k( Z0 Y' h! Z) V- r9 ]7 q. A/ z新闻分类
0 s: L4 }- b1 s8 p" e1 T二、异常检测算法
/ b( t* | ~; w, _% M
% b& H; {( n3 k2 \0 B1 P
$ A$ m) I1 m- O, [
# U& H4 h: c" V5 }- ?
1 j, O; f- U8 c& ?5 Q7 @0 f: T; U- ?/ @, F5 f
1 k2 s' z4 M( H& y4 y
import tushare) X& h0 `4 B5 K) {! `2 P4 j9 s
from matplotlib import pyplot as plt
, m% N: H: R; e
; s0 ^. c8 B1 K! o' xdf = tushare.get_hist_data("600680")
; ]2 ]7 z0 Q8 L1 N0 l: Dv = df[-90: ].volume
) k( H- m3 U3 t2 K7 D3 Iv.plot("kde")# t2 V4 z- n6 a5 v6 o& T8 r/ d* q
plt.show()
3 ^3 }% O' m( @# G3 ?: e; S+ |% X0 l1
" A5 a# |- y. y, ]! e. @7 J+ I! K# }8 Q28 S" A. N$ ~: @
3 R+ {. K5 H- S; `
4
5 F8 Q; i9 y" _2 q! h# j( |: r5
+ g( P: [+ ]: }6
) a3 J7 M: d6 z0 N2 s: `7 G7. l% f# S3 R9 @( d
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 I, k0 O! a$ i& C/ O( ~
! ?, C. t! K6 a8 \ H8 s5 V2 w' d/ H/ b* V0 Z
, @0 V; @+ X8 a2 u
9 g; R( K4 v8 q1 R$ z% j7 ?7 z. G/ \9 B
5 T: M R h& B7 v: _8 a" U7 s" a0 Y, z C7 |: }
) @$ ]1 \+ F% z+ O6 e2. 箱线图分析4 R$ l! y- h2 T2 l5 S
import tushare
) z4 A1 z7 e! M2 ^from matplotlib import pyplot as plt
4 | A* F. O" A0 g7 ^ # J. \8 b" R: r9 w2 k, K7 }
df = tushare.get_hist_data("600680")
* S5 }' s+ o" O* m% iv = df[-90: ].volume% h& R3 ^8 Z; i8 I# _; q
v.plot("kde")
4 {7 O1 _+ D8 I# \& K* f8 lplt.show()% n- m# z4 _, F+ |: S
1
3 [+ `" p7 V( r7 A28 Z, n0 C ]0 G! G8 g4 P$ _
3
- i# |. Y+ l1 ~1 X$ ^4
( W9 j5 q0 P S6 Q, G6 B5/ N# j( D& s- \' O' s+ K% p) L; Z
6! V, o, o/ z, e
7
' H' q/ T0 m7 L& J# _+ U" Q1 _8 r& K! a. {+ ~
0 Q& ^) s: G5 m. ^大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
7 F% ]& x! y' ~
( W8 e: F& C* ?- B' h$ E! ~- I" a) e7 v: t9 B3 a% Z6 e
3. 基于距离/密度- Q, J; c9 }' f( }
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
8 ~4 _: Z, b9 K; x) `
L# B- K$ E0 I f+ T& P8 }' p- |6 J
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。 f6 u5 M, O; A
, K; e) C' n* s6 k4 N; z
2 s/ j9 d; V' T" ?
2 a( H9 T9 y. Q+ Y7 U) ~8 k
; b# Y: m2 e2 d2 y# D: \* c
8 B1 S& R4 m' P; R5 j% j" p$ r3 B/ F* ^5 K/ L" F& c
8 P' {# D+ T! E8 H, {' P; C+ i | p/ U1 W
4. 基于划分思想
5 N0 u" J- _( H! X8 Z( t典型的算法是 “孤立森林,Isolation Forest”,其思想是:
, N K. k8 b% x7 b; ^( n( N2 O4 B) K) _
& N" y4 P3 v5 b! ~' {假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
3 w. [7 ^$ T- n4 _9 Q2 H$ Z/ b5 m* M7 W
+ l% D Q. N& L+ B这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
' S* _3 {! U6 [9 Z7 `2 C& U0 R3 H5 y7 G% a( P% O1 s) L
' p, `- t! k1 ?: \! U3 {
import numpy as np) k- G* j4 @8 ]6 w( s: b! y
import matplotlib.pyplot as plt
7 a% V$ U$ Y3 wfrom sklearn.ensemble import IsolationForest
# D; ~5 X/ E: ?" S4 p7 O# J
, \$ _; |' |4 r+ g4 [) |, k y. s/ c8 E9 A5 {; K9 O% ]4 V1 H
rng = np.random.RandomState(42)2 ?/ d# n" t6 @( o) o
1 B6 D U; g; o% A( v0 [# W
% G& R% Q2 L( `. D# Generate train data0 h) Z, }6 L: e8 y/ Q" v
X = 0.3 * rng.randn(100, 2)9 `$ Y% e. _0 J% C2 R4 t
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
1 |- T8 z6 G; v4 C' ^$ q# Generate some regular novel observations5 B" [5 O" o7 I; m( I
X = 0.3 * rng.randn(20, 2)5 Y. \3 x9 V& A, q" h
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]7 |2 q$ S" L) U6 F2 @3 f" f8 H
# Generate some abnormal novel observations. [6 m; v" X3 |! A- U. J
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))/ T2 N# {/ n$ H: z# [. q0 ]
1 s/ L7 V% Q3 Q c
' o, @6 V" I5 ^6 ? X) }6 S
# fit the model# ]7 s* V" M" ?
clf = IsolationForest(max_samples=100*2, random_state=rng)
/ a3 b4 q4 \* J9 R* V2 cclf.fit(X_train)) m: I& W a# a* `8 A2 C# Q- b u K7 m
y_pred_train = clf.predict(X_train)9 n/ F9 k& O; [& j9 B9 }& }( I
y_pred_test = clf.predict(X_test)
; M6 j% Z" P D% L8 i0 F$ r5 h' Iy_pred_outliers = clf.predict(X_outliers)
, u( `* k, s( W }
! t. o# d7 x8 x, l
) ]; T# n/ r+ z" H! q# plot the line, the samples, and the nearest vectors to the plane
/ z& j `; ^. Q: C3 X) l# E6 Lxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
' F& P; P8 U4 P8 |Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])9 ^. c1 z: R5 m* w: j4 i* b. a
Z = Z.reshape(xx.shape)
8 j* ]. j; c1 X2 w3 u7 s8 s" W+ ^, x8 p+ ]
1 l% X0 N7 D" [3 Eplt.title("IsolationForest")* R5 `9 X7 i+ S. j0 R2 p
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)' z3 k9 ^1 _& k& J
+ F( \) t/ X5 B3 O, A! T( K4 g8 k4 |% u/ Y5 p3 [8 \' v
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')( w9 \& a3 d. Y& [1 I* M$ z
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green') _/ n& P/ ~; ~( v1 @
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
! d4 q u# D# H0 p) H& f. Pplt.axis('tight'): V+ y4 V' ]- Q7 R0 O
plt.xlim((-8, 8))4 l% \3 i1 }* w) E
plt.ylim((-8, 8))
9 h$ A+ e- [. o4 h% s) fplt.legend([b1, b2, c],2 j5 J. v# G; V m9 n
["training observations",4 ^) W+ q6 I2 d, Q
"new regular observations", "new abnormal observations"],: ~5 [9 p$ l0 g' b/ ^
loc="upper left")
' s3 d3 i2 W/ v( m$ jplt.show()5 u$ ?" g; l f( l+ J3 o
1
# S: C& j+ y, S0 ]: _) d2
& \/ H5 z6 l: b3 F! y1 R34 ?0 z- S5 H3 e3 y G+ ^* S
4/ f6 [0 ^, {2 V. s% l* n" }9 I
56 ]& a: Z+ V7 M u
6
& s2 s; j8 p1 v7
4 G7 l" t9 C$ {6 W. u v1 O+ k# L8
1 G& X W, U }* l4 E/ L7 @98 U$ Y/ i6 ]7 N7 s+ g
109 ?" z7 l" V( `' C) N- ]1 z
11
, W# [ l6 O; @1 j5 U f. [; _12
) s8 ~5 s- N! O* k! E13) V. X& k( q; i
14' A0 A3 f0 E7 S5 E0 L
15% U% G% z' i8 U: i# J0 N5 C# l
164 v; v6 m# h0 X. X; e0 o
175 d+ c+ v: `& S% T* u6 d$ {
18, d! P# ^/ w* b2 k4 Z& _4 Y) _
19; T( i1 I! f0 D& o# B/ _- Q
20, \ Y. l2 a* W9 s$ C9 r- j2 ], d# G9 T
21
, ?9 `# L' A) D22
6 H9 B" m1 w- V: z23
) @" e" Y# Q+ ?$ W& e24
. q, Z3 g# d% o25
/ s: N9 G7 q0 Z- L( ~26" b8 n! r2 z E% ?+ c1 U# ^) q+ Y
27; A- X% m1 e4 z1 c
288 K% G1 ?& ^) D
29$ J8 A! o) b: O3 k$ T' @+ }
30
% ?1 N8 Y- j0 T9 {- I314 k% a3 o4 W* {9 Y5 m- V
32% b( m! E {* U% |
338 t' H1 D* u% [6 G
346 s+ L) g0 c: `. U8 T
353 Q( P0 @$ n0 F! g" U
364 M9 ?; E* j/ x8 c
37) A/ Q3 ~. |, f6 n: f
38, w" t1 _- @9 ^1 d) k1 S
39$ h( x- @! @7 H1 U6 [
40
; D9 v- h3 z( H6 P8 i7 O41
1 r2 B+ m0 u+ r
! [( {- s8 K2 D3 N1 m$ Y# ^+ T! |- ?7 U# c
————————————————
# o& y" f+ B1 q% f' ~( u版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 j: d$ P/ ~0 c1 u
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
. y4 W4 L( ~. Q9 w" Z7 h* }9 d8 y7 Y, \
2 @5 N. q/ I+ \, d2 I$ ` |
zan
|