- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55570 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17622
- 相册
- 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的直观介绍3 n C1 g9 h7 E' g; E( c
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识* k& X( n1 G3 M& W; `" Z0 v' n
1 ]& F1 A9 M6 Q/ c! a1 `- M7 e
1 RBF是一种两层的网络
* m, |) W H( E* h! g: u- z是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:5 _/ m5 [2 V7 ]' ]4 a3 X+ D3 U
yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) * q) ?" S3 L9 [3 a6 i" k
5 }' R7 \. D4 O- p* E
![]()
( b) z; x) v! K0 h: y# v! ~2 RBF的隐层是一种非线性的映射
- D0 z3 X# ~ B' O0 FRBF隐层常用激活函数是高斯函数:
g- L2 k% A% t; k
7 [7 M+ r/ B! d4 P$ d, u8 R* pϕ(∥x−u∥)=e−σ2∥x−u∥2% r, O2 C4 k2 ?$ n
) l9 o/ S5 l5 {6 T% Y1 l
! V, c% M# H5 g. h
6 R6 a6 _5 {5 e7 b3 RBF输出层是线性的+ N( m. [5 F. I
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
0 ^ h3 c+ F3 g; M: B4 O/ O NRBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
$ g7 X, R% t* S8 p+ u* M![]()
. d5 W! p- J: l6 ~1 c$ \' H3 [' Y D! ]
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。0 A) P& P Q0 t! `8 @
/ T( w. f; T! T3 m g$ h" f9 F3 F; U
RBF学习算法
, `& N+ ^8 {+ G7 E![]()
; Y5 R. F7 r( R; u* _
! v0 Q' w. U Z; F) |1 \7 ?( b4 y; y0 U; g' r5 s
对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
; ~0 _8 f) p8 E3 D学习算法的整个流程大致如下图:6 x/ r) P X- 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
" }# k2 |, P3 Y4 p3 D; K% H![]()
7 b( G' \/ D2 h3 j- w% h% b6 D$ z5 i* E( D) A4 J) j) g) Z8 M
具体可以描述为:
8 K5 T* {8 ^/ ~! d
3 @8 S7 C. j6 g1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui$ y) ^' r( G' B3 ?- c
0 Q- j" k5 c' A% I+ [
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
^/ I$ I& N1 A$ T8 f* E+ [ σ: k# W" U; `8 i M3 |" p: z
i=K1k=1∑K∥uk−ui∥2- V: M1 d& A5 L, c7 q
: q3 F% B1 I8 j# d% a4 p+ J8 K
9 N4 s3 y/ Z, H
, m' X ?' W$ ?" ^- _% w3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得6 ^# d5 \1 J7 Q& p/ Z/ a) V
2 |4 Z+ q; l5 L- j& _Lazy RBF$ D! M8 b6 c8 [9 l* {4 N% J
$ |3 F- y) ~1 G' Z0 w+ q1 f可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。) N4 u/ F8 T0 }- {- |" T/ o; V5 B
" k" S- v ]2 ~: f& J3 j
MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。$ P% P/ w$ G4 f: \' {! \4 n) h/ b
$ j+ X5 }8 a3 Z+ t# J; Zdemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
$ F# J- e7 y3 \% E9 F1 X# j0 k! n' c; H h) Q* M8 F) g$ H. [
clc;$ r, i$ U: I0 c2 p" k
clear all;
; S$ F$ J- o% I7 \" m' K3 |+ g; Qclose all;
) \/ L+ R: Q' g$ i! l
" V% }; ?5 [' Q1 ~' b: ^%% ---- Build a training set of a similar version of XOR
2 Q; r3 O4 F, \1 X/ Y2 X( c/ y3 ^c_1 = [0 0];
4 P9 ~% b9 t1 Q9 d' Ec_2 = [1 1];% u7 Q9 z2 [. _. [% ~% u- |
c_3 = [0 1]; ~! G* U p* Z% x; V% Z
c_4 = [1 0];7 V+ _/ w- c: ~+ p$ X# e
# Y+ o& T$ o% J9 v: |7 w! cn_L1 = 20; % number of label 15 s) N" f9 q6 ?8 c
n_L2 = 20; % number of label 2
& u8 v- k, p- i) j! ]5 X8 [5 t) F# C; Q+ H. w! K. z; \
, ~8 h( o3 p( y) AA = zeros(n_L1*2, 3);, i7 w6 ?$ p; ~6 ?* \' s
A(:,3) = 1;( x! q2 V. y) r7 c+ c
B = zeros(n_L2*2, 3);
% P& J) n8 ~. y) z3 m XB(:,3) = 0; L) n9 D& [: _ P1 j) u
+ _& \0 ]2 |& G* E/ {
% create random points2 Z. Y* E. n/ w+ j
for i=1:n_L1
7 f# h6 ^+ N& E9 I \+ G* f A(i, 1:2) = c_1 + rand(1,2)/2;
3 b" K) ^# Y8 d9 v9 t; t4 E A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;, ^/ P: T: Y, l# k( U3 K
end/ u S, }; O+ g
for i=1:n_L2
9 x9 R/ x1 r! Q B(i, 1:2) = c_3 + rand(1,2)/2;
# i4 M3 [) {- o" Y B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
- k1 V/ W7 I8 A) send. R" b- W) D/ g% P4 u$ i, T
2 H' f( A; c! R* r
% show points
t9 F4 W/ { ] pscatter(A(:,1), A(:,2),[],'r');
) r: h) R$ S, J1 U8 w$ u" ^- Lhold on
/ e, n4 B1 G. S+ X5 ?0 Dscatter(B(:,1), B(:,2),[],'g');( A8 H* m/ I( G1 R
X = [A;B];" F( _$ M. m: C5 G% `$ U) f5 g
data = X(:,1:2);. h" Z8 [% W& t5 V( ]3 k3 W9 j
label = X(:,3);# T, s. p& ?1 B$ F4 o
9 e$ } i5 l* {%% Using kmeans to find cinter vector
# r( r# ^4 p; a! @, _n_center_vec = 10;
+ t* Z$ i; }: ? P: ?, lrng(1);
# o4 M2 U: Z( u$ C7 A[idx, C] = kmeans(data, n_center_vec);
0 w( N+ G* _! w: Chold on- _1 r( M; _, W3 M* N, A5 a
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);5 ^; [8 A1 h- G% w+ O. v( {
' y1 n8 _& u* B1 O$ c
%% Calulate sigma
! p) A2 D$ W0 l. ^/ X1 nn_data = size(X,1); q* `) i2 L0 p, X' @
% z2 U, h2 ]3 ?; d8 ]4 [3 i5 @
% calculate K& K6 M- _6 c5 u
K = zeros(n_center_vec, 1);
8 f, F$ l* p" q; r1 D' ifor i=1:n_center_vec
. v/ _# |+ p7 a: Y* ?2 q1 J K(i) = numel(find(idx == i)); 6 q, L! b7 j3 B
end
% U- [8 N4 r' F2 w2 `
- ~# ^1 i* T* Y' S0 |% Using knnsearch to find K nearest neighbor points for each center vector
+ y' `% `; j- I" O' V; D% then calucate sigma
4 f; ^% p; L! b) `, E* K2 K) b- Asigma = zeros(n_center_vec, 1);
3 n- A7 R& t% l7 s4 I6 {for i=1:n_center_vec
m, D" D5 v* {( [5 h6 P [n, d] = knnsearch(data, C(i,:), 'k', K(i));
3 ?' A# Q3 Q F. r L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);; X/ S: t; F; e T
L2 = sum(L2(:));
# m) b. `7 H- V sigma(i) = sqrt(1/K(i)*L2);
8 J1 @) `0 w2 `8 V9 n# o9 ]6 |end
4 c2 d' ]8 y- U. T7 ?
5 R d9 g+ ?5 f! S0 M7 E%% Calutate weights
6 D& Z2 b c, d! F" ]' n% kernel matrix
( K9 f/ R' o3 Ik_mat = zeros(n_data, n_center_vec);
1 |; U, e% |/ V E+ j7 d8 R" G. }$ J! H/ `6 u. T/ F
for i=1:n_center_vec
1 d' ~6 f5 @( X! b4 E8 Q( q: d r = bsxfun(@minus, data, C(i,:)).^2;& o8 @/ _, ^: F8 a7 O
r = sum(r,2);
$ c4 }6 y p6 T6 x* m k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));% a, t- M2 D- _* ]3 w8 O
end
5 y0 A4 `5 ~) g' |0 M$ x* _! F
# D. B5 [+ x5 Q% m7 fW = pinv(k_mat'*k_mat)*k_mat'*label;
* u9 C7 {6 Q/ u( v2 i+ D2 n/ [7 S7 ny = k_mat*W;$ {; U6 C1 }8 q1 v! i
%y(y>=0.5) = 1;
, ]3 l& i8 ?+ J0 t* t2 f%y(y<0.5) = 0;
& L& }( C& N8 l# F: e; c) [. }9 Z. ^* g. [+ u+ X9 P h1 {0 t
%% training function and predict function. g! t5 _* N$ | i k
[W1, sigma1, C1] = RBF_training(data, label, 10);
; i0 C) b( L. [ E |# _y1 = RBF_predict(data, W, sigma, C1);8 P3 u7 S8 q$ z; ?# R
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);" Y# h' D. W: V i ?+ A
y2 = RBF_predict(data, W2, sigma2, C2);
" y+ ^! r. D0 L0 ^9 }$ A( \* Q![]()
0 E+ J9 J# z6 w6 N! L
" J) ~9 s7 I$ P8 F7 T% S" ^上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
) v0 W! _% ~$ @ m/ [* N0 H" K! D2 D
RBF_training.m 对demo.m中训练的过程进行封装
, w H. _2 L$ f' z' nfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )# Z- Z5 F2 w. C+ Y `
%RBF_TRAINING Summary of this function goes here! l& D3 g7 `& D" ]7 S- f% p
% Detailed explanation goes here
$ ~6 D; m5 `0 i. l% t E& K) m/ B
% Using kmeans to find cinter vector; c+ N) |6 G& c( i; D. p7 P
rng(1);
! W0 ~+ g6 ?& d* Q4 }$ T [idx, C] = kmeans(data, n_center_vec);" X+ D0 i2 ]: W3 C# \ M
2 U2 [/ _( I0 R0 I _' {" x" S' I
% Calulate sigma - @! z) K9 ^$ A- D. Q V1 f
n_data = size(data,1);% T* }5 C+ q m: E5 O
0 I. d1 ^! N% ?% ]8 { Q
% calculate K
6 K1 F( e$ N& a& y K = zeros(n_center_vec, 1);+ X5 B& u2 G8 G, U
for i=1:n_center_vec
. t. n/ p0 V* P3 f1 z4 ? K(i) = numel(find(idx == i));
; l+ p$ o" D" G3 O2 _$ W! K6 ? end6 V/ e( g# m5 q# R
: [" @8 x+ W" J7 P- z' `3 } % Using knnsearch to find K nearest neighbor points for each center vector. I( F3 l0 r0 i v$ ~
% then calucate sigma
/ O* C8 c5 |* e$ E sigma = zeros(n_center_vec, 1);
7 m; r# G9 V1 Z+ S. n for i=1:n_center_vec
' S& B( ^+ ^( N, T+ b7 x% C [n] = knnsearch(data, C(i,:), 'k', K(i));
, I1 n; {3 v2 \ L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);; F! r: k' |4 |- Q1 j: F& Q
L2 = sum(L2(:));4 }. D7 x$ G! m5 G% u
sigma(i) = sqrt(1/K(i)*L2);2 r# H; L6 m! O* j3 T
end& R% J! Q$ {! g% _3 t! W9 J
% Calutate weights
+ M( Y7 @# W; L6 Z) O % kernel matrix0 @" w; \3 {' l) B
k_mat = zeros(n_data, n_center_vec);+ }6 q' }$ I! h( K5 U+ O' A
* P. }5 h' u* R& B$ b; [ for i=1:n_center_vec' G2 P: m; ]5 b. T
r = bsxfun(@minus, data, C(i,:)).^2;, @0 W5 m! g" ?; v6 N% h
r = sum(r,2);. T" U& p2 N4 I2 O# k) m$ B
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));5 {' p$ B$ B0 c- @ {
end, N a' Z. r5 \) g" J
- e$ y) {/ N0 B) r2 l
W = pinv(k_mat'*k_mat)*k_mat'*label;
: a8 ~0 L- S$ ^& rend
6 h! }5 D L5 `! T' G! f+ g7 i! j! C# Q$ [% E+ i. g
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
" m( p" b d7 r2 k% ?! ?0 N
, r5 P- R& }) u& F& r1 `function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )3 N _ e! T E" W
%LAZERBF_TRAINING Summary of this function goes here; i) y$ v+ d/ L' }
% Detailed explanation goes here1 i% Q5 k( F9 k1 o% A
if nargin < 3
3 i4 Y" O1 E6 x+ A# K* d sigma = 1;
" m0 B9 _$ n7 w! v: b! u1 n end
: `% S4 j1 o. Y$ Q6 C! B# f9 a/ P" h6 r4 A! m% B4 \
n_data = size(data,1);" h5 b$ }4 Y9 ]) X
C = data;! ?) b) C% [3 r2 [
% `7 c7 D4 N5 S, d9 h" E& R % make kernel matrix
" f. D0 w7 Y! I! S8 w k_mat = zeros(n_data);
" G; {2 t' Y0 h* _3 E for i=1:n_data: U7 M0 D: S; s& _+ j; C ^$ F
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
0 x6 t9 m8 M% L0 m! D7 |8 m k_mat(i,:) = exp(L2'/(2*sigma));- a g, X- i0 ^; S5 S L/ O& |
end
7 e$ b4 _ A6 [* h# N0 l4 D( z, Z+ ]+ C: I# ? H
W = k_mat\label;( i5 i! T4 I x& P4 Q
end
- N3 f1 e& y- l/ z0 S8 x
$ q# i( W- W7 BRBF_predict.m 预测
6 A* D& Z0 M) K, g1 D7 |6 F/ I5 m/ N' F8 P2 _7 W
function [ y ] = RBF_predict( data, W, sigma, C )
8 e; j: s0 ~2 K1 I0 J" W%RBF_PREDICT Summary of this function goes here3 u* s3 \7 a7 L. \# O
% Detailed explanation goes here
V7 N) x/ Q; o2 v n_data = size(data, 1);4 \9 i, N' ?9 F5 P) c: t
n_center_vec = size(C, 1);
9 x5 V) W4 }0 s3 h6 R4 T2 ]5 b) } if numel(sigma) == 1: k, H! e6 L: f# w2 Y: g9 k: Y
sigma = repmat(sigma, n_center_vec, 1);! w# m+ [7 j1 k+ y0 _
end- i# W$ b+ Q+ F" N
) P/ Y2 e4 D8 X, c3 I' ]* r % kernel matrix% E$ a8 z# Q' R% J! B, }
k_mat = zeros(n_data, n_center_vec);
9 w' ?8 L( k+ g* g) F for i=1:n_center_vec
2 `8 T, Q+ ~: ` r = bsxfun(@minus, data, C(i,:)).^2;0 J5 d! N9 T' R2 G4 V* v
r = sum(r,2);( X) R" v$ B5 V, _3 [; U: g
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));' f& F$ ?! T- {% c! f# B
end+ ~. ?, I" O. { N5 a% O. Q
) O# v+ h# a! o2 W4 l y = k_mat*W;
; k9 d1 R% w. I3 j0 T, m2 r) C1 @end
# x2 K/ |% \, ]3 o5 i
% T3 h- U8 G6 r6 [————————————————7 I/ M0 k4 w% G9 x+ C; E
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 s9 t% h/ b% M* w
原文链接:https://blog.csdn.net/weiwei9363/article/details/728084968 k" E- o. ?4 n0 w3 L8 ]
; K- N# V6 t5 D% e. N
. Q+ y; L' q8 t# [8 J/ k8 E) ?& A& S+ q9 p
|
zan
|