- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55580 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17625
- 相册
- 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的直观介绍
" G2 j' s3 P, x* ]1 x9 \RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识% X2 f! }: T2 Z) B
. K$ E1 k4 `4 L) C9 p4 H+ x
1 RBF是一种两层的网络
6 M" A: [3 L$ [: k9 O是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:/ }# S3 h- h- c
yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) 4 L6 Q! Q) l5 r7 `
6 D7 j1 [9 a( n! L6 y2 w* h; O
![]()
( H7 ?& Y. s1 P- |/ k2 RBF的隐层是一种非线性的映射7 ~7 R7 h3 U% F# l; _ Z! L
RBF隐层常用激活函数是高斯函数:
/ P+ L2 c% w2 w( U8 v# I( H. g" v7 P
ϕ(∥x−u∥)=e−σ2∥x−u∥2
: w/ \2 i/ h( s" k' K4 t3 ^! v6 b; o5 H5 x
& u, f* C ^8 Q3 {
* n2 b' ?% b5 U( `
3 RBF输出层是线性的
# r+ J, J8 u ^2 K3 c6 Y4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分) S& X2 m, t, g" i6 P
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:$ H, C% V( c1 P R3 D# P
- O, b( f6 N; m, E& ?2 w4 }8 l
; w& R) }* A6 {. O& r( K上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
: h+ w' ^1 i* M6 d. ?, r# l8 {, o3 V
4 Q1 k( O- b* e3 D: J+ {5 K" cRBF学习算法
. H# k+ D9 \; n , e% S7 b) ~( y$ Y; `
% t7 l ^8 _! H$ ^7 I5 S
/ Q$ j+ t$ D0 t3 a8 [7 _6 ]6 _) N0 u' J对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。& C; i5 I* ^) Y0 S$ P
学习算法的整个流程大致如下图:: H; w5 p$ H% S- q6 }
<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
L9 M- L! ]5 Y ( V6 U' K+ G* H1 P& S# m$ e! G
3 s) M* G' [8 ]' {
具体可以描述为:/ E( t& W; C$ C5 m8 }
$ L, r# q& y1 n" Z+ [! c8 K& x1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
% {3 V J) L0 ?: C4 v
; I( A9 [: T. E8 b5 z2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]. ]: m+ t) `" U7 V: ~- H
σ
+ ~, L* o1 U% ^7 y' vi=K1k=1∑K∥uk−ui∥2, E$ a t1 V/ \1 l
# l9 J9 ]! Z9 J* |3 ~$ }9 |. o+ k! h7 e/ U5 c3 T
" Q) O6 y& i+ r5 \2 e2 Z6 x3 B
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得: q K! @3 R! Y8 X0 F3 o
: @& a+ K, V. c/ m8 Z* \' a
Lazy RBF
' `' y& @- C, A& X" [; G; N
. o1 @9 ]2 c3 r- s) E! I可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。( T! f1 U% x, Y3 J7 l$ P f1 n, ?
![]()
3 U, v; }- R' {+ PMATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。
" B0 k0 h9 q7 N
0 H8 ?) j# v! s) ddemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。# X; V- L4 m) l! o9 u3 ?
& m* W: v/ o0 `7 J. I+ C% b- z& X
clc;- E) ~) _: I8 @ o. _. R9 r! a5 s
clear all;
; Z* A8 O+ V Aclose all;1 d/ m! Q9 h/ j. ^
" c2 f j% w# O! N- J$ m5 C* x* G {%% ---- Build a training set of a similar version of XOR
- P! Q- b3 _$ V* {+ u& pc_1 = [0 0];0 N1 h V' v9 r4 X9 {' S
c_2 = [1 1];9 B* h2 L2 e1 _! f
c_3 = [0 1];
0 ` ?0 k$ `6 F" s! Tc_4 = [1 0];
+ C& J8 K: U7 N. p2 n+ F
# l; X* a% y$ a0 g+ {7 p! o" I& \. {n_L1 = 20; % number of label 1* K, \4 ]: G' Q9 t: O
n_L2 = 20; % number of label 2
4 o. M: q8 X0 L) m" ^
" N+ s# l' x6 I9 a H, ]; S6 T+ v& I8 Q9 C7 F# v
A = zeros(n_L1*2, 3);' m/ j7 f& P" `( L: i
A(:,3) = 1;. e' V+ p2 V' y5 w' D
B = zeros(n_L2*2, 3);+ H- \3 [- T, t. J
B(:,3) = 0;7 @4 t$ a/ O3 [! x
* T* X* O. `9 r7 Y8 {
% create random points- k( {, d* D' }% W( m; U
for i=1:n_L19 u0 B4 I. [% B) z
A(i, 1:2) = c_1 + rand(1,2)/2;
" W. h: ~/ q3 M" g: q- O A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;- M- j1 U( ]7 {
end& n" \ a9 Z2 m9 Q$ U5 |0 [% b! e
for i=1:n_L29 w+ r' t u9 ~
B(i, 1:2) = c_3 + rand(1,2)/2;4 C$ ]& T! m& Z- T: @2 h U
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;3 { B( V) _, ?
end- t9 {: x0 C1 D, h, c& O3 {
' `0 ?& K; E& w+ n- b. e% show points R1 E2 [% h8 V7 ^# P" M; O9 F w
scatter(A(:,1), A(:,2),[],'r');% B) H% J* Z' D' w7 K7 l$ B9 |
hold on: d7 v d0 F' e6 U
scatter(B(:,1), B(:,2),[],'g');
1 R) \; m2 P; c" c6 \X = [A;B];
" ?; |7 s( a' X/ {/ I( M8 xdata = X(:,1:2);" O6 r* r: k$ r' e+ R% C+ M5 M
label = X(:,3);; }8 w! Y4 }% U7 t* M' }4 C2 D
4 c3 M* a7 x( R: Q. _3 A# W/ h
%% Using kmeans to find cinter vector
2 i6 g3 l, A7 Y$ R4 {n_center_vec = 10;+ x: W* h4 g/ M3 D8 Q' m
rng(1);2 d& f* A! D( t6 I8 ~
[idx, C] = kmeans(data, n_center_vec);0 U2 _: o5 k% s
hold on) Z" w1 s! `) e+ ~
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);* w% o1 b V ]& [. Z5 E+ Q
- z$ ?/ y# l. d. O a) W
%% Calulate sigma
4 u' k; J9 D5 F- yn_data = size(X,1); f0 p! S/ {0 V0 s
* H. s( Q( c* e/ `2 E- V6 C% calculate K1 X0 `' f! P' n( x' ^- A$ v1 S
K = zeros(n_center_vec, 1);7 H, Z& [2 y: g: k# j' F8 F& B
for i=1:n_center_vec
0 O* a% p$ h4 v! m+ @ K(i) = numel(find(idx == i));
. `: s- d3 d/ Kend
) \+ h4 i, N, b: L$ u2 e
% Y& M3 N% c( N) e# k U, w% Using knnsearch to find K nearest neighbor points for each center vector
, O. d. i$ z# u. m% then calucate sigma- I) H6 Y) k; S' a$ }
sigma = zeros(n_center_vec, 1);- O& A* R& [- }
for i=1:n_center_vec
! B7 D( A2 W$ g. N( \3 ? [n, d] = knnsearch(data, C(i,:), 'k', K(i));% m$ c5 c2 U- a8 ~1 [% J3 X
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
, I- |: ^2 [2 A) V; V L2 = sum(L2(:));
1 V- @6 L! i+ R( Q( K sigma(i) = sqrt(1/K(i)*L2);: X- T! ]: }6 r1 z+ ^ C, w+ b
end: G+ L1 c# E* `/ P/ B
- d2 L6 i( b* N7 L& f( f%% Calutate weights$ c5 `& @" T- [ n+ I. j' z6 d
% kernel matrix
7 g( |* ^, Y0 r+ xk_mat = zeros(n_data, n_center_vec);0 L* |+ O, t" }
5 V8 f5 L0 L6 m! C2 N2 m
for i=1:n_center_vec! J5 y- O: W7 z. O1 a8 N" E0 Z! m) j
r = bsxfun(@minus, data, C(i,:)).^2;
) Q* ?) G6 _% ]* P$ W/ i8 g r = sum(r,2);0 U$ \" h, }% q% x# o" ?2 Z$ J
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
/ `9 s4 w/ T; x, O! kend6 Z$ _2 J) N! E
. B9 H2 N" h6 }% }! g& p
W = pinv(k_mat'*k_mat)*k_mat'*label;% u: V- I8 W9 Z6 n1 F3 t
y = k_mat*W;; V1 p4 B& C' X
%y(y>=0.5) = 1;
2 `5 ?" ]8 \6 T6 Z+ b# g( w%y(y<0.5) = 0;2 z1 P8 ^* U2 V
6 J. V8 n7 f- e. s9 C2 u%% training function and predict function
( @ a, I2 k# J9 w1 k[W1, sigma1, C1] = RBF_training(data, label, 10);
8 o7 v T4 ~0 `5 x- V2 S- Yy1 = RBF_predict(data, W, sigma, C1);* _! N/ l0 a* k \
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);' E! s7 x* ^" _2 `
y2 = RBF_predict(data, W2, sigma2, C2);1 B# s0 _' V& e' p
![]()
; L- G; \8 U8 z( C& p3 f+ S
' N4 }4 N. M3 e/ D! m上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
. c( d: x- [* A, L1 k8 J4 u! M W1 w) U( m6 d
RBF_training.m 对demo.m中训练的过程进行封装
; h; {. ]0 ?* L" l& S8 Cfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )
5 m f% S6 F0 T7 x%RBF_TRAINING Summary of this function goes here6 i; y5 t/ i0 t# M8 ?' v
% Detailed explanation goes here
' V5 S, m( I8 C* O% A: A; T5 Y
3 k2 {* y, t& S# I% C0 y % Using kmeans to find cinter vector6 M# R1 m6 }" p0 [0 l
rng(1);
$ ?8 M% q) b- x! A x! J [idx, C] = kmeans(data, n_center_vec);" v. G( J) H" ]
# m( Z' m0 d& r: h# Q0 C8 h % Calulate sigma % j `+ {0 Q4 h) M! `
n_data = size(data,1);/ W8 c. h9 e" _9 _5 m/ d. e u
9 I' Q3 ?& x4 A* Z2 u! L7 J. ?
% calculate K8 O7 h1 G8 a, P" K4 j
K = zeros(n_center_vec, 1);$ `* {. J L7 C2 o/ V/ y
for i=1:n_center_vec
6 O8 |% o- i2 W' N+ O K(i) = numel(find(idx == i));
) V) N. P V) _1 w7 Y. m end
! g$ l v5 [; R; M& H9 S n
7 ~% P* ~/ A! ]( r/ } % Using knnsearch to find K nearest neighbor points for each center vector
8 P+ X/ k# Q! z; [6 d N) I b" q % then calucate sigma+ S' G$ j8 z1 T# [ `" h# B
sigma = zeros(n_center_vec, 1);
8 H' n3 F6 T t6 n6 i6 Y/ l ~ for i=1:n_center_vec# A! i" g* O# I1 ]* i: h' h' X+ z$ F
[n] = knnsearch(data, C(i,:), 'k', K(i));; J5 t- L' p5 g! {+ @ `
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);1 C% \# r) ]) Y9 o5 O
L2 = sum(L2(:));
- d3 l+ S$ _6 Y7 d, k sigma(i) = sqrt(1/K(i)*L2);
/ y) y4 M. p S2 k) @3 E7 F3 r$ d end2 R K3 W# `* I g6 J8 Z5 g+ v3 F
% Calutate weights
+ H0 j5 Y7 F3 i | % kernel matrix
+ G! D. V E6 g2 c, { k_mat = zeros(n_data, n_center_vec);. g9 E* _: F1 H! t
, r7 g) Q, q* ]/ {1 r
for i=1:n_center_vec& n& o! W: l' z$ G, U
r = bsxfun(@minus, data, C(i,:)).^2;
5 M6 ?# I- ?, g V% K% k! q9 R3 ~ r = sum(r,2);
$ Q- o; }; N1 t# X& G k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));, M# p; {' s# L. w; l
end
9 F W8 B. ^' o \, |
- E' u, D% s: R9 {5 T& H W = pinv(k_mat'*k_mat)*k_mat'*label;
, C" e0 k, Y+ P: t3 W% o' E$ send$ h! ]5 W% ]5 t7 O7 k1 ~0 r
e3 _+ f9 _ s" ~" j- ~( _RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
0 Q; U1 z/ j9 L
5 A' W" ^& B: V7 m0 C4 Qfunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
9 w6 z* S% ?2 Q% I; O%LAZERBF_TRAINING Summary of this function goes here
# y+ @0 f* I: T6 M2 a) U$ y. `% Detailed explanation goes here3 G2 s! O$ l2 S4 h
if nargin < 3
1 `$ L7 w2 F8 e, G; ?2 p$ y2 U& E2 i sigma = 1; 0 u; _" y( R3 `, u
end$ z# K, D0 G) g+ g' ^' c
: Q* @* e4 F# G9 L- |3 K0 q n_data = size(data,1);% H6 u/ N$ m- B& Y+ S6 O5 N
C = data;
6 r( H2 h) p# e: Y! V5 N* h, q) p/ p0 V1 X5 W
% make kernel matrix* y% H$ a$ r# s9 V g4 Z
k_mat = zeros(n_data);
" L9 B4 ] _; ~6 ~2 ]% J for i=1:n_data0 b/ H" ?8 P: A8 r7 L5 O) b, {
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
9 x: U. l0 U+ _; Y) q k_mat(i,:) = exp(L2'/(2*sigma));3 H% _* y; H3 H0 N9 S) H) A
end
G" Y2 p j) M! `2 o
2 }! z6 K# R) v% f( @5 @% ^8 I3 x+ L W = k_mat\label;
6 M7 u& M8 e7 L, n2 n" ^" ?end
, j, m! |$ N" U0 B; T, O2 R, X
! I1 n0 R* g$ ?: F1 B0 n5 l2 O9 jRBF_predict.m 预测
4 a% t) i0 z" c" Q, g) v9 k. }
; h) h! T, F1 ^+ Sfunction [ y ] = RBF_predict( data, W, sigma, C )
! _. M6 d7 G0 p4 f6 r%RBF_PREDICT Summary of this function goes here
' N1 [, g* b6 r" b% Detailed explanation goes here. b( s$ v0 U1 x; ^/ }3 |
n_data = size(data, 1);& m( O1 `6 w1 ]; J
n_center_vec = size(C, 1);
1 ?7 V3 U2 F' y3 g% o/ |. D* ^ if numel(sigma) == 13 x4 M' \( V( N# \& `. H
sigma = repmat(sigma, n_center_vec, 1);
( h' l& X+ U0 Y9 y7 u" G8 I end: }2 o- T0 e; G* {
) w$ ^) z( p/ b, [
% kernel matrix8 s8 N5 k# {7 D0 s2 }" V* H
k_mat = zeros(n_data, n_center_vec);
, Y! q: \6 b! B. g7 b, n% Y a2 ~ for i=1:n_center_vec; d+ t8 M; s. h' E' D2 r3 L' {
r = bsxfun(@minus, data, C(i,:)).^2;+ [1 m8 Y6 F/ H. j1 N6 {- m
r = sum(r,2);
+ v ?, U' ^' S k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));) ?& Z7 z5 F+ |3 s6 \, ^
end
9 |6 K& e% k: U
7 w2 C/ r* w+ h y = k_mat*W;1 e0 v. a$ ]0 J" u b: l. ^
end
8 \, n9 [; ]" A4 R
; F; V( H$ t0 P9 h7 ]0 U% y' e, R————————————————
0 h' u t' d; u8 g" s版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 t0 o0 ]) b; @7 w) p原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
/ R6 y- {# R5 e" ? @* w! X; k( C1 ]1 w& g
2 }9 B& ^; b! a) P) b& w( O A( f* `0 a1 y& V7 U' Y4 Q4 k
|
zan
|