在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564715 点 威望 12 点 阅读权限 255 积分 174637 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
6 R% w/ z6 S, a' J6 ?3 Z) U 数学建模:异常检测算法 " f1 \, p1 }0 ?! r. V+ A. N
一、简介 – 关于异常检测 , x& e9 L4 ~& Q* `
异常检测(outlier detection)在以下场景:
. I$ J( u( q' Q
; I" o% @+ [! e( i# B% T& L1 @
7 E/ o9 X) W) p' j! J 数据预处理
6 C4 O" G) u% H6 C% z7 }" ^ 病毒木马检测
$ p2 i& B& s& P. r* K 工业制造产品检测
$ }5 m/ V/ q' e 网络流量检测
# L9 a$ m4 B) I( [4 Y6 Z% s, q, O 等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为: ; X8 |) W" z" b) e9 H6 M: M3 |, x
. e* Y7 n5 c& r# [
. ]+ `# j3 w+ ?% M/ F, y. ^' n
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。 " }) }- Q. [8 z
6 i8 z5 ]5 o) V9 ^
* p- e$ o1 {4 o, Z( I4 v 以下是异常检测和监督学习相关算法的适用范围: 5 q9 x* i$ e! G
' V4 B2 m1 J- ^6 F% ?( v1 A 9 [2 ], d R3 s' D
异常检测
/ ?* t) o8 A6 l 信用卡诈骗
) `& Q. G2 |/ J' V 制造业产品异常检 - l! U$ N5 |# w
数据中心机器异常检
/ q; k% @5 d+ ?6 ] 入侵检测
" l7 t1 j$ B" j5 d 监督学习 3 M) l0 Z/ k9 n0 a* e: Q( [$ D
垃圾邮件识别
% T7 O; E4 {( N 新闻分类 - B9 F7 |; a, }2 [( a
二、异常检测算法
* x" h0 E9 i! {
2 j! W7 `7 j J0 o. Z* Z
) P3 u8 O2 s) m& @) m
" s* D: x9 @+ b& i! R + Q& u5 p4 t r* O2 r
- f! p! Y& |4 x6 {6 H9 G. Y
. N& U) M- f' ?/ Q4 S) H C; Y# b( I import tushare
3 R! c. ?2 J0 x5 ] from matplotlib import pyplot as plt
1 I @' f0 _6 ^3 i$ s ; K; f% X* ]9 t/ E9 m
df = tushare.get_hist_data("600680")
]. D* l- d& ^+ g+ n: I" y v = df[-90: ].volume
+ k: t# o" j& G7 t) Q9 H v.plot("kde")
( V! z5 u- m$ n$ ^ plt.show()
# G* _6 G) @. S- p' z 1 0 M) Y, o3 e- a+ T# {3 u f
2 + u/ f8 h' S7 w4 ~; f" Q
3 7 t5 j: @/ v8 C9 L3 ], i5 A/ q- y2 I
4 3 @' A: R: t6 ?) M( C# j
5
! g1 Z, v/ d5 V 6 ; F6 M k5 j$ e- F
7
1 K3 C2 z6 M! d& p 近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
- B# j o \) i; D0 D7 z
: j0 y9 e6 v3 p8 I2 o5 w6 V) Q
/ x( s- H7 H. e7 p; [! }
" r9 A x; N! h5 W
; D9 ^) B. a" u6 s 3 I# ]4 H! ]6 J" Q" N! y- N/ a
; W4 O! i' {2 i- ]. @% K' ^8 `
" P4 @5 {4 v2 W) { 9 z$ Q1 v' i' u7 V0 B
2. 箱线图分析
+ A* G; `; W+ }) t import tushare
$ G$ `( O# p4 |/ w from matplotlib import pyplot as plt 5 x. n% d4 J; r
: b! ]9 V% o& P: ? H) M
df = tushare.get_hist_data("600680") 3 l( l1 i$ i/ d
v = df[-90: ].volume
" t& ~& _8 W( y: Q, | v.plot("kde")
8 c& a" `. W0 E: G plt.show() ) D+ P" f% y. n( _( y5 x
1 - a) j: I E, p1 o, _: j
2
9 t8 Q5 `: z* Q6 E1 ^ 3 , \# Q* z, Z; W' V( s7 |$ U
4
4 z1 g$ m; u$ z# c6 _( Z 5 , p! \' c/ r- i' v1 R
6 2 @5 W# t9 e T B9 g; r( S8 M l
7
$ F" W; S7 \% v8 m! s# f ! ?6 r( e) }/ T& \* `
( ^0 U& y- Y+ O! k' \& N+ z. E
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦! : e3 P& c9 X) e. D$ h* ]6 G8 E: _1 C
+ \2 F, i. |; v; I+ w
" X/ L7 T1 |; y7 h9 H 3. 基于距离/密度
@! V* l8 T/ r, u2 u 典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。 " I; g" M' y* u" O% J
2 A6 C, p3 r& |. g9 M7 {, _ ) i7 R9 h, E5 E% I$ q y$ t* w
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。 4 p+ r* y0 c, z
" D8 \/ \2 T2 `6 a0 q
4 y1 L" a& N; I4 Q - R$ r. M% b& d7 A* n
/ s: a1 k1 I4 n! h ' g3 Y- @: K1 {* k" t4 m$ `
& I- x& G, I# W( J
; p$ ^0 @0 C5 o
* V: b5 H& m: _, S; D4 Y
4. 基于划分思想 ! x% ] {, d- D* i2 a: g0 e. }
典型的算法是 “孤立森林,Isolation Forest”,其思想是: - P' w* Y/ z6 F, f/ ?( ~
# P5 d+ L* M1 z3 }
: f. }! x6 a: G- }3 ~' K0 G/ H! m
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
. K" i! I, Q5 e% ? $ f5 p4 ~* m5 l) i# K/ K, t
0 s8 p2 D0 I: O/ m6 E% ~
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
2 m1 e0 Y- F2 @7 S/ @0 D3 d$ e
8 _0 l/ v$ ^+ O" ~7 u' L 3 U, b& }8 Q6 V$ J/ P9 z) s
import numpy as np
I& V( X5 m% F5 f import matplotlib.pyplot as plt ; {% ~$ _3 O+ ]6 A% C6 ~
from sklearn.ensemble import IsolationForest - C" c4 `. n0 q0 k6 \& w- t/ U
: ?; [6 ^2 t0 ]. D" {6 C
c+ t7 f- T9 B+ m; t2 o5 h rng = np.random.RandomState(42) ; W) Y0 {( L+ Z( \. t* s
1 Z, v0 T$ A0 V5 o0 k
0 X2 d( r+ o) o8 Z) A+ S; C2 N' o9 h # Generate train data 0 e* S7 |5 [1 ^! D: ]
X = 0.3 * rng.randn(100, 2) 1 t; g, s* E# [. U, t7 M: L
X_train = np.r_[X + 1, X - 3, X - 5, X + 6] 8 f. U# d; e3 d1 y$ {, e3 q
# Generate some regular novel observations 9 ^& _; ]$ {- X4 D) j. V
X = 0.3 * rng.randn(20, 2) / Y$ ` Y5 } t& c
X_test = np.r_[X + 1, X - 3, X - 5, X + 6] 6 g+ i( A( ?$ }
# Generate some abnormal novel observations + X) D9 B5 `+ Y: m
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2)) ) l* X8 U6 y! p3 M& c! k/ y& l
4 K1 F# |' o+ L- x7 p
" w% Y* Y( @2 {. Z0 P3 ? # fit the model
J1 P8 t' N& B7 b4 j clf = IsolationForest(max_samples=100*2, random_state=rng)
6 \3 h/ j4 [& Z L5 S clf.fit(X_train)
- }/ B4 \8 N" X3 ^( x7 h$ J | y_pred_train = clf.predict(X_train)
1 ^/ e$ @% Z8 w y_pred_test = clf.predict(X_test)
" T/ I; _1 w9 Q% p; ]. R: g y_pred_outliers = clf.predict(X_outliers)
" e, n9 O3 n# K+ j: h& } 5 K' N9 o+ U5 N( B- M, [ r2 s( |
& Z0 d6 Z) V1 k/ A, l0 q% i # plot the line, the samples, and the nearest vectors to the plane , @' L+ ^- }9 Q- t' v1 f& U
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50)) % o% z% T6 h- @* u: @
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) - V9 f/ c3 f1 S; Y# q8 v
Z = Z.reshape(xx.shape) ! h' X, p M+ l! r( w. @" \- q3 D
' W& l8 w) w+ a2 u& g' R6 L " x7 I4 T5 W! o* Y3 I0 R- G
plt.title("IsolationForest")
1 S* F+ f; D- e% y plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
) {7 Y* I% }6 q' I5 f: d ; X% D; y9 s, q, m5 e+ O
' `3 _3 D9 b6 n8 B6 Z b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
8 O4 n, I" a5 a/ q/ x1 l b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
( G4 V+ @6 [0 y, K c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
: ]2 k8 y6 c* m/ C" u: @7 H8 G plt.axis('tight')
- f6 ~# k1 s7 T) w5 O7 g plt.xlim((-8, 8))
, {2 _, k( E0 H9 x. U( c plt.ylim((-8, 8))
# v \- U2 F/ k& A plt.legend([b1, b2, c], % T8 Y& {$ y1 q" Q' t" K
["training observations",
% i6 p# K1 ]! }* V# W1 g "new regular observations", "new abnormal observations"], / X( p7 V+ t# C8 }1 q- @" r. J3 r
loc="upper left")
( Y" `4 k- A+ h, w' Q# u plt.show() 8 A Y8 z7 \- k' Z- @% R
1 1 c% B3 L6 x4 N6 _3 m' ]8 R
2
0 t! G8 A% B/ O0 \7 y+ P- d 3 , j1 U3 }) ]- U) I
4 2 r/ C/ v* |3 I: ~6 l
5
+ I ]! T2 N- Z4 }* L 6 # I, @( M. {% i, x: Y6 e$ J4 C( Z
7
8 ^$ f9 {4 E9 t 8 - E4 `7 v) X, R0 _; p N
9
6 y5 K+ w3 n1 t, m2 L' A1 E 10 1 d) ]# q8 `+ A: E
11 ' c G& Y% L; C# P1 x2 f( W4 l c
12
* h& N9 S6 B( k 13 / m- g0 }8 ?% s( H0 M& y
14 ; ?( w3 F2 {1 R. Y& Q6 z- w
15
7 Q# K, y0 {. K1 h9 }% o 16 7 W$ K6 a( M( I; @& j
17
8 W1 y: n1 M6 o# J 18
( f( W7 J0 U; Q! |8 m 19 ' I" U8 N/ ^9 J
20
, r5 z+ O1 O* p: P$ D. N, B9 { 21
5 w' j" y8 r. m5 ] i8 c2 B 22
* e$ j* K( q. N# k 23
* E9 k( J) ] x! A" E! K4 p* M 24 . j- U8 g' F* v$ y
25 7 T4 O- J2 X- a3 D
26 3 b/ v* @4 N1 e, M* I
27
1 t k/ {. n T' L" p% I8 l 28
- ^ |2 O9 e0 W# | Y 29
# e% b1 f6 n( B" y M1 V' k1 O I 30 5 b1 k' g0 B9 n/ r) r/ I3 i
31
6 Y. N ^, j3 |$ N7 m 32 & R! [8 f/ Q8 u5 S+ X4 x. n9 L
33
# J9 Q9 S/ H! f; ]6 x% _ 34 4 b& i6 H' C% N# u4 m. I& Z
35
2 y* `+ H$ W r0 S* R 36
7 w9 r+ N" c! Q8 _! ~+ e8 ?4 Z& f6 y 37 0 b2 A4 ?% _* W7 |% t( w4 ` O
38
! L% q Y6 T( P, A 39 1 d! B" L, L# y4 N$ m; Z; a
40
9 l1 K* a/ m1 m* i1 X5 G* H 41
& N! }$ V6 g u5 q/ n ) C v3 V7 x/ A. X( [8 Z
7 o( R: z1 T" u6 H- D
———————————————— & t$ o" J& A& u, B9 i3 t# V6 i
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 0 n$ Y/ {3 r& c- a }: ]
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129 4 S7 Y& `1 p# f- w
1 G1 B; K# U0 S
! h: `( v) I9 j/ G' u
zan