- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564711 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174636
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) K& A( B `0 I' J! O( `' B7 D4 ?5 c2 S数学建模:异常检测算法
1 K$ q$ `2 }% S% h- I一、简介 – 关于异常检测
. {' z8 @# [" q$ F4 e I g异常检测(outlier detection)在以下场景:- X& Z6 \7 T+ a
) v( h" U+ ^( h( F3 ^6 o
. Y y+ d- K4 n, m$ O! s数据预处理! s8 s- f+ Z$ H8 L. a7 j
病毒木马检测2 ~4 Y# G. C# A( J' A
工业制造产品检测
! t; `+ }9 y( J) z8 Z7 c% y. i网络流量检测, ?4 Y& A/ S, i: D1 a
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:' d( H$ n3 \$ p: D+ G
6 `5 [' @: @2 q2 O$ }' ^
, ]6 l( A0 {+ j监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。" C* O4 @# w; d0 w8 D: z7 v& m1 W8 u
3 c" ?3 c; s. V0 j
# G" i: p$ Q' m以下是异常检测和监督学习相关算法的适用范围:/ u$ i! g9 o7 t
. N) N, ?: t7 f! ]
$ J2 c9 S( R* y1 e+ f+ a异常检测) Y4 P8 O+ B6 W" C! f
信用卡诈骗
8 `5 x2 e% f0 c# Z, M0 o制造业产品异常检
$ s" g# J v: n, o/ Q9 ~数据中心机器异常检
+ W; ^4 h' Q3 A# j& X# E3 v: ^! m入侵检测
G1 k- B. l3 h* x& `监督学习
9 j7 |0 E9 {8 o8 ~6 m9 m6 _垃圾邮件识别
7 E4 x% g% U! ?; Q7 H新闻分类
6 X; n2 j" l9 {+ b: v0 T二、异常检测算法8 E% r- _8 D% V" U: K- w( V/ M
1 f$ z8 c) M& p; B& j) o" w
! }: f# n, G% d. z0 ?9 u* D5 {% x3 K6 r) A, M6 N
& Q* \" m& r' r$ ^: O
8 S2 O' D) k" V
% ]2 g: ?5 L6 |. T
import tushare
9 v% A- a9 K: C- Pfrom matplotlib import pyplot as plt" p4 u! ]3 t) L+ w: s
' G" t7 B" S* \0 L5 ~
df = tushare.get_hist_data("600680")1 _/ j9 L/ Y: |3 J/ v" g% n( H
v = df[-90: ].volume
! D6 ~; \! f% Z- `4 _v.plot("kde")) c8 k& `9 `: \
plt.show()/ @9 T8 |% N6 R4 t# ]9 T" Y
1- ~" ^- J8 ?6 h
2
, W9 Z# V$ n* {0 y3
9 `6 H3 v& M) {, z2 f$ o1 ~. [4
, } \# l9 A9 d5 a& J3 a5- R% c3 ]$ C8 s L6 T$ J8 e/ v9 l C& E
6; }$ ]9 z9 g& t4 v* s7 _" }% H
7
! e; t& a9 z% @近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)
# o% K0 J5 M' U& R- G
) b- i/ ^* S1 G0 J. l; h- Q9 P
+ l$ c1 i, j( }1 a" n& b. G- r4 p3 @' M; s
6 {3 \+ X5 M$ I0 r
3 v' M# z# l- t, ^% C. V
- Z& t* a; b3 ?. ]) H6 @( L$ s
8 @0 ]+ G L/ a$ I8 e. H0 S$ o$ V& I% c& J/ q" b0 J2 o& x
2. 箱线图分析; [4 C8 K( t3 K
import tushare
1 J. d% }( z6 [; ]' {4 N9 wfrom matplotlib import pyplot as plt
, N$ Y6 p5 H/ c ! F" V! a( _6 f0 L
df = tushare.get_hist_data("600680")" ?! E* w$ h) A3 s2 i3 p" v7 z
v = df[-90: ].volume
5 x- p: S. f) L H9 k4 Wv.plot("kde")
9 h N4 N$ [$ I1 uplt.show()+ @2 b6 P" [4 K+ A
16 C; Z% O/ {6 T% {) J" }4 k# D$ w
2
; v" d8 t( z! B: i3 D3 B; H3
9 Q3 j! w$ ^9 B* A, ]) @4
1 T! i# s9 b9 z: J: m/ Z! c$ h7 L* l+ c5
) k0 i# E& j5 @6
4 D8 T$ ~7 o6 {% K& Q- p+ x7
% f1 ? y. g* p9 r3 j: Z# q9 X. d# M! E- m
2 n$ Q. J% b3 l' ]
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!
) {: G2 D# u: {; e, {& m+ c% @; i4 c: L
% e/ d1 k9 P, B. D% z
3. 基于距离/密度
; R! J# o. S' w+ `典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。/ Y. @ g; y( q- m
% ?& _8 M1 z/ |
+ q0 {0 M8 K8 ?: L( m9 r2 l用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。/ K! y8 G" T: C% L! V/ b: T. L! s0 K
3 |% [. T/ {7 D; C+ w
, S) f" s0 \' b, z! p
! o$ R, A5 S1 | A5 g5 I! S
, G; T( _ s8 I. H0 h( a5 g4 ^4 t+ ?& ?; \) y3 L/ K; Q5 c8 Z$ Z% _
% `+ p! r: m, h4 s0 F5 n
" V, Y% X) U h( M; k( E* x
; D# ^) Q, F4 P4. 基于划分思想
5 ~: z0 C% Z+ B: Q典型的算法是 “孤立森林,Isolation Forest”,其思想是:
3 w# F& G2 `4 K1 o6 z
' ], g I6 m0 }2 t: A9 I- A( J8 u5 l9 p; F! m0 R7 T
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。
) h, F" y2 o7 l4 R) k0 M' A! T8 w; N% [0 a+ w
6 Z9 _$ j* f& ?6 L( d. x' e# K
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:- k; U' a3 y' W3 y
u* R7 ^+ y4 Y6 H5 ?
- W/ w0 p8 v, n. n- Bimport numpy as np
9 e F& w3 y8 h( ^import matplotlib.pyplot as plt
: L2 x u/ w. V6 Q/ e% j5 Dfrom sklearn.ensemble import IsolationForest
0 c" { |' p" j# q# m6 g: p0 T# Q0 V7 o
0 f% u) G7 k3 ^9 |# Mrng = np.random.RandomState(42)
' c; U5 S5 B& Q' @
" _2 l9 {/ _% Q- n
6 q/ Y4 m, O, [3 M: d* [# Generate train data
0 g2 z) }4 ^0 D: t" d6 TX = 0.3 * rng.randn(100, 2)
* t/ ^, q) N" }- `& @X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
# I' p: n6 o6 K# Generate some regular novel observations$ j1 N+ W3 s4 ~3 ^& m
X = 0.3 * rng.randn(20, 2)
2 m; S' z. j, oX_test = np.r_[X + 1, X - 3, X - 5, X + 6]
0 P! {8 @) G* Z& T7 v B& ^# Generate some abnormal novel observations) R w4 n! ?0 k G1 i) m
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2)) c5 V( r3 W& a' m
N9 l2 W5 O5 f [9 Q n. H
" j& X) p% Y$ r5 \# fit the model+ n/ s# l* X* C/ w( X- p( D2 T
clf = IsolationForest(max_samples=100*2, random_state=rng)
8 H0 `$ ^$ p" Pclf.fit(X_train)
$ u" n: r+ T4 `8 B9 a# ?y_pred_train = clf.predict(X_train) u- q6 X5 }6 G, N( V2 G" d' V9 d
y_pred_test = clf.predict(X_test)+ P$ ]" S6 w( X% o x
y_pred_outliers = clf.predict(X_outliers)
' c, n* t, b$ G5 w: B+ s2 S) ~+ `0 q% |1 ]
6 I Q3 i+ ^. `8 O; r, l
# plot the line, the samples, and the nearest vectors to the plane
5 M) y7 a$ |* E6 g, d4 g. O5 c+ Jxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))# G: E0 { ` U
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z$ W+ L' T9 b. qZ = Z.reshape(xx.shape)
& ?, {) O2 [; ]3 p: C# E! N" C
; t& c; j2 ]/ Y+ J2 M9 z/ y7 Z4 H/ Q' y" O
plt.title("IsolationForest")( r9 G6 P0 u9 T+ Y b5 G
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
8 j6 L$ d: t- H. m" m1 g
) \) t' j* m7 z7 D+ S0 w9 n
$ [% Q& A) O1 P! m9 V6 C+ R% u: Ab1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
+ q! E, `6 v9 g& `7 }3 T! zb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')6 H5 G1 S) k" p8 ?4 f
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')) R8 U. K- j4 o1 d$ n- m! R
plt.axis('tight')
. @" ]2 i1 o! {* y& Z( Mplt.xlim((-8, 8))1 V4 e: [/ U# A+ l' Q
plt.ylim((-8, 8))
9 |; S! J2 E7 g+ z+ @plt.legend([b1, b2, c],+ k* m% L1 ]+ u; K+ F9 d
["training observations",$ z) P3 K; ]0 r# p( o; N
"new regular observations", "new abnormal observations"],, V! v" i/ ^% v
loc="upper left")3 _* N- B% s2 }/ t$ ?$ {
plt.show()
- x9 F7 j! M" { w1
* Q/ i; V$ z" P6 F26 U8 Y& W" h8 X! H; o
3
8 m3 }: s; P9 g1 B8 L: q4
. e. F% q3 R! W5 _# g- J5
a( ], v( I( g6
. o7 ^& r p; X! ^" C) l: t; F7. I& T9 e# o( ?4 V- X
80 A V7 ]- R; E# R2 K$ i
9
8 i9 z z/ C! ~8 T; K h3 v* o10
6 v/ e `0 }7 n! ^7 y1 \0 _) p) W11
: y! j7 ?+ M8 d( U( H- S12/ Q/ M8 b3 B5 d$ b6 z6 |3 |, v
13: w: s1 Y6 a8 u s5 q3 O
14- [6 D) |6 A( H) f
150 A+ G* l7 D: b# b) U2 Z
16
, X: d$ F" i$ f0 ~4 m8 H! e) J$ v17
~& { }4 n% c18
8 N# e* |1 ]: J$ b199 ~; B0 Z4 b9 u3 s* s! O' x
20: [3 X7 f2 \/ k/ U; c5 I9 q" ]% v* d
21+ I5 j5 J, w! ?5 Z
22( d4 z. o \% {
237 `2 T4 `8 ]! s) o3 G
24
; W: L* m! N: E+ p) [25
# z& G0 O: f: F26% W4 N# U1 N; C$ W1 H8 I6 R( x% O
271 S: T2 K& ~3 o, }
28
! k1 l" x# a- l2 N. @29
4 F+ i6 E- | `30
2 C0 n/ d; M4 G$ ], }8 H" @31+ M+ c: ^& Q7 _+ a1 L2 Q
32# F1 T q* g7 N/ ?$ p! r/ G, G
332 A4 p4 o$ W5 [
346 V/ {; j( R1 V# S
359 q! w$ ?+ s# a4 X" d6 i$ u
36
" J+ f0 Q# c& A" L37! X3 {" Q2 |3 ]2 O4 x# F& Z
387 [- Z2 Q; s% Z" B; f1 e$ s
39
2 H" Z8 ]9 ^1 }( I40( n8 d% [* ~2 B5 d' Q& h. k
41# K/ ~; n3 x( N- U5 Z3 C; ]; k; E
- E- S3 s+ Y7 u2 g: |- I& D& _0 n& @
; i; f& z7 c7 R \* N, t2 s
————————————————0 e) n3 K8 J% d: x$ i2 ]
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 P/ i4 R$ o+ H. q
原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
$ Y5 A8 ~7 U5 p1 I. \) [
. D2 `- Y# e' ?8 Q# {! h1 Y, L0 V# c5 W7 P6 j! M
|
zan
|