- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55572 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17623
- 相册
- 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的直观介绍4 v, X! A H L3 V( w
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
: c0 s8 H7 S( F- e5 X1 \) k. G* z/ S) v: I
1 RBF是一种两层的网络7 i7 r. }1 A; e3 n2 K9 B( m
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
7 W" A5 v" o/ s4 y6 x, m0 x+ X$ hyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
! z' G! j p9 h N![]()
* K% q8 e, z3 h) W5 g7 i # V+ J: L* T5 o
2 RBF的隐层是一种非线性的映射
1 a$ d# M$ K% }9 r& O* p5 n0 ]" PRBF隐层常用激活函数是高斯函数:
4 |8 j7 j/ `6 }6 q6 n
5 ^2 K W) U" a3 J- Dϕ(∥x−u∥)=e−σ2∥x−u∥2
2 W+ W7 ^2 ]; b9 v; Y
' ]0 A0 k3 c9 G2 y) P7 ~
, ?# O# W4 H+ `; D* ]! J* {: K
- _& [8 E N/ L) \& F3 RBF输出层是线性的
' d" u4 F9 I& |4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
/ R( j( i; V; d" _( g7 }RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:) g: `9 ~3 V) R2 W# O
![]()
+ O: a# R4 |% C/ u) S1 s1 `8 P. a
! @- A2 z' ~+ Y' ]' ]- t R上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
1 m, [% |: c* |- @" t6 K5 J7 \, z0 y/ @. B* e h+ p
RBF学习算法
, \: U2 C" y: F# S6 K3 y9 @ ; A/ U2 a' |: ?& y- l ]$ N9 q
7 x$ I$ Z M) L# b n
9 {+ r2 |+ a. z1 c' q
对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。" S' o% S! _ j0 P' R" J8 z
学习算法的整个流程大致如下图:4 @7 {! _: ?/ j: m: 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
: d$ @ l8 O; W" P3 ^ 7 q% ]2 ]8 H. P7 z
' [; u! `. m( u% R' N( S
具体可以描述为:3 n& I: ?2 v0 \ ]( y
% Z0 _4 }7 v( b: u# F1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui; J/ s( }' P: O6 a2 B8 S I' V
& S& {' @0 f, t/ Y7 B; X" {. k
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]4 k: {; [$ ^7 K+ H- K# h
σ
, O4 v' M9 R! J7 |# Wi=K1k=1∑K∥uk−ui∥2
* `* Z/ H1 x* O8 L+ }1 G! v6 V K$ U) K, n9 } ^5 }
4 t/ E2 ~2 E8 Y7 H
6 W7 L: P" Z) C0 \+ b5 d& L3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
0 l; I `* g5 o
c9 k2 s2 ^; A7 }' TLazy RBF
! ~* @: {/ {% Y3 x2 M7 g$ [1 ^1 I" {+ T- }' r, N% H
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
8 d1 P# l1 m. \- q" d" b; z! b! c![]()
- V" @! U% \/ ~! v! T' F" z u0 ]MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。
* t! Y. ^! e! ~
6 n8 P& q* v; w9 s- y1 z Ldemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。5 u5 O9 ]' m7 i
3 l+ O& b& B: dclc;
w/ }( d3 o$ t) I! X4 V$ r% aclear all;
6 n- P; J# n: C3 Eclose all;8 d# G' C Y4 s
1 ^2 Q" ]! D: B- e
%% ---- Build a training set of a similar version of XOR
9 `# j4 R: h9 T1 m0 z* [5 G9 @4 Hc_1 = [0 0];; {& ^! _0 |/ |
c_2 = [1 1];3 \+ R2 e X4 I1 o% a8 O, }8 [' ^* N
c_3 = [0 1];
& z5 ?/ u, R- \1 ~* N9 vc_4 = [1 0];
: {+ `3 g# N* A& A$ O4 Y3 S9 t. ]" }' _3 C3 n" s3 e O
n_L1 = 20; % number of label 1% f8 |2 k& _4 q# o; w
n_L2 = 20; % number of label 2
( e8 I1 r& H# @$ H2 d- w6 n5 b6 N2 q, f' \7 R0 U/ L2 m
, X( ?: B8 y) }* _ G: g. TA = zeros(n_L1*2, 3);
4 g- U6 G5 z: w9 m6 R! ~0 Q8 AA(:,3) = 1;
, I+ W( g4 M" x7 C" qB = zeros(n_L2*2, 3);
! |" I* J& x& h$ }1 _7 FB(:,3) = 0; D2 d6 g5 f/ O6 D' Q: I
2 D9 F5 P% j+ a3 [* n/ f
% create random points
: T0 }" L+ l4 {; n! F2 ffor i=1:n_L1/ x, E0 W; L/ I
A(i, 1:2) = c_1 + rand(1,2)/2;; T; v# {0 a+ J1 W/ M. R% @
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;% l' P1 t0 w+ J% I
end
! ]1 h/ h6 ]; ^7 rfor i=1:n_L2' E- ~8 m0 w6 i2 P
B(i, 1:2) = c_3 + rand(1,2)/2;" v( V0 \3 d8 Q' n( q& W
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
9 c8 }6 M! P) y# oend
2 ?" L/ U- X% f$ H; h5 m% c2 a/ a8 w! I3 Z" E' @
% show points
5 T" G3 H, }; @5 Fscatter(A(:,1), A(:,2),[],'r');
% f( |- ]3 Q( E+ h2 bhold on" B3 ]: A' o! L9 J w' ?2 h' n
scatter(B(:,1), B(:,2),[],'g');/ g1 \# w- _7 F2 s
X = [A;B];
( B- E8 y7 A5 j: O C- w6 _data = X(:,1:2);) m; h: ^( ^* y) \8 r
label = X(:,3);. W& |7 {4 t. U& p
X" _9 {9 N; j3 o, @+ N2 v2 V! Y
%% Using kmeans to find cinter vector
; e5 C* y& u; Z5 V& ]& c1 E2 un_center_vec = 10;0 }, t! X# v7 l5 w" s4 k% x2 D
rng(1);
7 _1 w/ ]3 [6 |! [* \( s& ~[idx, C] = kmeans(data, n_center_vec);
+ U$ r3 _( O2 k( `- a. chold on
8 D6 u+ X. Q% R2 ^! ^: yscatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
- g% ^' ]) K- D6 ~5 k
( J* k1 S8 s2 u* y: t%% Calulate sigma ' z/ X2 ] @% u; @* W9 N5 V8 P
n_data = size(X,1);" n: m" l4 K+ S% k7 r) ]' E2 I! ~
- K( G0 _, x$ h6 I( c" w+ k% calculate K
/ E4 N: r4 y8 v- `+ |7 a# W9 z8 GK = zeros(n_center_vec, 1);
" `9 _6 C1 `0 V6 ?- D, pfor i=1:n_center_vec
, P0 m1 \2 j) e7 P K(i) = numel(find(idx == i));
( {# i6 G3 @' C5 ?; ^" R* dend
" y! F* x6 X* F7 r ?4 ` L; b3 t+ m5 Q/ v/ y- c& U
% Using knnsearch to find K nearest neighbor points for each center vector
% R, d& H& g% U! L& u0 Q% then calucate sigma
5 Y- s+ s) H$ z' c( b$ o, Csigma = zeros(n_center_vec, 1);
; T/ k: }! j3 F8 C, {for i=1:n_center_vec, ]* i1 d% j0 N+ r
[n, d] = knnsearch(data, C(i,:), 'k', K(i));
- n$ h7 q& E6 T: I' b, C L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);) ?" T% \( g! }6 s( h+ y% Y
L2 = sum(L2(:));! s$ [% L2 ^* [$ [
sigma(i) = sqrt(1/K(i)*L2);
/ C1 S7 B+ z+ G0 F3 _0 U( H& bend
; |+ }3 ]( t# i+ P; T6 M
_. X# {+ {7 C7 f" s3 @0 H%% Calutate weights
v8 Q3 |, [$ B1 g9 W& Z% kernel matrix
) V8 ]6 O/ c% c7 M3 Fk_mat = zeros(n_data, n_center_vec);
/ _- C. z8 G& ]2 M1 H! |4 |; c: @
- w! _3 x0 I. s# Rfor i=1:n_center_vec$ s* K0 o' Q) Z }, f
r = bsxfun(@minus, data, C(i,:)).^2;$ B k! S. [3 Z* r$ Y$ y+ l
r = sum(r,2);/ ~8 p0 d4 h, a- I8 Z
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
$ r* U1 B M8 A5 E8 l: E% g3 }. Gend
% r* B) t6 f- w( ?: p: g1 h0 V4 ?+ s0 J* x. `1 P
W = pinv(k_mat'*k_mat)*k_mat'*label;2 m! G; x, e: u& _5 @
y = k_mat*W;
/ Q1 ^( D, Y$ a# h( X! o; \' j%y(y>=0.5) = 1;9 ?1 z( [* k( @+ \: w7 [' b& J
%y(y<0.5) = 0;9 c( l1 d+ _, Z, w* t9 \3 I
c8 Z9 a7 \, y; y% c) ~# U
%% training function and predict function
4 \' Q8 v/ p) h9 T( A- H( x# j[W1, sigma1, C1] = RBF_training(data, label, 10);' D6 {$ D# v \8 u; y% @9 z
y1 = RBF_predict(data, W, sigma, C1);1 o0 V# s' ^) X2 m5 u
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);$ W. H; ?6 c/ H7 c0 l0 @
y2 = RBF_predict(data, W2, sigma2, C2);
' k% i9 F: G5 h. A# B+ x" B" R7 P 4 `) ]0 |* g: @
6 x. `9 M( m4 n' o. G# [上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
' o3 a$ j% ]7 T/ k- W0 b
: n) V+ z$ h$ M5 A/ F$ J7 k i4 v; CRBF_training.m 对demo.m中训练的过程进行封装
0 d$ H9 c6 C- M/ ~" H; G. N5 w; C& cfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )/ x/ G: ^! u7 h3 c7 D6 V
%RBF_TRAINING Summary of this function goes here
; _5 V. `- K- t: k2 j0 q% Detailed explanation goes here' e# H+ d4 F1 |8 }# Z
6 e t- P; F. M; X x
% Using kmeans to find cinter vector- s4 N" @9 i$ j: h" s9 l
rng(1);
! O7 h/ y" g S$ p" d- i3 f [idx, C] = kmeans(data, n_center_vec);6 L4 n" d1 R; Q. T: z
5 S4 F1 g0 ?( p* R3 T % Calulate sigma
' ]7 i% r9 e: L n_data = size(data,1);1 b0 X6 E0 w) f
0 h5 T6 `. l- p, ^0 d+ o4 Z % calculate K& M! }1 H7 l U1 K2 a9 f
K = zeros(n_center_vec, 1);5 ]# Q4 `* o+ @. M# `
for i=1:n_center_vec I! E! M& Y3 f( P: }9 B2 K
K(i) = numel(find(idx == i));
( J$ {, K* [4 s9 a# r: s" E3 h end0 S' H5 [& h9 [3 W/ D2 J
/ a$ L/ J$ u6 Q5 W % Using knnsearch to find K nearest neighbor points for each center vector! n2 M2 }, t( `$ h
% then calucate sigma5 w5 U8 [, y# O. x; F0 H: S+ _
sigma = zeros(n_center_vec, 1);7 Y( ^) x& Y6 f7 W2 e2 d; d8 ~* L
for i=1:n_center_vec
! [- ^1 g2 p1 L: d3 E; T1 E [n] = knnsearch(data, C(i,:), 'k', K(i));+ i: `$ m4 ^1 z3 O
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);& e, J S& |' x1 t$ S
L2 = sum(L2(:));& v; a# z+ v5 I0 W, I# |
sigma(i) = sqrt(1/K(i)*L2);, ?* Z6 ~3 |6 v5 A( ` M+ ^
end
1 G0 u' V$ O. h2 Y % Calutate weights
: d/ h6 A" o/ b; y& Z y( E$ u % kernel matrix: @5 U3 ~7 ]0 R
k_mat = zeros(n_data, n_center_vec);
2 @% ]. U" Z* H# n' M+ t; v: ?! w- N' y ?
for i=1:n_center_vec
6 L9 w l" E8 N+ { r = bsxfun(@minus, data, C(i,:)).^2;
" B1 I3 @+ c# R% H7 {8 V! |, l r = sum(r,2);
, p* X. K0 |$ L+ V: a* s k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));+ S$ J: B5 [6 `$ U6 ~
end
* L* h; K, ~8 V! r# w5 v/ I( p4 D% B$ D; `+ N j( C
W = pinv(k_mat'*k_mat)*k_mat'*label;
( T, q5 W1 a- S6 V, m( y3 m. Xend
( S6 q1 R( _$ r: y0 ]: \9 Q
% }8 V) X0 s* Q% E0 aRBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
# l2 V" U0 G6 F* ]0 r
. w" {, r9 c/ O; U5 Yfunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
6 b! ]0 k" f1 i# D% l; G%LAZERBF_TRAINING Summary of this function goes here& s% _ R9 O$ o
% Detailed explanation goes here
" k+ p" H' a& @2 v0 [ if nargin < 3% P# P+ q' o7 x7 q1 h$ `7 M9 j
sigma = 1;
' T ~1 E, I* C3 d7 j( q end
" k+ \. }6 {$ \# x* z& u1 t5 }% A, Q2 Z j# b6 J$ ?: l' [
n_data = size(data,1);6 r8 S( ^% q2 r, B
C = data;
, |& Q1 ]) {1 U+ r6 k2 X) }5 x f3 L) B3 p/ \9 A0 j/ o$ y. r
% make kernel matrix
) e6 W2 _: J0 O k_mat = zeros(n_data);/ c; X& I7 G/ W
for i=1:n_data; ~: T. e$ `" O6 o* u% v! ~4 [6 k
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
4 m T% E" j% \# Z7 e; v2 l k_mat(i,:) = exp(L2'/(2*sigma));4 B! {9 ~7 @ G5 u
end
- }- r) p. L7 [& ]7 Y1 P! o2 A2 E' N
W = k_mat\label;% Q7 e3 i5 M: o1 ?7 R+ t; n
end) Q% }! [ _, U; L! Y$ v
8 ?7 T, ]) l4 SRBF_predict.m 预测& L! c9 h; B. g% ~9 q
) `# }& A5 `$ w3 y- p( C* \function [ y ] = RBF_predict( data, W, sigma, C )
1 @$ e* z, P% v9 {6 R%RBF_PREDICT Summary of this function goes here4 ^9 Q8 j) t; r# G) R* L1 `
% Detailed explanation goes here
% P! u8 j! H1 z9 q | n_data = size(data, 1);+ R& S+ c0 s2 ?/ U9 ?
n_center_vec = size(C, 1);% d8 }1 i& l. ]3 m
if numel(sigma) == 1
+ h1 B: m7 v* f& v- K/ E9 p; Y sigma = repmat(sigma, n_center_vec, 1);
1 u3 o* D/ G: N4 ~7 ` end
6 a* I8 w r) o+ {! O, ]' p: ~+ p
- r8 r+ u$ l' x7 i % kernel matrix# S, r% d; Z) _, Y0 }
k_mat = zeros(n_data, n_center_vec);
1 N" q4 g9 K! \% y5 p for i=1:n_center_vec9 f8 G" E" v0 f% }% ^, G
r = bsxfun(@minus, data, C(i,:)).^2;4 `$ O$ ?& t, g {2 J; a
r = sum(r,2);
% S( g8 a" d/ R6 V k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));) J4 O! }( W# L4 n& \4 g) H. ^* O
end
8 m4 _' X! S; c& z, A* w: ]3 g6 Z
. t" o' {+ T, m' C5 c1 q y = k_mat*W;
/ e* }! [: a: M8 F4 `6 Jend
[; @, b# ~4 P1 Y
5 s$ u6 Z2 D, u+ X————————————————
6 z* T4 B! a: L( e% w, ?/ E3 ?版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( m8 M; i$ ? P5 J0 M9 ^原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
2 a0 f C0 i& R- A+ k. l/ \- i! r
# G0 l* _" P K1 \, n+ ]/ h
8 R* l; G2 p) O* G( t/ v1 w
6 e+ u* _1 e; m |
zan
|