- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55505 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17603
- 相册
- 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的直观介绍* @" T+ V3 [0 O9 u. s! Y
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识/ V8 C$ c& c; V; N I
4 e0 q8 Q# d Y
1 RBF是一种两层的网络
$ W5 i- s/ O: g' q9 g/ b) V是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:6 |4 k( x# C- a/ P/ `' S6 w
yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) 0 t. j5 H% C, H
4 r' F& O1 X/ _. q$ I* e
![]()
# ?6 G/ M& i% { b0 Y$ E& x, S! w2 RBF的隐层是一种非线性的映射
- Q% L* l- X' I( ARBF隐层常用激活函数是高斯函数:" e- S7 ^* w, m
! Y( N, r# g; I$ C
ϕ(∥x−u∥)=e−σ2∥x−u∥2
) a% j9 V' G: M: z
1 J) a Q6 n& [( h- f2 i
8 H* m' U9 L9 R7 h. F; c
# S! D: l# J5 o8 g9 ]. g3 RBF输出层是线性的
+ P: y( O1 i* E& O# H- H0 [4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分 V0 N2 u4 u! v7 _* D% Z
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:$ u1 A, o' Z% k; q+ T& J3 d. r
6 l& H$ _3 L- j" G1 B, l+ S
4 p) {# M' [9 ~8 i. r$ p7 O上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
8 S* i1 r; M! i' \ |; l5 b0 M7 _& e% {' n& I
RBF学习算法$ G* y4 W, Z9 x
![]()
9 K6 c( j- g$ ^1 N$ E! V3 R# V
& v- c/ p8 I! m" I
, Z H: Q& p* o$ N# U对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
/ I5 ?# p* O% V# `5 S2 C学习算法的整个流程大致如下图:
, Z; X/ s( I7 w, n3 W! i0 U: v* W<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
9 [( n% q% n0 v e2 V _ * D' X5 |+ ]; V3 a9 L
8 A8 w3 ?6 Y( q. o3 |! x: K具体可以描述为:
4 E0 n( x+ x2 Q$ @7 I& v, t* @: ^/ v* X* ]
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
& ?# H" J/ N* ^4 V9 l m) ]: L8 C; M7 w3 |
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]$ C( B, W% x3 J7 _0 G4 G: R
σ
5 V. _+ i) i# _# {1 ~& _i=K1k=1∑K∥uk−ui∥21 ?# E* l0 P1 \7 }- k
% k+ W0 t( o+ z, o8 Q s* h; f+ }( {3 `5 g
7 S/ ?8 w- S5 U5 s$ x+ l6 C
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
" ?& x+ k7 O: F: U) J7 h& g) c# d' i# Q/ U; ?$ M) v4 d
Lazy RBF
( Z; M; G8 [8 X/ Q, I1 _" O+ x% V' R* I: F5 I) K5 ?6 e
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
, |4 e4 Y6 F5 ]- @+ i; |![]()
, g. U! X; b# y$ C) S5 v) xMATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。" X( a2 {5 y3 f. t+ x4 w
# Z! E& x& C! ~& G7 Idemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
0 j( M. g$ g' }: s
5 E" I2 M% B0 y7 Eclc;
: i' l: r4 c- k+ f: pclear all;. {) c' z( Q; Y& ~3 J
close all;7 {/ Y) ]/ r, z$ E+ ~8 R, k# M5 g9 n
' K0 `0 k+ a2 B1 i' D! a6 f%% ---- Build a training set of a similar version of XOR6 ^7 a s8 E' x* W
c_1 = [0 0];
6 r- {: w3 y$ [7 lc_2 = [1 1];6 R2 I6 \9 E4 ~ \
c_3 = [0 1];+ @! P' w" R; c8 S" z' n: l+ N
c_4 = [1 0];9 {1 ~) F$ ^% b# z: f
/ N7 ]2 B* h: [
n_L1 = 20; % number of label 1
. m' o' ~5 k+ M% k+ q' [# Q/ ~n_L2 = 20; % number of label 2: _! s k, `) m
% {7 e7 r* S( [9 D4 j9 Y% W4 B* t
A = zeros(n_L1*2, 3);. N. b" h6 Z( _7 f' I- l
A(:,3) = 1;4 j6 |; q2 Q3 M1 U! S
B = zeros(n_L2*2, 3);
4 `$ M9 A% D E `0 M0 I nB(:,3) = 0;
9 H7 v* [8 j' X) M" ~9 \
: J* F G' }, B5 G( |; j0 X2 g% create random points
0 M2 ]4 |7 o* B/ B) E1 yfor i=1:n_L1
: x1 @7 {" \3 `2 a' A2 g, p A(i, 1:2) = c_1 + rand(1,2)/2;
0 l! |3 ?% j# X, N A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;8 l$ X0 f' X1 W1 K7 F
end
5 D- i% p1 |" y! y: I' F7 ofor i=1:n_L2# t% p0 ~! r! f4 W7 v3 |' n
B(i, 1:2) = c_3 + rand(1,2)/2;4 R7 @/ I2 v, }$ }" p% V( W" {5 p
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
# l& |, ~/ l3 |: ]: |& N) Hend; q7 k; T3 S j* \& w
' ] o4 S* b& q# @* H- z! }, r% show points
) ]! p2 v2 S9 y# X" Iscatter(A(:,1), A(:,2),[],'r');
# c6 }, |7 G6 b! x2 Shold on
# H. ]' Q3 N, L( @$ Jscatter(B(:,1), B(:,2),[],'g');7 Y: _: T1 _( N" p$ h P' y
X = [A;B];4 Y8 c5 z: f8 V/ i
data = X(:,1:2);
0 Z( B. a0 q4 M' X( ?; ilabel = X(:,3);, P/ ]. n( T% T4 i% r% n- O
) ^# T, X2 s8 I1 R0 w%% Using kmeans to find cinter vector
! G7 G. d3 v1 J5 N o$ Qn_center_vec = 10;
8 Q! ]7 S% R$ B0 o2 m) @+ vrng(1);: d6 n: S7 C s5 f9 j" C
[idx, C] = kmeans(data, n_center_vec);" _& z8 U( o1 ]- s* d
hold on
6 I7 T2 z/ z9 y/ M) P( {% G# Escatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
, [/ ~" \3 K6 D: A; K+ Q- M& M) \3 M( W+ A8 _/ u
%% Calulate sigma
$ u3 P' g( u* w+ y" m+ i4 J7 In_data = size(X,1);9 l8 T& z* o7 q; r$ W, s: V, Z
+ X: K5 i3 l, C4 ?5 a
% calculate K8 L& ]& f% \4 m" q: p) q
K = zeros(n_center_vec, 1);
) Z3 K: W9 m5 l' b2 o9 m' @2 E" W1 Rfor i=1:n_center_vec
( V( a1 b: T+ q7 a. |1 y" w- X K(i) = numel(find(idx == i));
! ^8 O4 W, J# hend
0 w, Z1 J9 t) q) f! j1 E
8 O2 c/ Q }, Q+ e- o% I7 Q. k; }; _% Using knnsearch to find K nearest neighbor points for each center vector! q9 b) Q `8 p1 H
% then calucate sigma. H) M* t& ?8 d. S) Q( ]7 j
sigma = zeros(n_center_vec, 1);- k& v) z+ Q# w% ^8 i$ V
for i=1:n_center_vec
. h4 ], A7 f; p! `/ G4 s [n, d] = knnsearch(data, C(i,:), 'k', K(i));
* ]1 C5 t: }; o9 M% W! V8 a' U L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);* B b# W) r4 {( ]) h, t) \# J' M
L2 = sum(L2(:));1 i2 t5 o9 H6 ~: M( o7 N
sigma(i) = sqrt(1/K(i)*L2);& A: {8 [; J2 [1 D+ Q" W& G
end
2 [% c+ Q1 ^" \1 J5 i. ]# P. p9 s& {3 { h
%% Calutate weights ?, U \. A" |: t( i
% kernel matrix
& W6 s7 O( {) Ak_mat = zeros(n_data, n_center_vec);9 A' ~# p$ o& w% g) O' n
! I, Q9 P) T# k
for i=1:n_center_vec
$ X% g# r- `2 t" q0 d r = bsxfun(@minus, data, C(i,:)).^2;( N( N9 ^: v% z9 Y/ ?& l
r = sum(r,2);& n1 {2 r; O3 N
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
* Y {; G. D- W& u2 ~. Zend s: R, J" I' U
2 f' I c1 e4 u- c5 m
W = pinv(k_mat'*k_mat)*k_mat'*label;
/ J" I1 g9 T3 iy = k_mat*W;0 N) \! C5 g( @0 k0 x
%y(y>=0.5) = 1;
) M( O n; H4 }& v7 P5 R* M%y(y<0.5) = 0;
) N; G! _& j2 O9 P3 r. ]" _" S! s0 s; m& u" t
%% training function and predict function
6 S" A# R7 T) _% i: U[W1, sigma1, C1] = RBF_training(data, label, 10);* o4 |( C# O' h, C
y1 = RBF_predict(data, W, sigma, C1);
2 x) ~- Y' [+ {1 D. q[W2, sigma2, C2] = lazyRBF_training(data, label, 2);# D5 b4 W! g5 h4 ^2 c) A* q
y2 = RBF_predict(data, W2, sigma2, C2);
" I* t2 ?- K9 c![]()
2 c6 P1 e6 T. @2 \+ I& _
. c- ?! _3 g/ v$ M( V上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。9 x" h" \# k9 \( s
4 Q# F/ }1 S/ R1 l9 ?2 O- O& MRBF_training.m 对demo.m中训练的过程进行封装
7 T" I8 _% w% K# Q- w9 Wfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )7 e y3 T$ ~4 T
%RBF_TRAINING Summary of this function goes here7 J2 l( {, e* S6 G/ N6 [
% Detailed explanation goes here
( y! E1 N$ G2 p$ J; ^5 _% b# d1 x4 H7 @$ O
% Using kmeans to find cinter vector, P- h$ q" [9 z! T
rng(1);0 \& ], L! O( u) y
[idx, C] = kmeans(data, n_center_vec);( A/ C+ H6 @1 [* z2 N
' j7 e7 i. F7 e( L& m % Calulate sigma & V7 C* K6 g6 p0 ?2 M- P' _
n_data = size(data,1);6 n; e2 u" J e4 O$ n' g
2 m. i4 h& S- y& g/ b; z % calculate K
5 T, L# d5 }' u- k K = zeros(n_center_vec, 1);: X- U' z7 c8 q- `: `
for i=1:n_center_vec
3 T7 H% X$ r6 i K(i) = numel(find(idx == i));
; s8 j" c* X! L+ g1 |- f1 E end
) C- s T* F4 `- x, V2 H+ ]* {' K' N$ `$ V0 J
% Using knnsearch to find K nearest neighbor points for each center vector
* ]9 J8 A8 H) i( I1 i1 O' \ % then calucate sigma
6 |/ X, i' V3 B- o: t0 V* @9 ^) ]- | sigma = zeros(n_center_vec, 1);
: V/ K Y' g& ]& W3 _9 K for i=1:n_center_vec* _0 K' p' o* Y) R/ |/ }
[n] = knnsearch(data, C(i,:), 'k', K(i));
4 @9 E/ K- x7 A( V L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
0 b8 l7 H; k9 K% _- ^0 } L2 = sum(L2(:));6 e% X% C8 s1 V! h. J: a
sigma(i) = sqrt(1/K(i)*L2);) c+ ^7 R* ^6 F8 v. E
end6 j% x9 @: f. s/ }
% Calutate weights& G& I7 ?6 H# B! \- X2 z
% kernel matrix
$ [6 n" f n6 H: W7 G k_mat = zeros(n_data, n_center_vec);
$ i$ X; A( H9 u! a' @( ?
& [0 w7 C8 d R$ Z4 R7 H. G for i=1:n_center_vec
4 F& E, a6 L2 g" M7 l2 r5 D; B r = bsxfun(@minus, data, C(i,:)).^2;9 O0 a) q2 A: ?/ D5 {5 ?
r = sum(r,2);! k3 N0 K9 B+ R6 v- w& @1 U! c J
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
/ l! n& J" x6 |* {1 |+ W end/ } L, b# f K; l1 ^8 S
0 G, X& @% a1 ?1 G W = pinv(k_mat'*k_mat)*k_mat'*label;
$ c/ o9 u6 r+ i' send
8 t! E( r/ T: p/ o# i
$ N. F( u/ E. v9 DRBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法5 h Q( C" p; B# ~# Y& {/ J
% k! }" M$ n' b
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )4 b9 k- V8 a8 |. \" O
%LAZERBF_TRAINING Summary of this function goes here
* F% ]8 [1 B1 j( o: B% Detailed explanation goes here; [! @6 @# M2 ?
if nargin < 3
2 O4 t% s5 x& z8 O sigma = 1;
$ e2 s# ^# a" y& ~0 i! d) O# i( \5 C end3 l- F1 c; D3 T
. |' m: ]2 p z& M# ~% X- H n_data = size(data,1);) m* o `/ `! O1 O, [" u P T# l
C = data;
( c u& h% Y; n& e1 W( R5 f
7 b% n" c% P9 E0 I% |7 N % make kernel matrix
, f& Q9 \! @2 k% G# \- O" f. N- s k_mat = zeros(n_data);
5 ]$ N) X G3 c3 H2 p+ b5 f for i=1:n_data
' O* m; w7 T7 x5 z% Z+ f' c L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);7 b3 U: m: \) g8 a# q
k_mat(i,:) = exp(L2'/(2*sigma));8 e3 u8 U8 O. u h) I6 ^. g- `
end
; g- t) S, p' S3 H0 ^5 N* H, J Z7 t; q9 {
W = k_mat\label;
% a# p; o, ^$ y0 j# i) c1 w# Xend
% i5 B- U5 n: Q7 V$ ?% x; n% d$ P2 o1 H$ G: q" e' C
RBF_predict.m 预测$ r0 Y9 j6 D2 b4 E. y, _3 w$ w: v
+ `% M$ l! r9 _% L) t0 l4 R
function [ y ] = RBF_predict( data, W, sigma, C )! ~- p9 e2 s2 `' M* D7 M* g
%RBF_PREDICT Summary of this function goes here
* \4 N R$ _* D/ |( X% Detailed explanation goes here
; F( W; _9 r" ~! P n_data = size(data, 1);/ @% }: n" e9 E8 x1 U# W
n_center_vec = size(C, 1);% m& h/ L$ f6 e; F! v. A v0 y7 `
if numel(sigma) == 1+ W2 \0 J9 I- ^: b& _+ Q( d
sigma = repmat(sigma, n_center_vec, 1);+ Q; @; b8 o/ W! ]# f6 a
end. V' A. X, k9 d- z% w
) h' c5 _ s% P" s$ C
% kernel matrix& t; h8 B+ M! {( o' S
k_mat = zeros(n_data, n_center_vec);" w; e3 l) k! }
for i=1:n_center_vec
! b( T$ n2 m; o, y4 ` r = bsxfun(@minus, data, C(i,:)).^2;
9 U) ^' o, ^3 b i; [ r = sum(r,2);
" Z1 S$ v( I; Y, ^0 m k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
3 V5 O0 i' r( j$ t' A end
1 A/ I6 n' M6 c* S' O; H
- {1 x$ R* R6 N5 A' J8 m d y = k_mat*W;, G' Z V2 l! D1 u5 L! j
end g+ B( m5 W+ d( j6 e
7 k7 d2 F/ Z/ E$ ]+ t' m
————————————————
! a& H; a+ [7 t: }( E版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# n+ T7 Z- x8 p7 z4 a' t原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496* Y% v* r' y* y5 b
* d8 f! ~, k2 n5 e7 w
$ ]7 p1 x/ J) U. N7 _: K4 c j& S% f% U1 b( a' K. a# o* z
|
zan
|