- M$ l. k2 r. g4 W6 D3 ^+ S * E$ y; d j" L% [大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!9 U: w3 n7 }- {) Q# q9 j% h. W
) m. `3 r3 C. X$ R
, z X [1 H4 b! x) U. h
3. 基于距离/密度' r5 R+ t. i6 A/ K
典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点。+ Y+ K0 c" E! x8 w
7 C) M! H( u% W3 h, N' H1 N J4 B" [, D3 m
用视觉直观的感受一下,如图2,对于C1集合的点,整体间距,密度,分散情况较为均匀一致,可以认为是同一簇;对于C2集合的点,同样可认为是一簇。o1、o2点相对孤立,可以认为是异常点或离散点。现在的问题是,如何实现算法的通用性,可以满足C1和C2这种密度分散情况迥异的集合的异常点识别。LOF可以实现我们的目标。 C. s% k9 G$ q
( F. T% C1 f% S7 v
0 z. a5 \8 A- t9 m s
) Z6 q7 ]# `9 x: V, E" V
" ~6 |9 i% a; Z' r $ N' _6 u( u3 q/ \/ N, ~ e ; j" |, o+ c4 { G8 k- j8 f0 x- r4 d
; F! q* H5 ?7 E% U4. 基于划分思想7 U Q* ~+ `2 l# l8 L) k/ U! O3 m
典型的算法是 “孤立森林,Isolation Forest”,其思想是:- ?0 i k8 C" I+ |" R9 D2 o( s7 \! g
; }7 c6 ^; D- w! T* H$ S' M* e. Y5 F3 `% a
假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。! X$ R- i% P9 E" n- ?) ]* H
1 E2 C7 z- o/ ^6 Z
1 U8 `, _' m7 X# j4 O- h这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:! Q; k. I' z; f& S2 O3 r S# T
/ U" L& [ _) N3 \1 E A , j, g% i. i- ~: T/ {* Y/ ?import numpy as np1 h) q7 L' n- f; j3 y
import matplotlib.pyplot as plt7 M1 v5 Q+ h: d6 l5 }' ]
from sklearn.ensemble import IsolationForest : A ]' h! K5 @4 z6 s% l; U3 w* s# |! t9 c
# u# B, L; x7 K/ N# a6 s ]$ ^rng = np.random.RandomState(42), z& l* z! ~1 Q' E
# {6 `" F+ l. x8 n ; `0 m# r8 ?" w6 a$ _- O# Generate train data , S' ~5 p* e3 n/ Q2 H0 t* |& F8 @# aX = 0.3 * rng.randn(100, 2)2 o; v7 ^3 N4 ]$ ~9 l; t$ Y
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]4 b0 S+ J! D$ I) F
# Generate some regular novel observations* |" z3 L# ?9 v" K, j
X = 0.3 * rng.randn(20, 2) 8 y' ?5 p+ P* Z- @X_test = np.r_[X + 1, X - 3, X - 5, X + 6]- j" J& E! F! i: o
# Generate some abnormal novel observations ) @. z# M( ~/ {( z) T. Q6 qX_outliers = rng.uniform(low=-8, high=8, size=(20, 2)) @# l) q7 a* K7 y9 A* ^- Q" ~; ?2 m$ f
2 ?! [# m' }# k# b
# fit the model 7 P. N# z4 p8 _0 Y; Hclf = IsolationForest(max_samples=100*2, random_state=rng)8 l, U6 y9 E- t
clf.fit(X_train) 3 g2 N8 v, ?9 {y_pred_train = clf.predict(X_train) ]) I- @( G* Q
y_pred_test = clf.predict(X_test) $ p1 z9 g8 c$ z, y& i. T; U: jy_pred_outliers = clf.predict(X_outliers) . O' f( M# q+ a6 B1 N1 }, b . k- N& Q: `5 A+ o. j% O/ O% e- a5 t0 v, F9 ], R8 O. k
# plot the line, the samples, and the nearest vectors to the plane & r4 F* X3 ~6 f# hxx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50)) 5 s) W# X2 {0 P5 Q: |# OZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) % D8 g& J3 F7 j/ o# _ a9 K3 hZ = Z.reshape(xx.shape) # O9 I. a6 ]: I0 l& W! P8 d$ G2 C6 E# O9 `
/ n6 M: y0 N" H" p7 z( J
plt.title("IsolationForest") 7 W. u: g* d- a/ uplt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r) 3 b% i. S0 |2 S$ Y % ]9 L2 l5 L. ~1 M& t* D5 V4 K) M1 v
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')% W- a3 C; }5 R& x( `! z# R
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green') : Y! c# w4 P" H6 cc = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')6 r- B- R) j8 k9 o
plt.axis('tight')6 m) H7 o; C1 `+ K, i
plt.xlim((-8, 8)) ; F' S7 P& ]% g" S/ mplt.ylim((-8, 8)) + h) N& W% ?6 ~* k: B/ `plt.legend([b1, b2, c], ' e4 }% r. `# P5 [ k2 }. F ["training observations",- A) o9 H1 q% {' a" T
"new regular observations", "new abnormal observations"], 1 M. R8 c7 }7 F" f1 A+ Q: l& W5 v loc="upper left") 5 `$ i$ j6 y% f1 W8 `/ G8 Mplt.show() 1 ]6 F' W, U6 u2 _) P- M0 X4 O19 s! C* Z/ J( l( J! b. C0 z
2* J' \2 h* _ H2 @
3 ) ]" s' a0 N1 ^4 S0 q1 U2 {/ @; `( u5 * ?$ u3 e0 E! }+ D" f2 l9 g+ J67 b& V. g/ [$ m$ S+ O
7 . l/ |( @# r! R& \" d8 `5 X8 ; s) ^6 N5 f9 t g9 ; y% x. D" u: K- Z102 S2 J4 y; Y0 K; Z1 X
11 }% F9 Q9 i, G. ^9 {12. k: E! V5 b$ O& I2 F
13 $ Q; H: \7 S6 ^. j& o# ]% k14. `& W3 f% K O! W: s8 c
15, t: i& V5 |; ^& r6 ?
16. v4 Q/ F& i' a( G! | o
170 C' w' X y. u7 W
18 8 z8 g/ F7 w# f0 t0 y1 g. ^4 R194 o4 V- C4 h4 ~# H( U# s1 p
20 ! z6 _" C# z, m; a218 x# D' S8 c6 h0 o/ A- y" X
22 , O/ ]. T& F' y0 m23/ W0 [& z' N8 Y# W: d( b8 F7 a
24 % `% z4 ]9 ^+ C! ?25 . p* M* l0 D! ^26 7 p% g9 l- @3 m4 f+ Y27 1 a/ S/ ]/ v, S- a% ?288 e) ^+ a" H* D0 d, v
29 / Y6 h) {( U, E& W- |: R30 ; l5 X5 [$ `! J. `: {31 % o9 |# x$ ~8 z- t9 V. P* k) B# M32) ?5 y1 n6 @% w' s. g3 X8 ^
33 2 Y5 D' l1 h9 f7 o7 r# E7 F34 ' W) A' `4 ^7 |! F" E. a. Z6 R35$ x: t7 i; e) a( {7 Z
36 , L$ w& f3 \3 W# [. i4 H37 # m1 @+ ]. F1 H4 R: u3 o. f u% g38 ( b4 b, @8 t3 V7 r7 S2 M+ w) n2 y39: U) W$ S; s3 m2 x9 H
40! g1 L& }, v0 ]1 g# g" \
414 L4 t7 K0 h' U/ D+ @6 P. q
( t, Y `$ t, f1 [' S6 R' O
- ~5 f$ H0 p( Y9 w8 A
———————————————— % u+ V1 I/ H: w) a版权声明:本文为CSDN博主「数模实验室-教你学建模」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 6 I5 `8 y% `7 v原文链接:https://blog.csdn.net/weixin_50732647/article/details/1120231290 z& q0 M( N: M! L