- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55515 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17606
- 相册
- 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的直观介绍
" d9 Z% i4 c0 I7 z {RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
; ]* u! I- G1 |5 o7 j; d% W- U _* G9 Q
1 RBF是一种两层的网络
- u2 Z, C( _* C* p$ C! E2 D是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
* ^- s3 G0 I# R/ `yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) 0 p) b+ z9 |0 X
![]()
, {8 }( f: L* W9 z F) y% P![]()
4 w1 S( [4 k5 o* N2 RBF的隐层是一种非线性的映射
' B0 S! ^+ v% zRBF隐层常用激活函数是高斯函数:
9 c# Y& @4 C9 s* x: ]% V: C# n# q$ `1 d- B. e1 z( e) r. s
ϕ(∥x−u∥)=e−σ2∥x−u∥2
$ X4 _# ?, \! h- W' T* ^) F$ F1 {' m; O. H- F8 ?$ Y; M" ^
- [+ c+ s& k6 i& C* M
9 b: V$ l( g, k; F2 [3 RBF输出层是线性的# I S S: C- C6 Y1 p
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分& C) t9 Y' b! v0 z5 Z* X0 f4 W
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:! M0 j, v8 N* R
8 I) e1 {2 O7 @) C: ?) m
6 I5 b( Z8 x, [3 o9 {# ]. p上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。4 Z4 t {( o" J$ H0 Y
1 m ~# Y5 Y1 w# P8 t Q- V% URBF学习算法$ c4 M# r' m# N" ]
; H$ w+ k# z+ Q% m( O( n. p
K# [) B3 e" B& H
2 n- B! j* {4 R3 K7 j5 v( d
对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。$ i* Q! ]3 s# z8 F, E6 U( Z
学习算法的整个流程大致如下图:, v# m6 k! r3 S! H: O/ ?
<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/ H% H$ \, }5 K( I9 J8 X1 s5 X
, O7 {. } t/ Q4 ~5 c
) p8 Z5 y' U! c% c* Z" `" ~( T
具体可以描述为:
) i* L7 U% h" u7 S* h: P" E( H
) [1 x1 s6 E3 @: G5 r& X% F8 e: f1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui! q1 u: Q8 f4 K2 Z. j; {# b1 _
) o6 v5 t6 v7 ]: H8 S2 D
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
2 @) {: t b" P9 }* T! [ σ
2 R% r! }2 T4 d5 ^( k( I1 O9 G4 xi=K1k=1∑K∥uk−ui∥2
/ c* A* F! j s8 h }4 V/ b
9 ~, k6 y: l* B5 e+ q T2 ?8 \; O2 f8 l4 a; E
) h+ x$ w" g# w3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得0 Q% D4 S5 E; b- q0 t* w* n3 o5 O$ b
. Q( Q8 D: v+ s) `
Lazy RBF
' O* a7 f" w) K4 k8 X
% V3 F. B$ d! p% J+ j可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。5 p; e' o: M: P* L1 E
5 c8 x! x _/ ]$ N7 Y& _
MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。6 k' u0 V2 l9 A$ m6 I- t# F
& `1 G5 w* C& U% ddemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。2 U" C! e% k9 Z/ S6 L) L$ Z
9 E8 y: i; G( n! Y: K. Rclc;9 l. I( x! j* W& z; G9 y" s5 \
clear all;$ P( D) E# |4 y" r, D' t
close all;" O: j# ], n- L$ `3 f, ^
* R; m3 G* s* y, _0 _6 x%% ---- Build a training set of a similar version of XOR
i5 k/ c6 S4 _0 jc_1 = [0 0];5 o1 f4 U. g4 r" E
c_2 = [1 1];9 ` y4 i5 R p0 u+ L
c_3 = [0 1];3 h+ ] c/ A9 u2 Z
c_4 = [1 0];8 ^5 f! c+ j; c u3 r: A9 t/ d5 D
1 R% c( a( d0 K5 Y& B
n_L1 = 20; % number of label 1
0 l2 v8 n0 m( b F. T) E& y" r& Qn_L2 = 20; % number of label 2
, G4 K4 B. f0 R' F, W# i
, O3 U1 G) P z) o6 a$ O& l* \0 s# N. Q- c2 {. I+ I
A = zeros(n_L1*2, 3);- h% {- z; h q/ g9 \. b) ~( [
A(:,3) = 1;) I# w- V' [& \7 R& z. R
B = zeros(n_L2*2, 3);: k* }& `# X6 S- Z( L/ _
B(:,3) = 0;
2 A9 P3 t# E; M4 A1 r8 g7 Z6 {3 e4 H% H* K7 n. C" ]
% create random points: m+ N4 \ o6 A# P! x+ \$ B$ e
for i=1:n_L17 N( y% `. Y) G
A(i, 1:2) = c_1 + rand(1,2)/2;: F! t5 i$ C& A" Z' e5 P
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
; ~3 x9 ?, n4 d% \- D1 f+ wend& h( b- n2 x3 _
for i=1:n_L25 ?8 |9 W! L; ?1 J+ ]* h, n
B(i, 1:2) = c_3 + rand(1,2)/2;) d: a' P% F9 ^5 i4 g9 C, {
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
) y+ q* a! e# Q6 r/ |+ D' Mend
5 ^ J" K2 L+ _: Q
0 o' B! ~1 x; W% R8 g% show points
0 A, p1 Z+ b% W/ }$ X7 b+ M7 iscatter(A(:,1), A(:,2),[],'r');5 K) }! a' J+ _% H
hold on; |) D% `' C+ k4 @ h9 R* N
scatter(B(:,1), B(:,2),[],'g');2 F6 O4 N/ O4 x7 X) R
X = [A;B];* c4 n' O; ]; g, e
data = X(:,1:2);3 r- ?7 G% `1 z; y
label = X(:,3);
9 _9 K F7 |; n% F( y/ Q6 o7 A- M! r5 T0 u1 U' ?# b- q
%% Using kmeans to find cinter vector( |% o( L5 e1 [, h0 g
n_center_vec = 10;8 @. Z& G8 H# [( F3 X/ p
rng(1);
3 p: V. E9 h' K! ?% M[idx, C] = kmeans(data, n_center_vec);
9 h8 e# ^) r' Yhold on
) ~ I2 u( M! y' fscatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
2 g3 n) t5 K9 C+ l, j! k- C8 s V' H7 M' K5 z
%% Calulate sigma 6 E* n+ X% O/ u; w8 w4 M
n_data = size(X,1);
8 O4 x8 }0 z5 z1 D
: F# ^0 \7 \ e* Z$ r, `% calculate K( ]! F8 ~; I4 e9 e1 N3 b( {
K = zeros(n_center_vec, 1);6 M" I7 m! Z% _. M7 K- u% ]% z& e
for i=1:n_center_vec- ~! w9 \, Y4 c- \. N" @% ^9 w0 t: W$ A
K(i) = numel(find(idx == i));
3 H- Q: c/ O$ o+ V8 nend2 v6 `2 X3 @' v6 ~. d
6 O1 k# Q4 t2 u2 S+ ~. ~ f
% Using knnsearch to find K nearest neighbor points for each center vector
+ ?+ j" B* W2 a5 F& r2 W4 u* v& y) r* z% then calucate sigma2 z) D4 N; I. [: V4 L" V( b
sigma = zeros(n_center_vec, 1);
- j" Y& X+ a7 ]1 o! ~: [. bfor i=1:n_center_vec+ a, H# l. `; W/ A. N
[n, d] = knnsearch(data, C(i,:), 'k', K(i));
; `0 S$ N5 h) r$ f$ T5 }+ w L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
% k8 @9 q U% \3 t$ v L2 = sum(L2(:));/ i0 l" m# a, j9 v' P' c- g! {
sigma(i) = sqrt(1/K(i)*L2);
}1 \" @6 Y$ A9 ]# P2 Rend+ g4 |. J' ]# W$ X4 p* ?
' F$ f! S) |3 d: b& m
%% Calutate weights) {4 O( [3 [. t% u K2 Z$ ~* F4 g
% kernel matrix9 T2 P1 \. r! {- [# y) }; X( |
k_mat = zeros(n_data, n_center_vec);9 N; S a ?% C+ H
1 z: z( o& r' v/ C7 K6 m5 ^
for i=1:n_center_vec1 N) e' I5 U* e5 s
r = bsxfun(@minus, data, C(i,:)).^2;9 ~. v! p* T- _5 c* R
r = sum(r,2);. W# t, w. ]" L( U% q$ S0 ^
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
( E' |2 j2 s% ^( r( wend; s; z- I1 o: A2 H3 Z. ?0 m7 T, b: P
4 I& I" g' ?3 k5 D- y# i7 OW = pinv(k_mat'*k_mat)*k_mat'*label;
& C" h7 x) g3 e5 y% y1 D2 dy = k_mat*W;: { U. s( |0 _3 A- J! D6 {0 A: `
%y(y>=0.5) = 1;' _; W6 M! h, K! L! i" ?
%y(y<0.5) = 0;1 n& Y/ F2 X# {4 U7 @
3 Y) R, c* b/ ]& k \' k' \%% training function and predict function
; O" B+ T4 F4 A' w! b[W1, sigma1, C1] = RBF_training(data, label, 10);6 ^' ]! y* p" j7 C3 ~
y1 = RBF_predict(data, W, sigma, C1);
( t3 {5 R- S- v8 Z[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
# Z1 v' V. P2 _y2 = RBF_predict(data, W2, sigma2, C2); z* V- ?7 B2 p
a2 L5 O8 i% _: C P; h& V
& T* s: z% T0 B! {7 M7 ?上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。% }$ {; J2 v& p- I9 N9 H; u9 _
- d3 j. S# P# q5 Y6 H
RBF_training.m 对demo.m中训练的过程进行封装
' `5 a( |$ d" J* q8 c, B; N9 S6 t* `function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )6 Q _) F @: \2 g i
%RBF_TRAINING Summary of this function goes here! }" g+ M$ {0 N
% Detailed explanation goes here1 h# k2 S+ l' X
1 _: b' v4 @7 @- A& [
% Using kmeans to find cinter vector
( @* [' y( p3 T% } rng(1);+ H5 T4 T$ F' v6 ?* w/ G1 [( u, D
[idx, C] = kmeans(data, n_center_vec);
. P% S& {- [% u& f$ [& `
7 S- G p( F7 ?9 J. M4 M/ R, @ % Calulate sigma 6 D- E% P4 h3 i }
n_data = size(data,1);8 ~! f0 C. ]8 R$ [5 _
$ e3 a1 Y. |9 M% V! J/ z0 Z8 d
% calculate K
+ Y8 P' x; u/ |$ E K = zeros(n_center_vec, 1);
. ` \/ o7 C7 `4 ?3 I for i=1:n_center_vec; \- o" s# Q5 p& \3 b: z% m f
K(i) = numel(find(idx == i));
1 [3 ]% ?( i) |/ @' V- _ end- S4 V' W6 _9 Q% J3 n( ?9 M, @
; R% p- l( ?5 N3 e1 w G3 J+ f" K
% Using knnsearch to find K nearest neighbor points for each center vector
' ~- S* H9 C4 Q& l% o+ T % then calucate sigma: `. }8 Y8 k# i0 T
sigma = zeros(n_center_vec, 1);
/ l0 g0 g5 w+ M# f5 n% V. [ for i=1:n_center_vec6 c: ^9 l7 j) ?, i7 _8 W, r
[n] = knnsearch(data, C(i,:), 'k', K(i));
* o- T+ R9 \ N1 E B! | L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
4 z/ _& [- e* z L2 = sum(L2(:));2 @5 [2 d/ X8 j2 M9 i$ `) H2 \
sigma(i) = sqrt(1/K(i)*L2);5 y% p, E/ Y% ?2 F7 W9 e
end
" j' V# r d- ~ % Calutate weights/ \+ }$ Z; V- D% Y- t s5 N7 }
% kernel matrix
5 f) `' N V, A7 X$ d k_mat = zeros(n_data, n_center_vec);9 l( t4 V+ C$ J! |% P+ \2 F
9 Q! N$ Y5 t- B6 y4 [ for i=1:n_center_vec
1 C8 U: y; E# S; p3 }8 T; J* C r = bsxfun(@minus, data, C(i,:)).^2;' R3 `# y- g! M/ s7 q
r = sum(r,2);
/ _. W$ u& l# k( G+ ` k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
8 r/ e" `7 I8 w4 a end3 q, R% P: F* o7 U& w) G% I
1 d$ \. V9 _9 w5 _, T4 q! r* u% c W = pinv(k_mat'*k_mat)*k_mat'*label;4 q4 G8 |! o' O2 \4 F
end$ |4 E$ D* ] E. S
6 `" T) Y, }- O$ sRBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
/ ?4 a% |+ n \/ Q5 n1 k7 ~% R# F% R, b: \- w
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
$ }6 ~9 b- j/ `2 W' c%LAZERBF_TRAINING Summary of this function goes here
( l% y' a. c7 E% Detailed explanation goes here
# v! i; D% p& I9 ? if nargin < 3
) x2 h. F. E; J1 A6 Q$ a w sigma = 1;
" v% V$ s. P2 t8 k( @ end
9 h& J4 C0 {4 @, K4 S7 p# W( j
1 t& o3 d- B" v/ U# G5 T+ m n_data = size(data,1);8 B$ `& ^( P$ A
C = data;3 r; U* o" y6 Q2 I
3 x! j: @8 d" K6 r2 `+ { % make kernel matrix+ q7 |" v+ V5 J4 ^+ g6 B
k_mat = zeros(n_data);* m7 i9 F2 Z* ~' O0 l7 h% o/ v
for i=1:n_data/ Y3 \; D/ D+ [5 V
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);: X; A5 V* a% b8 I8 w
k_mat(i,:) = exp(L2'/(2*sigma));5 h7 q, d3 z- \9 P5 Z; E. Q, E
end
- X( i- \$ I K- }2 u- ~& z. f) M2 r/ `
W = k_mat\label;9 C7 `1 P8 r+ z
end Z B( r! ^3 a! O7 @' T1 {
- _% l) m& D% g. @RBF_predict.m 预测4 e# [, t! n. O6 \
& i n- m( G& \; G+ R7 zfunction [ y ] = RBF_predict( data, W, sigma, C )$ D: x8 w; l; z0 W: `4 n4 i, h
%RBF_PREDICT Summary of this function goes here8 x! A0 d4 h4 Y' K; v) c
% Detailed explanation goes here7 z# h. @ _: K) O& [
n_data = size(data, 1);1 `5 V" a7 w$ b$ j# v1 j* T
n_center_vec = size(C, 1);5 L* s! |: v3 e7 N/ |/ ^
if numel(sigma) == 1( Q( e% }; A* q& ~
sigma = repmat(sigma, n_center_vec, 1);0 g& I! ^5 s' ]# A+ {, m
end
9 h1 B3 x' S8 s% C
- I! w& Z( A. V1 t) g- A2 b % kernel matrix
, L! E$ l5 ^4 n/ [ k_mat = zeros(n_data, n_center_vec);( s) c" o( F8 q1 F/ f
for i=1:n_center_vec
8 T! M% q& o+ g& ^$ l( S r = bsxfun(@minus, data, C(i,:)).^2;! ?/ Y6 A6 N; O8 l+ r4 E8 a
r = sum(r,2);
9 T: \# C; _4 y% f" t& ]- C y k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
7 }9 i1 f( Y+ i8 j2 j- X end
0 v* y0 \2 U! u, @; ]
. T( G5 o9 D6 j( p' @ y = k_mat*W;
# Q1 s, F: L! Kend3 {% N1 J! B. \- w8 i0 Q' \5 F2 \
3 K; o* @: I$ E
————————————————4 L# b! S3 Y! F6 O3 s4 J9 `
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 p3 P3 J: `$ J' @9 e原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
7 [* D8 _- a* Z0 Z6 f- y. L$ Y( n8 ]4 y, X" d
' H& h+ O0 u! x! C. u, w$ t% u
. y9 Y; M. {- h3 n |
zan
|