- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564714 点
- 威望
- 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年大象老师国赛优 |
2 I' n. C) b& M5 H% K: \
数学建模:异常检测算法" u0 a+ M6 e1 E; l) D4 W
一、简介 – 关于异常检测* w9 i0 d7 w8 ^$ M! L1 I
异常检测(outlier detection)在以下场景:
# _7 g3 d9 h9 X7 N7 b* J+ ?% L& Q! G# C
$ J- a9 B6 R3 N x
数据预处理
! T, Q% R# @: R病毒木马检测1 Q, u/ H* M5 r- C* P! d k/ g3 \
工业制造产品检测
# u( ?3 T, x U0 n: {/ n网络流量检测
K: E) ` O. G等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
7 W& s; p6 s8 D
% u- _* [5 Z7 w9 k; l9 \
/ i6 ~) o& E/ t5 g) P监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。! U' I Z& K6 T2 F
& G, [- d' Y0 [# M& D4 o& @
; [6 |( ~4 [4 b8 l8 Y" P6 S1 D以下是异常检测和监督学习相关算法的适用范围:4 ^: Q4 Z' J. `+ A9 B
! O3 j' k0 K6 K' I4 d5 N5 |) g. L
8 N4 z8 t1 a4 S+ F4 E% i异常检测
' [$ q7 h6 m; T0 r6 n/ y& s5 Z信用卡诈骗
+ [' Q% r, A( ]1 J( C制造业产品异常检( v% u* e5 A: d% s
数据中心机器异常检 W3 X( Q& ?2 R Z
入侵检测. K$ g& `3 a8 t0 n% s* _- m
监督学习
5 l+ `5 R" f% K: G7 V D: y垃圾邮件识别
. _4 B0 C/ H( N2 v5 M新闻分类
8 G4 K% ^. @& n/ ~- K2 o! Y二、异常检测算法
9 h) I; j2 C5 n) b7 r& [' l" U" A; P- D
; }; b8 E. Q# P4 c
' j2 F1 M0 h# o" Y8 ?' v* j
& t$ U G$ {/ ~" \9 R* B
3 E# V" K8 T* R% q" A; K$ W8 q3 V9 c
import tushare
6 ]3 i- d# ]. p7 E3 L: mfrom matplotlib import pyplot as plt; p2 G' P* r( q
) N" G+ f. B* o, o% ^df = tushare.get_hist_data("600680")
3 E( U. b- b/ S: r6 s4 Q! }v = df[-90: ].volume/ l* |1 G4 a3 w
v.plot("kde"): M, j& {1 K. n6 R) ]1 {2 S
plt.show()2 b* i8 w7 x- N" s( t6 \ k
1
. q# C3 `9 ^) \* r# S21 y* O7 ^$ _' f
3& ~! m6 ~0 q: h& o, M8 e- u
4
8 C5 C& L4 x$ c% s. i- |2 w3 y$ y5! _6 H' W) {- y$ p
62 X) \4 p1 P2 o/ x
7
( [* D- d# I5 w7 f2 U4 `) H近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)8 e. n( z6 O8 |* D8 T- p
8 V4 c1 n$ Q/ ~7 }3 T
4 \3 j$ n/ C1 n8 S& x4 d. l
9 {9 f; \& w2 Q; O
8 ?1 |) k2 f m6 X) x0 @. F9 l
: V+ m1 {2 G1 \/ j( K; G j
6 G G/ c' a( s2 `% k2 [, w* J( F9 i# j6 g% y
# G- @$ G1 C L5 Y" A2. 箱线图分析* t$ j! l0 @8 z8 _0 a$ h
import tushare# r" T6 F/ Q" C' m2 F: U
from matplotlib import pyplot as plt
# o- G- o- N6 }/ O
; u- i6 n4 b9 U# Q2 Vdf = tushare.get_hist_data("600680") J; j9 }( q; q5 L" j( F/ l; R+ u( t
v = df[-90: ].volume
' w2 L, W: n% ~1 @v.plot("kde"), z; F9 | X" V O$ w D; p
plt.show()
! j+ ^( B9 \3 ]. R1
6 W s: p- J# F$ b" U' D2
! R: m4 L% c1 B3
M4 `4 _' m1 \7 T3 v9 e4- X; g, A. B* Y: a) [0 ~/ x J
5
' D A1 `& h1 h% Y* H3 [1 X# H6
7 J/ ^/ T. K: b7( T! m. v0 g6 k1 H3 s6 [* C
$ h# S* V( ~( r$ P% K2 s3 `3 \/ f& p6 E
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!5 y7 X7 [/ `8 q' D
4 g3 u# m0 ~% a7 O1 b" l, p" O; O2 y. R( h" ]! j$ x6 g
3. 基于距离/密度
4 A# N! b& e4 |" G @典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。# q; y" r8 P- K2 E6 x& {
. ?8 Y9 r f* e) b; n/ \& g% T6 B" ~2 F/ Y
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
0 t) n$ i3 F: ^/ k0 p: K
" |8 [; j! p3 x7 l9 z2 [! O* |! o5 H' l7 e$ _1 A: [
0 [" m7 J4 P* ^/ ^$ Q1 z
! ~ F3 r9 t$ u8 z1 g
3 K( w" b! I8 o& q1 @8 `
/ ~) y4 i6 o' ~7 e- a5 W# i- P' Z- h
/ s! X2 ?' d1 X1 k# w$ P5 u
4. 基于划分思想
5 B* Q* { y% E. c% m典型的算法是 “孤立森林,Isolation Forest”,其思想是:
2 R7 _5 j- k- ?0 P4 m0 K+ n* O* x2 m1 q7 V; ]" ]" U+ ?7 j2 u a' A7 R
, e. l% Y" l1 ^; V" v; _1 B
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。2 X% s9 `$ T4 Z- f' V( `
% h* `6 j* x+ ~$ n t$ G
8 [% q( w% H! E/ k这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
1 {) m5 |5 a r/ D
' {, z9 Z" d4 z0 P- q5 z; T) U) N2 e5 r% k. `0 w
import numpy as np
$ ^5 d3 x2 u6 E! l% J( h5 a; C$ Wimport matplotlib.pyplot as plt
& ?! R4 s) u J5 ofrom sklearn.ensemble import IsolationForest
7 ], d/ B9 Z5 F9 J; R! f
. \6 O5 q$ A' G' e: A, E. C
$ k1 h0 {4 C0 W Brng = np.random.RandomState(42)! n, V* R$ ?. ~6 ?: m7 y& A
+ H. T4 K' z2 y1 \* S* p: W, J5 R: J6 z1 V2 N! J. Y, O' b8 ]' V
# Generate train data
) l" _2 a8 Q! l/ f0 SX = 0.3 * rng.randn(100, 2)
( y, R) @: l) i( ]( L7 D8 U5 W1 e: MX_train = np.r_[X + 1, X - 3, X - 5, X + 6]
7 ~% e& m0 b; a# Generate some regular novel observations$ [. k! {: `' X+ Z; X
X = 0.3 * rng.randn(20, 2); K, K$ e+ Q* O6 M, L n0 N4 d: l
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]4 Z8 X h/ p; r" `/ C2 E( L
# Generate some abnormal novel observations
1 _% \ E8 y+ q1 V) ^5 t, O( S6 ]( H. RX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
6 V, s9 X; p) U8 Y+ f( }" p! J, {! V: m* G
8 S! q: G4 e( Y
# fit the model$ w& F( G+ g% e3 U( i, o
clf = IsolationForest(max_samples=100*2, random_state=rng)
! F# W1 c! w0 o5 n/ Bclf.fit(X_train)
$ V* X9 p5 k- Py_pred_train = clf.predict(X_train)
/ o% H0 A. n& t+ |9 q4 ly_pred_test = clf.predict(X_test)
+ j2 f2 z) M9 z9 U- t9 ^y_pred_outliers = clf.predict(X_outliers)9 N+ B* \! X8 J4 O1 N. F
' d( I* d% y- }7 ~6 N' v5 G# }' F
. T4 Y2 f- a0 |# R: u
# plot the line, the samples, and the nearest vectors to the plane
" r7 g2 N. ~0 h+ j& Fxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
" S4 y7 u2 c' Y3 pZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])4 w2 _" o2 q$ Z }* c
Z = Z.reshape(xx.shape)) k* d4 }, T- z1 V5 Y) E( n* W
5 Q1 z/ g0 C- ^3 t$ c, C8 p( G, k; L$ v
plt.title("IsolationForest")9 E2 l N: g3 b" {5 n
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
) P1 z0 m# G5 G, I: s- I/ a6 R* z) A, O8 ~: S9 ~
+ m7 S) _$ L5 K7 w# M) P
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')2 {6 w5 w0 k/ N4 s" C1 S
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
1 t$ X# L+ t% P& h# V3 cc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red') O2 H- m' @9 K `" A' c+ d& W
plt.axis('tight')
7 ]1 r: B" c9 j+ T2 W" t& O9 H- Iplt.xlim((-8, 8))$ `3 M# L: W# W3 N
plt.ylim((-8, 8))
- } n+ s+ {5 v0 wplt.legend([b1, b2, c],- P- B, I9 F/ g* j; N- k. b
["training observations",
1 @ Y$ V' b9 c; L% b5 f: T9 L" C "new regular observations", "new abnormal observations"],
/ o2 I" D: s3 N0 ` loc="upper left")# G4 g; ^0 g0 V. w; K [
plt.show()7 ?3 t: b9 f# S* a5 A a
1+ M$ H7 q) g/ W/ Y
2( `& Y: [7 \4 U. a, {0 v' h
3% b7 |. X( R8 m5 }
4
" \: B9 {6 t1 w9 m8 _5
; r4 Z# v; _0 M" c0 y Q6* }$ W% m9 C$ w- @
73 o2 x7 ]$ [' |- u
8
0 Y6 g& L2 c6 x' d4 }: t: Z9: N2 r7 o4 n% o( B, Y( V! B# |
10. q2 Y1 q( d ^: [/ }* F
111 X' j% w1 ?4 Y3 X& {# D6 u
12
8 {2 @! w0 H/ a3 ]- ]0 S13
) C% p) Z4 ?% ~+ I+ {( }* i# a145 u3 q9 q6 ~; q
15, ]4 X% _ b6 A! F& c' j2 }) B
16. t! i, A4 E& U. _4 l! I7 p
17
! }; o& J+ V" g' n/ c' w9 `183 ]7 e' g& w! V
19
2 @. t! s) a% K8 z3 Z# @ @* T203 c; B v) [6 W0 C* D* u: [
21
7 R% G8 z% |2 a3 u0 u228 N6 w+ d. B% Q/ O3 g
238 v. u% ]3 R5 z5 h( d
244 g3 [& `$ g+ O# l1 l5 `
25
& g- r. N# y7 X7 Y8 T9 ^, _! j$ Y- Z26" m& @4 M- D+ j( s( k
27
$ @ u% P0 a7 p; o280 \( Z I+ B, H8 \$ w) J
29
& P. e* ~$ ~8 ]5 n6 Z) ]5 d30# U; B4 `! q+ Z4 W9 q7 a7 P6 l
31) d- M: e4 @8 \! y1 R
32; Y2 O+ c' o5 B4 Z7 t- t5 m
334 W+ U. H. L0 K& w+ l' s- j
34: C* T9 N& Y" _" u- Z) X0 K
35
' l5 k1 M5 _" ?9 }- d1 B; y36
; w! i0 ^( \/ X" o9 ] U7 x37
$ ?% {+ Y2 l/ I. N( }+ ^' j38
( B3 w/ F; E4 o( F: a393 C( U0 v5 ^7 S4 e" l5 T. y
40
+ o; T! U) r+ ]8 A* k5 d/ X1 r9 n419 `; i) n0 w! a* b3 u
- E% U5 E: A% l7 D0 e2 ? q3 I
' f8 ]4 l! x# E6 e9 O————————————————
4 ]5 j, _- I* F9 B+ H4 o2 v! ~版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 u; D# D0 b0 D) r; C2 Y) f6 V原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
# H* t0 i9 _1 m6 a. o9 _" r6 R# R& ]: W* W
$ o ^ n+ V/ Z4 H; ^, S8 J |
zan
|