- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55507 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17604
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 447
- 主题
- 326
- 精华
- 1
- 分享
- 0
- 好友
- 79
TA的每日心情 | 慵懒 2020-7-12 09:52 |
---|
签到天数: 116 天 [LV.6]常住居民II 管理员
 群组: 2018教师培训(呼和浩 群组: 2017-05-04 量化投资实 群组: 2017“草原杯”夏令营 群组: 2018美赛冲刺培训 群组: 2017 田老师国赛冲刺课 |
RBF的直观介绍
# _# `* ]8 r0 w+ S8 PRBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识# ~( z1 p+ @, P) q
- G& G! z4 x' Z$ l1 t: L$ X: r- _7 t1 RBF是一种两层的网络6 z9 F9 R& J4 e' J; z0 b" p6 H% C! i
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
+ F, z5 q) `: X+ S- m, V) Hyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
) k9 ^5 ~$ I1 ~ 5 h+ H7 h' ^. T
![]()
: T5 j0 v. g7 L* H2 RBF的隐层是一种非线性的映射1 u1 U. N4 }9 Z& u6 i
RBF隐层常用激活函数是高斯函数:' A: O3 [& {( a5 P4 X1 n
+ `- Y3 g3 t' _3 U" S& Pϕ(∥x−u∥)=e−σ2∥x−u∥2# a. S% t3 P2 B6 L: K
8 ~1 ?8 Y" n1 m b) e
4 a* g- s+ ~& X7 w2 ?2 P6 I1 x/ ~, m1 |$ i# x3 ~$ c
3 RBF输出层是线性的9 f$ D0 J+ [+ f. R3 G# j
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
2 B" W3 [/ ]# B7 m ?/ `% B! O. Z% BRBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:6 F9 ^3 N8 ~; [4 q! l4 q
![]()
) G# p' _ X+ {. q6 ^$ C: T. }7 |2 X* |- x3 y
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。$ z) h5 F% p5 a
! z5 n: ^& n% g* CRBF学习算法
z6 W' q" Q4 F- h3 J 8 t v2 P& X) I9 z5 ^7 P1 S5 ]5 Y
& r" x* a/ E# W8 m @& ?
8 A" v$ S7 ^* g; P6 g8 i对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
. P% x z& U1 Y学习算法的整个流程大致如下图:& i: n5 ^, c# f3 ^% R
<span class="MathJax" id="MathJax-Element-5-Frame" tabindex="0" data-mathml="W W" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; font-size: 19.36px; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;">WW8 m1 m: w5 X0 @% u% {% c- w# D9 G
, i. C- c& Z* f5 G1 a# `
0 L" h/ t1 H: h
具体可以描述为:; |* a! L0 ~2 L% z5 V
0 }( k( |& @; |5 u& L' |1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
, ]* }4 m: ?* o2 ?& w& j+ J8 o, f0 L4 [9 n
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
`$ d, Q+ X5 u; M8 H σ
0 Q, K5 C$ L' t- S# |3 u* j8 |i=K1k=1∑K∥uk−ui∥2
" d9 O1 C' Z( D4 \: o5 o" S% [" f" ^
0 X8 F2 h- B. C! ?8 `! Y
* O) R+ P, T* [3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得# F+ p& b5 [4 s6 W5 O$ f$ Y
3 A& W# e- c5 l3 T: f8 u
Lazy RBF
+ S/ A+ Q# v, c; t* M$ m# ?# Y* L5 N9 t
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
4 p& F+ F; ?( @% x* r2 S![]()
3 i+ A2 L i) j& ]MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。- g. s5 d$ M h/ O3 Q9 Z5 V
$ S5 m* s7 L* s9 a" Ndemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。+ v# \7 I3 @0 L+ R* C
9 g% G) p. g/ @* ^ @
clc;
: T7 ^/ @! z, l2 c J5 q8 h& Aclear all;
) i3 q" [( s: n9 q$ h) \" Tclose all;
8 A" g3 N) g6 W: j
; g- n( a! i" h9 s- _/ h%% ---- Build a training set of a similar version of XOR
( g5 x- ?8 V7 u' L& uc_1 = [0 0];
& n& x# d8 n: p4 h* Fc_2 = [1 1];
# A9 d+ M" k8 z/ g u _c_3 = [0 1];
1 J0 O/ \! C) q- a& Pc_4 = [1 0];
; i: L$ e6 a; _; q3 y4 Q! B
. H+ S9 s( D. A& R" \n_L1 = 20; % number of label 1
) B+ n) p( R7 i/ K/ O/ g) ^( `- Dn_L2 = 20; % number of label 2* ~( x: R2 D& Y+ U s
2 i# l& ?# G2 _* x- s d
! |( ] R- w; ^/ VA = zeros(n_L1*2, 3);
" P' p2 J7 c: D/ IA(:,3) = 1;. i' G) s0 p$ o. O! S6 N
B = zeros(n_L2*2, 3);
" p' }1 j3 I1 o( gB(:,3) = 0;
* K p' D! X. j. l0 m$ j
3 C9 m2 e2 K+ u, a% create random points2 w' m2 @, U! ] Z
for i=1:n_L1* q5 v5 q7 a" I2 A2 H
A(i, 1:2) = c_1 + rand(1,2)/2;9 s6 T( f$ P. i( X. L/ r, r3 g
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;2 f% ?3 A! V/ B) F% ?; t
end
, f- i: N8 F. {for i=1:n_L2
8 G5 d$ t/ h9 C. w- P: ^& | B(i, 1:2) = c_3 + rand(1,2)/2;
2 V4 }/ z* W+ F: o' |8 X- q B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
4 h& D" y8 K, {+ N/ p) kend' P( i) i( I; O! {
; i" p& {5 Z; n% show points9 \$ s1 u2 t6 a2 K: ]
scatter(A(:,1), A(:,2),[],'r');
: E* r+ C! j* d! W0 y' D: `hold on
G2 K( {2 S/ r" Escatter(B(:,1), B(:,2),[],'g');
% v/ h5 y" E# P5 w. H; jX = [A;B];
. Q: O) h/ {4 A0 v; V! I5 jdata = X(:,1:2);6 h% O9 Q; {- w& E. N, k* H
label = X(:,3);
2 o4 r3 W' S ], a/ L3 T& i2 }, ~! _$ a5 p
%% Using kmeans to find cinter vector/ X( A9 T. b$ C# I, a5 o5 y1 G
n_center_vec = 10;# c' H! B# \7 v4 X' V$ d
rng(1);) D0 E q, r, A! C
[idx, C] = kmeans(data, n_center_vec);
9 [4 }& J3 c, e4 e' l+ Phold on$ e" _: p0 R, \1 M: J
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);7 d. @+ L ?0 k% u5 o
$ b# X- Z) { C$ `6 d
%% Calulate sigma 7 h+ ^0 ]; } j- A6 \& o) ~$ k
n_data = size(X,1);
7 [3 y0 u t; |( k. K, \9 w3 Q* A. o- n; v1 [- ^0 {
% calculate K, h! a7 Q/ Q+ H0 C0 T
K = zeros(n_center_vec, 1);
4 _3 v/ T: O8 D* n' Ffor i=1:n_center_vec9 C) X$ _" N7 ~* s" i5 o
K(i) = numel(find(idx == i)); * u. Z: R- x1 |$ B& t
end+ C' b5 |7 V! O
+ _( I) J! D1 C+ M! J4 ?
% Using knnsearch to find K nearest neighbor points for each center vector
3 f1 N/ r' w- U/ Y5 `5 w2 t5 u% then calucate sigma
9 Z5 J4 H- d( f2 ]! s9 asigma = zeros(n_center_vec, 1);
! ]0 Z! I5 s( X+ s) ]( T5 u6 tfor i=1:n_center_vec
~% n" K; [" X$ w( K. w [n, d] = knnsearch(data, C(i,:), 'k', K(i));% N! \) l% k$ v: i# T' s
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
" y7 F( I% ], a) s: I- P L2 = sum(L2(:));
% C$ ?# j3 t8 [2 x+ q; F sigma(i) = sqrt(1/K(i)*L2);
; ~, @8 z' f! j& zend# M% {, D$ K. P; s$ y+ u. @( V7 \; J
+ l* N. X7 m: j& h: [%% Calutate weights
- ?8 e, D. ~6 [% kernel matrix
* ~! Y' }( e* \k_mat = zeros(n_data, n_center_vec);+ g! }$ S# P) q+ Q. S0 t( e* v
z4 d! U5 j- W" } ?for i=1:n_center_vec
1 D, q5 `$ I z3 V5 z$ l r = bsxfun(@minus, data, C(i,:)).^2;! z+ ]) N' J& n* J; O" | _: |+ N
r = sum(r,2);
9 Q M3 ~+ m; m; {' b& x8 c k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));$ @5 m0 h$ ]( f
end
4 ]9 N6 D' k! Z0 q
* I: m5 _1 }7 q3 ^$ _$ |$ p# GW = pinv(k_mat'*k_mat)*k_mat'*label;
6 }& k9 f- H+ i% s8 G4 X) @y = k_mat*W;
0 G0 G3 {" x, f. g%y(y>=0.5) = 1;+ Q! |# q2 p' w1 S
%y(y<0.5) = 0;/ f$ i6 [& F$ B: `, k+ a
; p4 ]; K; H$ a- G
%% training function and predict function
4 }2 V* Z2 \+ Z9 G7 P) O[W1, sigma1, C1] = RBF_training(data, label, 10);1 V* ?6 b: w6 }% L
y1 = RBF_predict(data, W, sigma, C1);
4 l4 a6 [& f, R# T. X[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
9 X4 y, I* _. W& J. ?/ d( \# F7 T2 Ry2 = RBF_predict(data, W2, sigma2, C2);7 u- n. f, n9 c0 m
) k( U: \% F& w
- j$ ?. f3 `3 t9 A
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。2 [5 ?! S- {0 ?8 l$ }
7 r, ?% ~1 o7 K1 H6 r9 u3 n. bRBF_training.m 对demo.m中训练的过程进行封装
+ ]3 Y# W2 z1 [: Q0 }$ Kfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )0 e |' r& K; B* c% P# B5 o
%RBF_TRAINING Summary of this function goes here
4 t" A; u6 o1 [: g. U% Detailed explanation goes here7 @* I% V) x8 s3 ^( |
Y9 o N }4 y % Using kmeans to find cinter vector
0 E* |7 O* X+ Y: ]( j, l rng(1);2 L) X( d, l0 C/ p, r5 M+ A# Z
[idx, C] = kmeans(data, n_center_vec);
9 ?* l Y6 r! ` M2 E. W- y: J6 X
% Calulate sigma
0 W2 l9 K6 H' x n_data = size(data,1);
: ]& X$ ~" O- Q3 Z; @
# R s- m1 J* n% N % calculate K
- L0 e8 f) U% g7 v. E K = zeros(n_center_vec, 1);
7 r1 R9 m9 P: Y8 l% J2 l ]# q for i=1:n_center_vec
1 q+ l' P% L( X# D K(i) = numel(find(idx == i));
5 t" M. W6 L( r- Q4 k3 d end' A/ `! l! V( H& a5 r+ N; S8 j d
2 B! p5 C# e: g' M9 Y- W) f
% Using knnsearch to find K nearest neighbor points for each center vector
/ K& L8 r. c2 R0 r- I % then calucate sigma
! V6 ]& n8 R3 `7 @# v sigma = zeros(n_center_vec, 1);
+ X) l: n- i& K7 A, E9 L for i=1:n_center_vec1 @. ~; f9 H$ o0 {
[n] = knnsearch(data, C(i,:), 'k', K(i));# x) e$ S, o* c
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
: K3 t" G8 F9 v5 ?5 P+ J& N6 u L2 = sum(L2(:));# y2 L4 O& C) O5 c% q6 c, q8 {0 d
sigma(i) = sqrt(1/K(i)*L2);
0 L) U, ]5 ~3 C! s) [4 I end9 Y7 H, M% g9 i$ r" Q' j! `
% Calutate weights. P* A8 M4 p$ b
% kernel matrix
D U5 h% |. w* R" _8 x1 ?8 X k_mat = zeros(n_data, n_center_vec);2 l9 V" w! S: c
: L; d @+ ?' ]' S, A8 \1 [4 f for i=1:n_center_vec
, q. L; q8 ^7 v$ R* X2 | r = bsxfun(@minus, data, C(i,:)).^2;2 {1 s& A! t% g* e7 U% S, D3 N7 J
r = sum(r,2);! A# |" N2 N6 D- c9 n3 l0 @
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));6 [; _7 J2 z8 z, e5 a! B" j. e
end
9 r$ k" M, Y+ `/ C: `' ^# u& O: l- ]3 L- R% v4 s/ J
W = pinv(k_mat'*k_mat)*k_mat'*label; j. ~! _, f6 M" o6 y2 F
end& i* U6 v& ]5 ^4 P, o
! t, |7 `" f' Y; o4 d; nRBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
; M% `# a2 T# |( ?7 i' |+ @
% d- v0 A+ L- _2 `' d8 I9 E$ ofunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )7 q) V( k. G! t3 C5 b# r1 n
%LAZERBF_TRAINING Summary of this function goes here
8 t" i. v9 F6 h' O5 w0 Z% Detailed explanation goes here% N& E/ ] q2 U/ x3 S
if nargin < 3
4 N- s. b. T2 [* O8 D sigma = 1;
( y* o0 \% z7 N( f9 }6 V4 s4 O/ r end
6 R: v- [! a& E& l2 n" P; l; e# ?! ?8 S
n_data = size(data,1);/ z, y3 ]* @$ `. o% f9 F6 W4 P
C = data;
7 S) Y3 A; ^! Q# d4 }" ?( E
2 e0 G# {: d$ u9 S6 e: ~$ J) q % make kernel matrix
/ L0 L x8 C/ j; q7 a" `8 a Z k_mat = zeros(n_data);
3 G! Q2 S: b/ |0 L" C. H+ c for i=1:n_data
4 G9 J( C# \* J$ c4 r L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
w7 D4 s) \ {# R! _7 k" S1 M k_mat(i,:) = exp(L2'/(2*sigma));! V: D) t. H4 Y( \* f% X0 d1 S
end
$ X4 `! @- G9 N3 A# u) V) d: M a# l
W = k_mat\label;: n4 q- x% d; O$ p* J
end
1 s0 F) j, `: @: w0 Q `+ ^. a) e1 P+ l) Q+ y) F( j5 Z1 G9 f
RBF_predict.m 预测
8 T9 A. [# p7 _6 a
1 t- G$ ?; x- A Z+ Y- L% o" w; Lfunction [ y ] = RBF_predict( data, W, sigma, C )
" }9 k @1 {+ B4 r z# O, y%RBF_PREDICT Summary of this function goes here
, V' e6 p0 Q& m+ }6 r' c o% Detailed explanation goes here
* {' |* Z1 s' d0 y5 H n_data = size(data, 1);
7 l3 V. g" g# C/ i. F8 U5 v n_center_vec = size(C, 1);. N) d0 n O( s! q( B3 g1 B- n7 e
if numel(sigma) == 1
5 @8 \/ r5 j5 r& k& x6 X sigma = repmat(sigma, n_center_vec, 1);3 K: r; E5 Z4 k9 m
end
% Q8 S/ j: ]) i# }1 Z5 c' D
* L# _2 D! ?7 Y) P % kernel matrix
8 |" I/ w, q9 A+ O) N4 y, Q! g k_mat = zeros(n_data, n_center_vec);
5 q- ~) A$ P( | for i=1:n_center_vec% ?( V% e, U4 ~
r = bsxfun(@minus, data, C(i,:)).^2;5 v- ~- U# Q0 s8 l" d) c& m
r = sum(r,2);
2 z2 b, M2 c& b/ p2 x k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));7 U" h, r% c7 x
end) @/ ?0 q9 w! B: p/ g3 D1 r
! A% Q/ z5 x; [' D: ]8 \& H: u
y = k_mat*W;
; A7 m5 Q9 M) nend
7 w* t& x. d5 u' I3 `: e
H, Q- s1 i/ w: @; k————————————————2 y' M1 h% s7 X% x# m
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 b- a# y9 @3 o4 ^" c7 q* }原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496# G6 T0 V& N+ m" k) S$ b
3 o( s. z) M/ I; ^7 u: }- I+ y- _, z5 z7 X$ g
3 _. `; {2 |4 L- t( B |
zan
|