- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569224 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175990
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
$ V$ _2 W( U% F. j% A数学建模:异常检测算法3 B; Q' H0 u+ y E" d0 t! [& I
一、简介 – 关于异常检测
- f* I5 J% Z0 d" V- H, k异常检测(outlier detection)在以下场景: F' }3 V6 s4 n; i, R
* O( K& {* O* h/ w) b
$ @# P+ E( b$ s- @
数据预处理
4 o9 u) F. d. m! x病毒木马检测
8 K! R4 t1 |8 L, P* D工业制造产品检测
+ o! q8 k+ s* [: y% w; U网络流量检测3 V. p8 B0 z: U1 `
等等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:
0 b* E( v, F1 F& V# m6 P/ y
6 h. C$ O3 s. U
- |" G( b9 x' l, [, K监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。5 R" ], Q. V, \, t
9 h$ C9 r+ \) _; k
9 P6 V5 u! y0 @/ q* k1 H+ T以下是异常检测和监督学习相关算法的适用范围:- c. e3 M) F+ c! j# S" q
1 s: h5 v1 O; E
8 V# V& K0 ]7 s+ f8 i% C( z/ l异常检测6 Q4 \8 ]# C) j) V: g
信用卡诈骗, ~/ Y1 Z9 Q" s( R
制造业产品异常检
. y% V5 K" e- }0 K数据中心机器异常检 H) ?1 d' e* h9 x7 _
入侵检测7 m. C- z. f7 k4 u/ r
监督学习2 B. b! D; A4 b& ^
垃圾邮件识别/ ~8 Q5 |7 c: I$ Y! J: S
新闻分类
3 G, H' k+ Q3 u' E二、异常检测算法
' {- z' M/ Y7 e9 T4 a. |; N
3 q9 B; s! \( s/ U D8 `2 o# v/ |# d0 j
. r) m; r( s3 D. K* J( {0 W z1 }
" ~; P1 U2 ~' ?" D F& C: d2 t/ @+ Z
6 H# o5 B: i6 m; g3 M* x$ `8 l$ a, G1 Q2 m# N5 J9 G4 p) j
import tushare
$ y( b9 C F2 `/ W }from matplotlib import pyplot as plt
; A6 \# P: L' W# f ! k" u1 b. T) W% e
df = tushare.get_hist_data("600680")& V I3 A+ }$ _) i* [
v = df[-90: ].volume6 P! c1 ^" n% N( R$ Q0 e; D
v.plot("kde")
6 p2 a" }- h3 J: I0 z8 rplt.show()% o* w. l# J# y- @0 Y
1
^7 w& p, z' T( C2( B, H/ N7 L! q! c! q0 D
3' _% m/ g6 {) R
4
8 C" d4 ^# B; B. Z; V. ~5
/ R8 P; h/ c+ R7 n B. i6
C- R! _& U- j) b' s2 g+ |& A8 j70 D- `3 \! {3 I; D. i, [; b" d
近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)1 R2 p" I( H/ X0 J% {: ~
& N; A( f4 Y0 j% s4 `
# f6 Y7 {. \' f* h% f
: @ [: E O( |
( e# O# b8 _+ s# t
/ j) d; n8 l7 ]
$ F* K: C: F8 U: G6 ^9 l
, y, c0 v g5 O* e6 S+ |) K. Z4 O8 F$ A# J, Q
2. 箱线图分析' j4 N8 E, T7 a% ~& u, D5 V
import tushare, \* d$ n) a. ?0 n
from matplotlib import pyplot as plt; u! P; K8 S2 y: e! V" a; H
' l2 U9 c& B: T0 v' L' o" N. Vdf = tushare.get_hist_data("600680")
Q% `" k) f8 \; r" ~; P4 q! {1 Ov = df[-90: ].volume% ]8 G- `! j( R# b0 i6 f
v.plot("kde")$ s1 I& Z( a; R6 R6 V) r9 g8 c
plt.show()
( p$ r. C+ Z* b3 k( s4 ?1: l3 G. a4 e1 E+ q1 {# m# W3 u
2) F+ a# [7 u$ V3 J" h, |
3
; q7 |+ X. M0 d' l& U R4+ I7 z8 ?% k$ F
5; t& [% X5 G% G3 H
60 F# o3 d+ K" x" s5 R2 `
76 ?7 b4 T$ M+ V+ h6 f! M; ^6 |
% R6 d8 \' B4 l' t4 l: l* y4 i' o& P1 y1 g/ S! C( m
大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!) s# v% X' q ^0 A! [; c) F/ L
& X z7 @2 H$ x8 \. d- {7 j9 S
' X' p! L' W* w% p5 }6 R- U9 [& h3. 基于距离/密度' s: M2 Y6 ]2 H' _- E1 k
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。% h; R/ h1 E, l3 @% h, X5 x3 Z
6 v; `. ]8 a( p) W6 j
4 ~" [5 C( L" u+ d用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。
( C' q* Y- K/ z6 H0 a+ `; F; ~5 }8 q& Y9 T+ V0 T
! G. r; ~0 n- M8 p3 Q7 @0 C' r
2 X! m/ X1 }% A( z
$ G0 w1 _2 w6 \ n v1 K I. n/ J2 t
4 @8 P! {2 C2 `- z
( r$ |. A, V5 l$ Q- Q
( f# @- d, V' O8 d3 h4. 基于划分思想* {$ f) t2 F9 A/ f/ E, p w6 ?1 d) f ]
典型的算法是 “孤立森林,Isolation Forest”,其思想是:2 j9 e- n+ X- |7 \2 G
q# P7 ]' H; ?) Y7 h# d( z! |9 \7 [! i9 ]% ^* X
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。7 h; t4 f5 e+ b7 c+ D
4 C% i' e' i/ i) Z3 C3 z) J' S
& U# H! e+ d$ L5 u8 k5 W4 ~
这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:
% n$ f7 k; P8 m V9 b
, f) \- V9 h3 B9 v/ j7 w) O9 T" Q! g' i1 G F; }
import numpy as np
; K3 E1 B' g* E- g' ximport matplotlib.pyplot as plt6 t: _, A& N; S3 I$ F: j
from sklearn.ensemble import IsolationForest& |( x! c0 A1 q2 U5 c' n x% i3 O6 |
1 H1 P A6 T7 q/ |
' d t5 ^9 v+ @& o, Z
rng = np.random.RandomState(42)
G5 A, `: K2 b: r1 l4 k& S
3 d/ G. A* s8 z, T
" Q+ ?4 `" x, a( k V# Generate train data4 M$ |$ L$ n$ H* A' g
X = 0.3 * rng.randn(100, 2)- j( |" P$ ^) y
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
U H$ C2 r1 w2 Y$ s# Generate some regular novel observations
9 f2 ~ Z/ x5 fX = 0.3 * rng.randn(20, 2)) s0 z. X+ |* D& A$ y
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
& L. T$ K: H2 h- W: {* n! q# Generate some abnormal novel observations
! ]- C2 b# N4 G# c. L( S7 RX_outliers = rng.uniform(low=-8, high=8, size=(20, 2))
$ e6 k% @- `! h4 s5 K: [, a, W( H. E/ W& P, {7 I0 t1 c8 u) u
% o- \" a5 m, ]2 \$ p' Z' J
# fit the model' C" d8 c5 J: M4 Z
clf = IsolationForest(max_samples=100*2, random_state=rng)- r* B3 p* C* f% q1 k6 X( S0 S
clf.fit(X_train)3 b5 V# [2 M7 H% @* Q; S2 { a
y_pred_train = clf.predict(X_train)
. S& \0 o% d8 G" Hy_pred_test = clf.predict(X_test)0 r U- T; H. T4 H9 L4 b
y_pred_outliers = clf.predict(X_outliers)
! B- v4 r0 v) a3 v- }$ s
8 R' L' p, q3 ^ Q5 d- [6 \
) R5 L0 a. G7 m$ {# plot the line, the samples, and the nearest vectors to the plane1 a3 v/ ~) K1 g, R+ U
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
: S) _5 |6 b( c$ W1 b/ LZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])+ I/ s7 ~: N7 i, l& C4 a
Z = Z.reshape(xx.shape)
# ^/ \1 E3 E6 |8 [# o
7 ?* g0 f/ V1 x5 c" X9 T& b5 B- Z+ a+ m6 p/ g+ K* q; E
plt.title("IsolationForest")
0 n! Y/ B/ y0 ]plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)
* v8 P3 U% K, Z: A2 R' l! {3 g5 K3 h
- J0 S! i9 `7 B& pb1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
1 ?3 d% M% E8 N% Y6 ^0 Eb2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
4 t6 i' f Y! X2 t' \, [c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')' @7 I* Q2 r* `% T2 B5 \# @
plt.axis('tight'); ]4 h* V# ^% k4 s7 `$ S
plt.xlim((-8, 8))
$ e% d" Q* G3 v! I( W$ _: Nplt.ylim((-8, 8))
# R9 n$ T4 R' |" O/ gplt.legend([b1, b2, c],- F& l* Y$ v3 T% h/ C( N
["training observations",
" T9 z7 g3 ~/ ^* a" Q ?5 q1 X "new regular observations", "new abnormal observations"],. C7 k( E7 n2 s- W. E0 `) [
loc="upper left")4 ~4 G% l1 m5 D( S
plt.show()
$ s' m) U- D+ h' y/ g G' r3 i/ `1
6 `7 o. U5 z+ e2 O% b+ z2
V( h6 x! @! \( h: k2 D3
% K, n) d+ R& G j2 L+ L3 U( q* d4
" A G4 I7 G9 u/ i9 ?1 O: N51 A! H$ z1 G" e% F
6
; \6 c/ U- J# S, _; F7
- ^2 l& s+ i/ M& e) \8
! |1 V! K! O/ V) @7 Q& F9 S' G4 R0 L/ k' p! `
10
: m# p& c% a4 ^, O0 l& {. t11
8 \8 q8 m* q& B" U12
7 {( r9 a+ {" G0 Z. B13
. s+ N6 \3 z4 Y14+ n" P H3 a" [
15
8 Q: }! {$ j. {/ m3 w3 T6 e16
' G- t+ E, `3 V4 ]* t$ L177 y* q* W& @# Y2 S; n6 W+ q
18
* a; h. b6 i6 I/ K19
! `. y. Q3 {* o3 _" ]- d: k20
* u( E% \8 i: o" @8 M* n& u6 ^3 t4 m; i21
1 R5 O6 Z* ]; U& `22$ ] W! t* M' O/ W9 P1 Z+ J# }3 p
23+ T# ^& h. F* W1 r' b4 _ l+ q4 b
24
_* x' K. F* n- F! d- [25
, U4 _$ S( O5 O; f9 m# B" p2 c26( A% m/ T2 ^$ ]) v- I* c
27$ O. Q( n" R, ~4 w
28
( v( c& w! j. W8 e* `29# P( n& |- X8 z$ ~$ k
30: F+ l3 u8 t$ V. ^; c" k( h
31
( ]) J; A7 V* M6 Q) k: u32
* t5 Y& a% h( i( ]33+ X1 I$ Z3 p# k4 z7 ~( E+ z
34% K* v, A; s/ e- O5 m: Q y$ f
35
: i% Q) A0 x( S) ^# I1 v: T36
2 ?: y" `8 o2 V. h370 a! E# O: g% t: W/ A: U
383 r2 \: [" t( |& A
39
% y+ [' U% s, q9 Y" c40
N0 _: p4 e7 Q! q41
4 U9 l1 @+ U2 l; u0 _, X3 I' Z+ S% Q- W6 ? N" E' h0 \, b5 X, v
+ r; H N/ A. T0 F4 u
————————————————2 N& C# i. i a7 K% W4 J
版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 o& ^. T" v. w' Q' i6 C原文链接:https://blog.csdn.net/weixin_50732647/article/details/112023129
1 E# @( i! x X! c) R
8 ? O! D* E" h6 V$ i
1 z, u% D, A% g' E4 Z; p( C' ] |
zan
|