- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565748 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174947
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% Y3 C! [5 d# `- v9 m, f) Y数学建模:异常检测算法
4 H& R; @7 A3 d0 I9 i! W# y+ J. ~一、简介 – 关于异常检测
8 D* e G% Q( x- Q6 m N( L异常检测(outlier detection)在以下场景:
6 w% U4 Y$ x# d7 t0 G `
% T+ v8 u" F7 q( b7 A3 e6 |+ b( |' K7 |3 g2 F# c3 Z
数据预处理/ d9 T( H- K- Z7 |- T* p. P5 J2 U
病毒木马检测& A; {! s! g5 p2 r0 a
工业制造产品检测
& G: a- W6 X1 H$ d! B网络流量检测5 W8 k( ]+ S7 K8 T U' u. y6 C, p
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
- |% J- [1 b8 n7 Y4 t7 Y5 s U" t! o# s9 S& O
7 z5 o9 W6 f) {4 H监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。
( _% L/ ^1 d; F4 g
$ K( G. J- E4 B8 F# Q/ C
" ^4 Y. O/ N9 U6 D0 T以下是异常检测和监督学习相关算法的适用范围:: G: Z; m# t6 @6 ^& }. r, Z0 r/ p
, U6 {5 ~5 S1 O$ m7 t; L
: Z3 r }/ e3 f" ?
异常检测* Q8 p3 _+ V4 L& B$ A
信用卡诈骗7 m( I0 _4 d1 q' r: x
制造业产品异常检
7 n* p+ m" D1 B数据中心机器异常检* ^, r9 o$ n$ B/ x* l7 h2 h
入侵检测. T+ |, O# |. y" [
监督学习
* j. D& s* L2 F5 N) G2 p垃圾邮件识别
7 W3 F/ O1 }9 l) C- ^新闻分类
, \! h6 r+ {2 f p/ q7 {* @二、异常检测算法
0 K+ l# \& [4 B/ P" [
" ]8 [2 _" Q. y; E& O' U. |/ k. Z. p) u+ C% L% K
' z) m! ^0 F% {4 a8 x$ Y& H& R2 W+ H
, m; I: S2 i' o6 s/ c
/ W. j; @8 P) L& R- y% d- Z$ g+ Y8 e
import tushare
9 [# R, m* Q2 S3 e; g/ ^from matplotlib import pyplot as plt" ~4 k' n, k- }% Y
) n% l \/ \6 A6 jdf = tushare.get_hist_data("600680")
/ t# X7 |# D$ c9 H3 r5 z4 zv = df[-90: ].volume
. u* |* a0 x( ?0 T6 y" ^0 Z% Rv.plot("kde")
6 C% z+ R8 U* _plt.show()8 n c; I3 `) e
1
4 \: K- N- c! q: E+ k24 v0 t& N* t+ |+ B
3
& b& T- P+ }4 J+ M7 U% }4# q- z. k& `1 G6 V9 b$ ], x* K
5* P3 @, P L. |
65 a( p. r8 g- C: B) y, g
7. m& L! R x3 J+ j* @8 T6 V& r
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 ~, k2 y: G/ D+ r& t
% |" g+ g* Y% [4 U& A/ H) v
! R5 u+ ?9 X# J. O2 C E! v9 ?: w! A2 n; k
! A! w6 p5 U$ J0 ~; x) C/ i
$ J3 }1 b9 {! G& D' T2 X, C/ P6 ^) w( z! B! c6 k: O* t+ l$ x
! n3 S0 V+ Y" |) Z( f- {' N, C( D! H5 g: R2 Y
2. 箱线图分析# `: M5 i) i3 B! f) `9 @
import tushare/ u- F$ a# k8 R
from matplotlib import pyplot as plt* C' C) k0 t+ x* c i
- p! ^) s, P9 E& G
df = tushare.get_hist_data("600680")
. w) m% A$ ~6 _3 ^) iv = df[-90: ].volume/ L& K3 X6 u% P) C8 ?
v.plot("kde")
8 Z& x( {+ Z, X, vplt.show(), ]( w& v6 z) r1 f w" |
1) p4 I- W5 b0 M' X* a, w( B9 x# \
2
6 {1 ^( G$ x0 f3
5 I) x& h' W# m! M4( i2 n2 T, M0 E$ f4 `% o
5
' \4 Y& Z" n7 L6 s9 G6
+ ~2 @% e7 V, ?' J1 u1 N' z7 W% O3 c7
( x! I1 P3 E \: s9 o, b
) E7 f' x. k' T
! [9 n/ j) g( \大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
8 i1 z" Q& W2 b( L1 w, e: X1 ]8 S+ Y5 w( R4 o* B/ i+ i, a: k2 ~
+ m5 [) H8 o. ~# s
3. 基于距离/密度: r3 Q9 K) A4 ~# G% \' b
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。
& k& n- ~ N( E& M( l5 R6 E& b; _! c- N
' Z) \. v' R: _( N用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。7 [) J* E, f( T. ^1 p% Z- w3 b/ N
; z) R( m! [( N5 H5 W- g4 H; R2 v2 h+ t4 }! J. Q$ ]
' k7 {+ w! l" a" j! u
" ~! m- p4 H! Z, {
# U; {# } H- T7 Y9 N, E2 g4 i& d$ q0 Y' G$ G
& t5 s2 ^2 J* m" C' u0 }- q2 I7 ^
3 I- R, @) y ?3 J/ K6 L
4. 基于划分思想2 I: x4 h* {% Z A6 h
典型的算法是 “孤立森林,Isolation Forest”,其思想是:0 v* J8 U/ M/ o5 k; j6 s
# P6 P9 C4 d% p& E; E! S* @5 ]) @4 [& V! m$ M* l3 C& l
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
, t- }$ x, o. h6 L; s2 G
( d- h& b1 h3 Y. e! l
+ t/ k) B% ]+ \7 U* E- }5 s9 j这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
9 b1 _! u" k4 g' r4 ~5 o2 v8 A- x2 ?: \) A+ a( S% ]
( K# ^, r0 G- t# m0 P" G, n
import numpy as np
% q: R& d% i1 f7 T! Z0 Vimport matplotlib.pyplot as plt% D2 D) C8 u2 n4 V3 G& E
from sklearn.ensemble import IsolationForest# u- x4 N" v) w% i2 F% n: k0 X
4 x0 i/ _$ i" |& A
- d' j" X3 Y3 |rng = np.random.RandomState(42)
. L2 T2 d; Z9 d* Y9 X4 y& @. N8 [7 I z( D5 Y: [
# U5 L( a7 G, W. |: [# [' o# Generate train data" I% t. O0 b8 ^- J
X = 0.3 * rng.randn(100, 2)
. m) l" z- d; \+ JX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
# I! _0 C, |% s' G4 Q* w0 ~0 J# Generate some regular novel observations- ~; y. f6 m' R+ K% Q
X = 0.3 * rng.randn(20, 2)
5 {" S7 Q7 Z: E# p9 _X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
" u5 N( z9 ?" m$ f0 X$ k* D3 n# Generate some abnormal novel observations
) C! c# S4 f# ?4 Y4 H/ @X_outliers = rng.uniform(low=-8, high=8, size=(20, 2)) s4 K I( j2 q! Q! Q0 P; d R
- M5 ~; Y! k7 @: U7 t: j2 Y
: t: _% z$ Z$ w- s# fit the model' K( s: a: V6 K6 ~3 @
clf = IsolationForest(max_samples=100*2, random_state=rng)& `2 s. c5 Z/ ^& S2 W, l1 w! c
clf.fit(X_train)
) i3 f0 L. ~& Ky_pred_train = clf.predict(X_train)9 m3 p3 i+ `" I+ }' n
y_pred_test = clf.predict(X_test)) c8 |0 \/ F( A: h% E
y_pred_outliers = clf.predict(X_outliers)8 A4 r9 ?# {2 e$ Z4 b" s9 d# U
! `8 b% q" N3 W; n
6 d, h5 Z' R- g4 K* |4 e# plot the line, the samples, and the nearest vectors to the plane
; h _; }! ]; V' _# ~- E" Xxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))) R' c: f8 t0 Y! V. x7 t
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])3 P2 r" I2 N+ b# v
Z = Z.reshape(xx.shape)
+ F/ R8 d# C, ]5 v) X, R8 b. t
) b+ k- m) B1 n% ]
+ `1 \0 Q" Q2 k U# m. P$ aplt.title("IsolationForest")# K1 V' U. H9 Q! @ S8 K. r3 g( G
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)" A. _7 S7 J/ t# a
0 w# M4 A, O; i" p- x. R4 q5 _7 [, ~, L4 A J1 E2 y
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')* V, U$ I7 ~, z* Y1 k0 G g# A
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
7 L p! a5 { b4 ^' ?c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red'). f& q! ~( b$ o4 }. a6 I4 P
plt.axis('tight'), d) S1 v9 E& n3 O) M+ E/ ]
plt.xlim((-8, 8)), m# l! D5 W8 [1 h: A5 Z1 K+ p
plt.ylim((-8, 8))
. U3 ]" l+ k, w' w: Yplt.legend([b1, b2, c],
% {4 E7 H5 f7 v ["training observations",
# D; x( ~) y; z0 F) x" j+ F$ F "new regular observations", "new abnormal observations"],
\- |+ n; Q# u p loc="upper left")9 G: } n& I9 J
plt.show()
- b, V# f, G }* g1
6 I/ D5 E. |: i! ~: O M2
3 u) l t5 ]# e9 }33 B/ n: R) p0 s: r: Y
4
0 J2 H3 U3 w/ Z* D5: Z% s; P7 y# S* Q' u$ z' u. u
6
7 T' D- z% Q8 @2 r% @7 h, ]7+ @( L: F8 V* C+ M! V
8
- N; Y: F& h$ N6 G92 g, Z1 W; k# U) E4 K
10" z7 Z* A8 `" @
11
4 `* ]! w) I# }* P. M8 q, [: t( l129 h9 n5 B0 N1 i0 m' U7 U
13" A" u2 U6 E1 n6 H) r g% C
14
" t: G' l0 n; m1 e+ Y$ g15
" @7 [' R( W! W! h/ @16' H) @8 o, s+ d7 {0 _. w$ j
17- D/ @9 {1 w7 h6 x
18
, |# X' B5 V! Z: _) K7 l0 Q' r9 n6 L19
" u- X7 l4 N6 F- P4 |) ?8 F202 l) ~$ X4 V- f! F+ m( T
21/ g& W7 Y% y, b; B0 V
22
8 w1 ?6 Z* }8 c7 F4 A23& @# s" ^) j' k- t# d# Q
24
* V) q7 U b0 @% r25' X& X. j( w! t1 b6 z
262 p0 m) ^6 Z4 C6 m1 M
27 \' O. v) c# U& S
281 @! u, ]2 ^: U8 b
29
0 j) z! u- a/ z+ \# z! p1 U, ?30
. U" Q2 C" `* N" ]+ M" ~317 H6 Y/ J/ ?5 ~: P7 u
32$ ~: ~* G" k/ P4 g1 U; ~& `
33" N0 U7 _- o6 B. h. b0 g
34" B7 x. U8 N3 I
355 _+ y, q# }1 x! g" j1 ` s
36
" F" B0 j3 s/ |37( \/ p, h3 f7 f. ?4 A! c R' U
386 [, i5 r- @& @2 j3 d7 n% |
394 _; E7 c% Q) c! F+ w/ H
40, j6 g: S- U8 S1 }! ]
415 f; \* [% c+ z: |, E% {
1 g* b- f0 s+ K9 U1 J7 A
5 c2 V) L4 Z+ \# l" P————————————————' c, u& v' n3 p) v, _' p8 e3 W1 ~
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& j/ i% d; k% l5 q0 D+ z
原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231296 z5 {7 }9 v3 W6 W
h% I; V w" f" n5 M
9 t# o) V' s/ c$ A- ]: a2 G6 ~
|
zan
|