- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55525 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17609
- 相册
- 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的直观介绍
! l: \8 I/ w+ u8 v; vRBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
6 o" I% b# G% X5 }+ y9 g
% H4 W* M0 }, Y, @& Y1 RBF是一种两层的网络- J3 [5 q6 n- f! @! S
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
; Q) A! Y' u# t, x! j# gyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
" x4 X& {* V" C![]()
' Z" E$ ^' ]( L3 U3 {![]()
! c) J8 u2 v, a2 b2 RBF的隐层是一种非线性的映射' e' X% g. y0 S; u$ Z$ n
RBF隐层常用激活函数是高斯函数:/ P$ l( @) U$ ]
- V4 z* ~" _( G# X0 S; G/ M
ϕ(∥x−u∥)=e−σ2∥x−u∥2
" X- A* H. V% Q: T. {# c: X
/ e; @. n* v: f: Y6 s1 {' |+ R2 W( c/ c! X" H# @
' g. \7 w" s3 \ ?- _$ F2 a3 RBF输出层是线性的
+ ]9 q- M4 s5 I4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分/ I; i! S5 X% o6 E! N1 I
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:& ^$ q `- p. |: J; g$ ~+ |. y
+ T7 }1 q- {) O S
* }/ |, i- z2 I/ K
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
3 k8 n9 j& ]# _$ s5 E3 `7 ~- L. A9 I. `" W9 Z, b9 a: Y# ]
RBF学习算法* |; y- C7 P# [- {
![]()
( B) A3 Y4 [ \- e8 }! K3 C+ \8 T6 V! N7 l
V$ f3 [3 e+ E% f6 E4 T5 v
对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
$ _" h' \! k3 i% Q1 R) Y学习算法的整个流程大致如下图:7 u! t: f, E( W9 d* S5 w( j
<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;">WW
: U; Q1 l/ E) G![]()
# Z A2 w7 Y1 W. _+ c9 _$ y6 v: f7 ^1 k
具体可以描述为:/ h1 b% U0 ~7 ]& \. f
1 ?2 w' e$ v' v9 r/ N4 X1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui% ~& Z8 b5 \9 G4 T# e* f
; _# M% D; j! k2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)] Z- o8 `9 i/ ^6 k+ N
σ7 t1 q2 l) D4 z8 \+ d, [3 Q- f! K
i=K1k=1∑K∥uk−ui∥2
; K- O5 f' E" d5 E- d
" G: H! c/ l2 r% \* S
. M7 O' F& S% S1 M e/ I7 ~
- m' Q% K+ |& }3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
" X* _$ V# y" p5 m' p" |! B, e# O. D( ?$ X
Lazy RBF5 S2 o# P2 C$ c, b
+ a' L4 Y7 C# x3 i+ |9 P. [
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
9 {6 g4 P. ~( w![]()
+ H6 _+ E9 ]& X; L2 MMATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。
% H% k( @- a4 F3 J
6 Z1 v. P) N& Y$ Edemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
- D4 w2 v, R, D* ], ~9 v
0 u1 W; `+ R2 ?clc;
: s! K: B4 ~' y! |! G8 J) Dclear all;
; O! ^, D- Q( f5 k2 `0 B& Fclose all;
( Z- D# x& Q9 ^2 \* P. y2 i2 w# e$ Y9 g0 z
%% ---- Build a training set of a similar version of XOR
0 [8 ]+ Q" |/ q* S1 p. Rc_1 = [0 0];$ X, x- N5 U% z* E# O0 D( B
c_2 = [1 1];0 `( ]2 q; f- p. j
c_3 = [0 1];7 E8 P* B$ q S. H( X' R0 n: R
c_4 = [1 0];( i$ K; r. ^" F! D* _
1 q3 z6 E* t- ~. E! J! L* Y" Z" mn_L1 = 20; % number of label 1* s- o+ f" K" G4 N& l, P# R8 v5 q
n_L2 = 20; % number of label 2: ^" Y- l7 x3 _' z6 g$ }
/ T4 \% R6 f0 R
9 z8 }9 M! l8 M, g' u# ]A = zeros(n_L1*2, 3);5 X+ W) q/ Z& S6 D
A(:,3) = 1;9 {, S4 z$ c" B( Q7 A
B = zeros(n_L2*2, 3);1 p! q/ X. p+ h; r, ]; K1 k
B(:,3) = 0;
9 i( X9 H3 K/ Q: h' @
4 S( \% a- `2 m1 T$ M% create random points R$ z+ F$ o. |' i
for i=1:n_L1
9 ], \; y# U: O3 [, y ^( t A(i, 1:2) = c_1 + rand(1,2)/2;
, l5 D3 s$ q/ P8 N A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
: b8 z* u% y. J) L$ H0 R" Qend
6 F# Y' N7 f: y8 n4 ]" ]( @& O: vfor i=1:n_L2
7 M2 w; i9 E) p6 o/ k R W B(i, 1:2) = c_3 + rand(1,2)/2;
( ]* _9 M7 }8 }' _# q* e B(i+n_L2, 1:2) = c_4 + rand(1,2)/2; d, F- c) g8 i6 Q; i9 j: ]
end
' l9 W {$ Q. O8 w9 C- U! A# @( t% _& J9 |/ o8 o; U
% show points* }( _: P# @4 _& }0 f) B
scatter(A(:,1), A(:,2),[],'r');
+ N0 S9 z/ E/ L9 Zhold on
- i8 n& Y/ S2 `3 F2 Escatter(B(:,1), B(:,2),[],'g'); a! b; P8 E, G7 U
X = [A;B];. n& H% A Y4 B5 S" D" D# a `
data = X(:,1:2);
0 Y+ I9 \/ e6 j# L: j: `3 Dlabel = X(:,3);
0 c" m9 h. m, R$ K; G1 j8 ~, f: ]
%% Using kmeans to find cinter vector
. ^; A7 y# h5 R6 Q- An_center_vec = 10;9 r5 y9 Y5 B/ T" ]
rng(1);# T* P$ o! @* q1 x( K4 W
[idx, C] = kmeans(data, n_center_vec);
0 ?& @0 z1 ?+ Q! i3 e9 p, n2 `hold on" c: V( r; p- _- A9 T" ?6 K+ W
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);1 j, p* Q4 @( S$ Q
- i" h4 R7 x# f6 Z%% Calulate sigma ; [; B1 w" W, e) L7 h2 M+ i/ o
n_data = size(X,1);) Z, I0 Z0 R( C& j% }. Z/ z$ ?: M) _
/ g8 r7 e4 ]( `& E% calculate K: M* M& ^2 V) x! x2 T% U4 v
K = zeros(n_center_vec, 1);
/ D1 V0 g6 h9 l V6 zfor i=1:n_center_vec
1 u1 {/ F8 v/ E7 g3 L s: _& J6 W' z K(i) = numel(find(idx == i)); 1 s) d% A' |: l% L* U
end4 d1 g$ L5 n7 c" e$ E* ?- `
- t; h# S- G: {' l9 R. n
% Using knnsearch to find K nearest neighbor points for each center vector
2 e6 v8 U- H a4 f% K8 D% then calucate sigma! Q4 `0 o: A+ g5 l
sigma = zeros(n_center_vec, 1);
; I# b' x2 x4 l, x M. S' _. rfor i=1:n_center_vec
$ J+ G/ o) W' h& L3 q4 m' e1 _ [n, d] = knnsearch(data, C(i,:), 'k', K(i));, b" [+ q2 M2 S% l- E
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);2 t9 j" P1 w2 d* F) w
L2 = sum(L2(:));& d& A6 ?) n! G9 B1 b
sigma(i) = sqrt(1/K(i)*L2);
( r/ {5 K* q$ ^end
$ K* k) m3 K- q1 J% B+ a9 n# t+ v$ f. _' }0 F
%% Calutate weights' @% Y; e* Z: ?) n$ E* e" h5 ~
% kernel matrix
2 H" e- `* ]" J* i* `, gk_mat = zeros(n_data, n_center_vec);
% @! \5 `, v9 r& a Z' E" }# Y: w7 Y- ?: _' F( l! h0 y4 a
for i=1:n_center_vec
) E1 g( E9 \2 ^) { r = bsxfun(@minus, data, C(i,:)).^2;
9 u, W* [2 Y$ E6 X; x r = sum(r,2);
3 c2 ^4 K" s! T, o9 _" O2 B6 y3 ` k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));5 Q; ]/ Y$ Q: r
end; P* m' a) [1 H' C; g
. Y9 K2 v# B5 j1 F* Q8 |W = pinv(k_mat'*k_mat)*k_mat'*label;1 B/ H. u; N- {5 U" j- P' C0 g! S
y = k_mat*W;4 A& L4 W4 g! N- M% S! {3 N
%y(y>=0.5) = 1;2 C. B$ v9 _. i( P1 s
%y(y<0.5) = 0;$ l+ ^% v% j5 u3 e
; C' Q& t: O% V# _3 q%% training function and predict function0 Q1 S5 l- d/ j4 w y# c4 m
[W1, sigma1, C1] = RBF_training(data, label, 10);4 l5 d0 `0 T0 u7 T+ H# _0 Q* `
y1 = RBF_predict(data, W, sigma, C1);
% V6 O0 x: U! V* ~[W2, sigma2, C2] = lazyRBF_training(data, label, 2);$ v i1 p+ y* n+ B' E' |) I
y2 = RBF_predict(data, W2, sigma2, C2);6 u" s0 e* B \* n, ~' E e
, S2 A" M6 s+ W( r; \
/ W& f# U$ x7 A o7 M/ x上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
, C* w, Z _7 \" L: i+ d' E+ N# _) k4 s
RBF_training.m 对demo.m中训练的过程进行封装+ C; x% a" }. @5 _
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )$ o4 N/ ~! Z4 B: H
%RBF_TRAINING Summary of this function goes here
0 u7 u" N* `( S) }% Detailed explanation goes here8 g; s9 ]5 Q4 `1 o$ H3 t7 T4 t
- l/ V4 t J6 p6 k+ h' Z% i
% Using kmeans to find cinter vector2 s# U& I4 j; \( L7 [0 N
rng(1);" {$ M: N4 @! z
[idx, C] = kmeans(data, n_center_vec);1 W; W5 C, L% W: C% m* [0 ]3 ?
- ?( @" b8 \( s% h; X$ k5 G% ]
% Calulate sigma * [' m8 @" m, D, i) u+ H
n_data = size(data,1);! |4 j/ x( S$ H# S" L
8 D, m' v% N$ o" t' z+ a % calculate K
3 l4 e3 U6 ]$ y% v; J$ a+ c, e' { K = zeros(n_center_vec, 1);7 o, B- x+ k' F% D, O
for i=1:n_center_vec3 @ u1 ?& A$ L9 g# ~
K(i) = numel(find(idx == i));
& u% j1 M9 G4 S) O end
2 C$ r4 @/ T1 U- r0 B
; P1 v* M0 S n2 J. H0 k % Using knnsearch to find K nearest neighbor points for each center vector2 @8 T9 T ~$ i5 P
% then calucate sigma
7 o- ^* T# b& S9 w: l6 j) U sigma = zeros(n_center_vec, 1);
7 Z* z4 z0 [9 Q/ f/ Z for i=1:n_center_vec0 @& P$ w( E7 r( P( K/ x, g6 s
[n] = knnsearch(data, C(i,:), 'k', K(i));
4 T' U E: P3 P) _ L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
( i, C w8 @8 N$ x7 f2 o* Y7 v L2 = sum(L2(:));
2 D& G$ f! f$ C) A# T sigma(i) = sqrt(1/K(i)*L2);* l' n/ c) c9 p8 A5 x/ R: |
end1 j' l- L9 t' Z: n1 p" _
% Calutate weights5 r6 y5 o# `9 k: [" d' L' p- o' d
% kernel matrix
# Y7 H: N; ~ x k_mat = zeros(n_data, n_center_vec);
) x0 D# Z% _/ p' u1 |5 i0 P, A; z' B/ W
for i=1:n_center_vec
* k6 d. C8 |3 A; t: T: a8 d r = bsxfun(@minus, data, C(i,:)).^2;
$ W$ Y; ~) s" z. h; i8 K+ o r = sum(r,2);- a6 z. S) l9 \1 k' Y T" I$ B! k
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
" ], n. Q( U' M% ~" k3 O% R" F n end% W% O) H) K4 e: K* }& Z
! Z2 S8 F, w: s+ e" e* V5 W% f' ^9 S W = pinv(k_mat'*k_mat)*k_mat'*label;
/ P4 Y5 O( E* ^9 j( w- Dend
% c7 @# F! T2 l# P" c2 y& Y5 {% P- n6 m% k5 k, z
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
/ ?) L e# T3 l( J3 F% u/ W) H1 U" z& N
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )# X, L% D" C! i# d/ `8 A
%LAZERBF_TRAINING Summary of this function goes here+ I# d6 E# o, p0 f& ^+ Q
% Detailed explanation goes here
8 o) a/ B8 x9 q! ?6 } R if nargin < 33 F( z8 u7 C; ~& I: C8 r
sigma = 1; % N7 y( y8 k/ N' A! s
end
% P1 c: j: |: [8 q" C4 m; ~+ ?
w; L! t$ T) y) `" L n_data = size(data,1);
& S- c- r3 K/ \+ e* n C = data;
, z7 c5 L/ ?1 W" i( B% z/ J* j- ]% U% b! A5 @4 ^, ^& E) ]
% make kernel matrix8 m% t4 f. @' g
k_mat = zeros(n_data);- j, d1 q# q V0 ]7 e1 f5 ?( v
for i=1:n_data
+ v$ B* D/ x& I% ~/ Z L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
8 x w( n y. ~% N+ y k_mat(i,:) = exp(L2'/(2*sigma));
5 v: {& a& L3 ^: i# `4 P8 r0 I# i1 T end. k6 k; I, }- J
6 w) p0 g1 S: G( ]9 F" D# f W = k_mat\label;8 d0 G' w' X0 f" x( s* D' e
end
4 q, A" n$ O" k8 a# e' W3 O
- l: b- |1 ]6 _. p+ `RBF_predict.m 预测5 p& O" ]9 r# }$ Q' M: \2 @5 w
7 I! S, ~4 ?- M1 u0 ?function [ y ] = RBF_predict( data, W, sigma, C )2 z3 j8 Y9 z) j. S8 @) w/ J
%RBF_PREDICT Summary of this function goes here6 C9 x- b/ W5 z. l
% Detailed explanation goes here
9 y. B6 \' P# j' l n_data = size(data, 1);$ `1 Y; Y# n) h, b
n_center_vec = size(C, 1);8 @5 j! c; j1 c/ b2 p
if numel(sigma) == 1# j8 S) T$ s) \
sigma = repmat(sigma, n_center_vec, 1);4 ]/ ?' i+ y2 t }* J: e( ^
end: E4 a/ |1 R- B/ v0 V( E
% `3 C* h: j5 u' Z" H+ r% ~2 }0 v % kernel matrix
2 ?& v$ u) t+ }! D( I k_mat = zeros(n_data, n_center_vec);
S+ a+ w$ K' y4 _3 [7 t1 g* e for i=1:n_center_vec
, Z: A" y: r8 |" m# d8 a r = bsxfun(@minus, data, C(i,:)).^2;* C; H7 T5 I! V: D6 [8 X% K
r = sum(r,2);
/ s7 ]& v. h0 e8 t- S3 p k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));. R7 H6 E0 G6 e
end3 a# @/ G& S2 @* V
" m- e4 W- V3 i5 m% p/ V2 R
y = k_mat*W;
, J+ w+ P* s! C/ B5 T+ lend
$ ?! v! ]) \0 l- j N% i
$ ]8 ?; R8 x# ^————————————————. O) ^% n# f t! q- g' [" |8 {! S
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" d, Z8 m }6 t! M原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
$ d6 N* }7 @: j' S0 r
% K3 {* F7 S) c! C
: F( B" y, p9 N6 p$ @+ G2 J1 C n
|
zan
|