- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563278 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174206
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2 P1 h& X( n4 g2 `; e/ v% g+ l数学建模:异常检测算法
% y$ G8 V1 j- B. G6 f( t9 t( `一、简介 – 关于异常检测3 y4 u6 G7 ]6 e* O U: w
异常检测(outlier detection)在以下场景:6 g1 E9 l! G% V5 Q4 H9 i' E
$ z4 I0 \2 B K6 \& d+ x7 i# K" O) J8 o7 \) {# A0 m
数据预处理
& `, e- g% x9 Q+ {! O病毒木马检测
4 f+ | q7 o; X$ \; C* _工业制造产品检测
5 K2 m9 D4 A- C7 n; g网络流量检测
2 \) a) H8 c1 }, m' W7 K. Q2 S等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为: I7 k- A+ B0 \& }8 `% E4 `
5 ` O A } f0 ^, W: W- G7 s) a. D& k
监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。5 k% R& l+ ?- d9 W* Y
1 ^1 [4 r# F' u. K% U0 @- T
8 E+ K* l( u. C0 Z9 d
以下是异常检测和监督学习相关算法的适用范围:
0 b) i1 g6 q+ [* F2 V _& Y( i0 w
) X0 M. ^# P- P# \% @8 a0 \8 a
异常检测& S/ o' q* g9 ~3 `) Y
信用卡诈骗
( W& n* C! ]3 e制造业产品异常检' D, t$ y! p! F6 W) x1 b, c' w, _
数据中心机器异常检
7 w- G1 B5 ?! d* A' B3 I1 P入侵检测& J7 X; `: ^" j+ o0 L3 E; D! m( u
监督学习8 s' A& u( Z5 K( k# j" [
垃圾邮件识别, l% E+ ~ i! d
新闻分类; y' O+ `' {; A4 t- M
二、异常检测算法3 p& c7 g& h* ]* r
( }+ K; O6 [. ~
, X8 q p8 B' b) z6 |5 R
. u6 [8 {: O; x" S, Y) V
2 ~1 b8 i2 ]* C* R4 s p+ }; W1 O: T l/ @5 ?9 t4 q& F' J
4 f& t' \1 _, N+ b0 iimport tushare. C0 X! n% D5 D% L2 U8 P
from matplotlib import pyplot as plt
% `* @( w, h% [/ ^ - P9 d `8 S3 V7 W0 v
df = tushare.get_hist_data("600680")
/ N8 Q! O& C) y3 f3 Qv = df[-90: ].volume# T1 C5 i, f k3 |
v.plot("kde")
1 B! {& x: S/ C2 M% }plt.show()' l! f& n8 N5 ^+ }
1
) Q9 \+ K( p' l2 j% H2
: `8 h- }# G5 K: Z! ?3
* v( @2 b, W( y. X" ]4 G9 I4
& b$ f' S: Q) p T- h5 U# ~* @4 n5
4 e! I* o& X/ ~( F5 J65 N% W) n7 r% i- E0 `
7
3 j& _% H5 X. U1 k近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
1 d. u8 [$ X$ K1 g
5 c% B# H( D2 T
0 n/ P2 H; E' G# k( B" ~7 G
4 T% Y- U! ^- z2 t
N9 [. `* u* B; Y: o0 J/ R8 A' U' p4 G- O' D- m
+ ]# w% D/ ~& J: \0 ^$ M, X; c1 P; r* k1 f2 \: s! H2 d$ Y& I
/ H. z9 i& Z4 A* ]2. 箱线图分析- s! x) [/ v5 X( S$ y4 I r
import tushare
& j: a% g( ?$ m' y+ ?from matplotlib import pyplot as plt
5 b( [6 s4 A) H. d6 G5 `$ b
. {( y; m+ M8 Ydf = tushare.get_hist_data("600680")
6 D( N4 {- E8 Q7 ?) b. U3 Yv = df[-90: ].volume) \3 c, `$ [3 q+ l1 w, p
v.plot("kde")
3 i2 S0 t6 }% lplt.show()! `3 K( U! M4 U L4 m- X
1
( [/ B& J; z# B2
. }0 Q- z+ v! E9 o6 E3! @0 ], b# E6 C6 U
4
& M7 w4 o+ K5 r8 D% s3 u: o5
4 _3 Y8 [4 L. d l% o6 A4 w, b6
3 E( Z" w+ U5 r! e# {7, h# E8 P8 b# I( i
7 O2 |3 E% l8 b, W; d* D$ n5 j/ M) _* K/ D
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
" B6 ~# J8 x; f8 `
0 X7 [7 g! P, ~( Q
- _6 E* S9 i4 b6 ~2 R3. 基于距离/密度' O" C! i: R0 ~) @
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
. E7 K+ x0 O7 C2 K( N
" K2 L3 w1 d6 m2 S! k, @" }4 l( [$ S7 T( r3 U
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。: e; D, j6 K) z1 z
t L0 _ W5 N' N
5 l6 t) [% }4 B F% ?" w- q6 m( f' w2 X* Z5 v) B( W8 N; `
8 U5 M. m! ]' A2 ?$ Z( F+ R
' c4 Z& v0 d9 p* ^4 Q3 d, g( O7 K; q7 `* |) [0 N3 X
% V: R! t5 q; E3 ^3 ]
4 P6 s0 Q2 J+ Y( F/ v! q
4. 基于划分思想$ j4 i( @% r9 j3 Q$ ?* z8 g9 q
典型的算法是 “孤立森林,Isolation Forest”,其思想是:
% y6 ^5 X& b) o& `8 G6 p9 ^9 b4 z7 @" ?7 s- @' w- w" A' c* G0 v
' x# d3 V: `- l O* `5 L
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
6 a" g, l' i5 {% h% z7 d$ S$ r$ W# J4 }
. r) u) @! A% s( a% m# o
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
/ A2 h4 T- b. c4 K: u3 `0 Q& l2 F) F& Q) S1 b, s9 C5 F o
+ K* O2 f) ?# K, _& k8 R4 T
import numpy as np: u l& Z0 c( ?' R& Y5 M& B
import matplotlib.pyplot as plt# W! r( e# @" y/ x1 G( ^
from sklearn.ensemble import IsolationForest
6 Y& F1 T; a: y! H# c+ z$ N6 W) o- ~0 q: c# q( j3 e0 Z
$ r8 }5 i3 p! \
rng = np.random.RandomState(42)
9 k- t5 C: s5 w: t. k3 v3 f$ ~8 V
$ f1 l" R3 F' H# D' ~# Generate train data/ R- G0 y8 d& [, M$ e) i: V
X = 0.3 * rng.randn(100, 2). ^" B' C0 ^# C/ d% y' d: ^
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
' M0 a/ S0 r( t6 x& F3 J# Generate some regular novel observations# M! b' k) w5 g
X = 0.3 * rng.randn(20, 2)+ a! O3 R, k9 H- c. |! A% h4 L0 l
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]* p2 R: d* R" {' |" b) M, m
# Generate some abnormal novel observations* `+ q1 _5 ?5 u# e, t5 c; h# L
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))4 g5 R3 r: J" _' q+ {6 I
& e' S' N) y2 ^7 l& J9 ]8 C" Z3 W/ \# F" _* l6 n; ?* {# ~* E9 B' x, Q
# fit the model- K5 O& B/ p2 o7 a) K2 e* ?$ j
clf = IsolationForest(max_samples=100*2, random_state=rng)
; {1 e1 E& z3 ]- M6 Dclf.fit(X_train)
6 J: B0 v# H4 {, |! Py_pred_train = clf.predict(X_train)1 M' H! a& d3 j+ X# a @$ h
y_pred_test = clf.predict(X_test)3 m3 A( Y+ o6 w, p6 r, A
y_pred_outliers = clf.predict(X_outliers)
; X7 H2 r+ e: q; r4 V
1 G: E" z9 |- l3 c$ H! q# S: x; O) v/ J
# plot the line, the samples, and the nearest vectors to the plane
# Y, k( y& h8 E' T' r% s }8 oxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
2 Q0 v5 D% R; \ g; _0 HZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])0 s; {5 g3 B3 e9 s
Z = Z.reshape(xx.shape)
1 F1 a) L- w3 V+ U6 W; b: S, Y6 X7 g- m, e' C
- c4 x; x3 a4 \) ]! u p
plt.title("IsolationForest")! g* c7 X1 Y! ]: g, `
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r). n, ^4 y) E! W$ ] e4 ^
+ s6 i4 x" h7 m9 Y
/ n8 Z2 q1 J( R! i$ t0 {
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')8 a( G' A0 s% T2 m8 A9 R
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')- Q9 z+ F3 o1 Z! E: @! |# j) |2 F
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')1 k; X( K. ~% _/ U
plt.axis('tight')0 g7 l; F2 _' N3 ^& Q1 s
plt.xlim((-8, 8))2 z8 o/ K, P1 c3 s$ {+ v# A
plt.ylim((-8, 8))) v* ]$ P1 ^1 x" \& Y% F9 ?: E
plt.legend([b1, b2, c],# ]9 l! H% X( `( K- |) V H
["training observations",2 C6 B4 v8 i+ ?+ G/ @
"new regular observations", "new abnormal observations"],
# j5 L$ C: k- V5 @$ } loc="upper left")% E+ t) \# W# `" v( R
plt.show()& \( Q% u+ n! F) N; Q# j' Y8 v
1
+ x1 [9 [& ]9 Z% ~. M/ g. q2, o1 T3 H6 ~) v5 J6 g& x) |
3
# z' ?& D5 m+ X7 |8 z, D47 c9 P, C1 m9 j! `7 q: |: y
52 H( V6 x- k( ~) Q! L
6
5 _8 L9 _" S; K c3 N72 \( t- T; t m/ N
8; Q! ^' Q C- N3 q
9, E+ C' x6 ?& }/ M. `
10
3 [+ Z' _* R- w ?" u" V11
# @ r7 Y; k9 z4 R3 s$ m123 s: I4 v! e5 [
136 E- @6 h6 f* Q" D* {7 T
14! ?( N# i5 V- \% D7 ~: z9 V) X- l
15
5 G, u6 _; z9 S) S' S. N16
4 a& o C5 E0 L17
5 H4 [# r1 `; \* P1 A18
; X2 X1 i2 e! P% n/ r E/ L19
8 }/ a0 p) [: r( m20
9 F' u7 V8 ], P4 N2 m( _7 w4 T21' p0 i2 Y$ q7 q: b5 ~; o6 h
22% g) \, U: ?1 S) p9 `7 C
23
* x. y$ j$ y/ q) R9 J& {24
% Y3 h2 b- H3 U$ p25
; S- O2 G( z" t p26
, R4 c4 C/ i9 U. I. q, y27
. w/ k) A1 ~) ]8 P9 W( {281 ~ g! Y& o4 C0 ]/ W7 j# b
29
* W2 e- Z7 r3 j* [) b; Z30
, W7 x; a( q. x31
% Q" m+ [) Z! p( B+ `$ Z' W8 D324 y; H3 V; B& q
33
+ z/ \& i0 N- d2 D& k34
8 l: z* @1 |: v: R" |' z; v2 Q355 N0 \5 j( r& j5 \* M5 @( Y
36' r/ r0 x+ k: N- c3 [
375 @' o; [0 @! q* j5 i
382 V: X- `, n- G4 a3 S
39
. t2 s) d( B1 W402 O# |3 I, s5 U4 r& d$ b( V
41+ r- c+ U1 T; L$ v; t" f) s
- d" p* c+ y& X6 D! d
, A! R( w$ c$ s. K
————————————————. g [1 p v# A! T8 F$ `. _
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- [; O$ y3 L* \, O& [3 g( S原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
. R$ {% e& L! x+ R
' j# Z7 ^) D0 ?0 o: I" l4 g M( _- E) j4 S5 B! o9 n
|
zan
|