- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55510 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17604
- 相册
- 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的直观介绍1 J6 T1 a$ q# i
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识2 r8 S4 G2 ?6 E2 Z5 E' j7 x O
b: q/ x: f1 K* s3 s8 r% }/ u1 RBF是一种两层的网络) `* { B% y q5 ~& u
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
% m# B# R- F8 | X9 Byj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
+ F- z+ s, e5 c: y) {3 e6 g% V5 M 1 T1 p) a% [: q* o
9 f1 x. L6 L: G I7 G4 w6 F
2 RBF的隐层是一种非线性的映射8 R% a+ r0 N- ~4 b; k+ O' i
RBF隐层常用激活函数是高斯函数:& d: `8 L$ F$ ~( h
, o( y' Z9 F) b! z
ϕ(∥x−u∥)=e−σ2∥x−u∥2; N6 ~' M' ^0 Q: r- M
# a+ s5 E- B4 N/ D2 j l6 ]. s- k* x7 a
. ^6 @2 u( G% o9 w; p3 RBF输出层是线性的
4 M* P4 l7 g- y+ q; l4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分6 v9 F- D1 b {2 E+ m+ W" i
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
! ^! t- m. A" Z+ s- y% a y- ^( n* l & g) G+ R1 D2 C# [) I
1 K: `1 \: m' O! d+ N- o3 H
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
8 ^, B4 b* K6 M- t ?# J, }& ?! h7 ^$ g* h1 X R
RBF学习算法
( ?& i3 I1 T2 Z r$ d 5 j( [$ j! ~% a0 |% U
, q1 S3 X! T6 M7 D- F
) @( G U- d. l对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。: O/ h0 [9 M, e; B4 P$ _
学习算法的整个流程大致如下图:3 R. d9 g! X& _4 H3 O [8 y
<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;">WW9 U+ k0 w) [8 B( G
![]()
% ~" j7 {1 x1 i6 y6 s; h$ C6 N6 e# c+ y# S6 G
具体可以描述为:; u r( x8 T' m2 T1 R1 J/ L" {
, i; C5 ]6 g6 ^ V* ~) J) q1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
% E* P$ r) D8 `5 V/ v2 x5 {$ Y' U6 E* H" U. \- v. S$ [0 k$ j
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
" A& j! E' f K8 ^1 _+ m1 z9 N% I σ* V! G0 t0 q9 N5 R+ g
i=K1k=1∑K∥uk−ui∥2
4 w+ j! B! O/ h# H
9 p, U4 L- b. y" Q0 z
D+ l" b0 [5 H5 h( } & f$ \) i4 D/ P( l, ?7 f
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
* J# i8 `5 u3 z% E0 z
6 |6 `4 J2 j, }, n9 j5 `" f2 lLazy RBF5 C, M; t. k7 v! N; [3 ?6 z0 G$ x
; ~& Y2 c" m) ]% G7 ?8 w+ j
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。( @* w' Z: u: b* l6 m
) L3 e5 V5 f. [ _0 u
MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。/ r9 j/ }# V6 T$ X9 V: X
- I# s$ M. q2 h/ |# A1 bdemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。7 F, g3 m/ k: [9 U+ k0 ~4 O; X
# U& m5 w' _4 pclc;: u# g! {2 {+ d- c4 v" Z
clear all;
% Y5 C. D1 h) |2 y7 i: [+ oclose all;
, X4 N3 \! ~: Y( i: Q
# h" J2 m( ?/ b) f7 ^4 B, q%% ---- Build a training set of a similar version of XOR/ A7 o2 i5 w1 X3 h5 m
c_1 = [0 0];
* O U( b: | ]2 N v7 bc_2 = [1 1];
8 t0 D' M# D4 L1 Z' z- Dc_3 = [0 1];
6 j% W9 k: i) ec_4 = [1 0];
0 Z \+ _1 x( Z2 I9 c# a* n; e; c+ A
n_L1 = 20; % number of label 1
, t" c) O Q/ a$ K" G$ En_L2 = 20; % number of label 2
) _) T6 H( l5 |' f9 p) F, ~1 G% E- {+ ~: U) Z
3 ?# ^+ [4 x W% z/ _: Z5 F5 VA = zeros(n_L1*2, 3);( v' G5 m1 @" k# L7 G
A(:,3) = 1;
. J0 F. m I# A1 SB = zeros(n_L2*2, 3);5 y3 n6 _' K5 S3 P% P5 \
B(:,3) = 0;
/ W6 O; X, T3 {% T7 z M+ |& q, A* f+ C) @6 \6 o6 E/ n
% create random points- \5 m2 }3 R( ~
for i=1:n_L1) v; i+ b) Z5 @- i4 D
A(i, 1:2) = c_1 + rand(1,2)/2;1 o+ Q$ O8 t' b. O/ k0 R) F; V
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
4 X" W( w, H5 X- d% P# fend
3 g2 o; o8 t( k9 r" ^* O( W" kfor i=1:n_L2: u+ y" Z. A4 K
B(i, 1:2) = c_3 + rand(1,2)/2;" o% C6 k, [* X
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;: I" g; Y5 z0 @( r$ s7 g- a9 A
end
( r: f! u3 ^5 g1 v0 h% V, T( H1 L) R" ?, A- f& @- e
% show points' H$ w& z$ B! m2 T; x( A( W
scatter(A(:,1), A(:,2),[],'r');
?% }4 y( W4 o' V; `2 g+ l# ~" r4 w# j: Ghold on3 x# V! f( d7 a1 ^/ K* J
scatter(B(:,1), B(:,2),[],'g');1 p6 j' y& r* E" f: v: L- @% t
X = [A;B];1 L) y- }! h9 r! y e- H
data = X(:,1:2);
+ u1 @3 L" }+ S+ t0 x3 nlabel = X(:,3);
% L5 o% i. o% c
" o8 t! S, G0 r; Y) {4 y: o9 p6 @%% Using kmeans to find cinter vector0 g4 I- ? w. s! t) v' k
n_center_vec = 10;
0 A$ q+ }, j b# P3 vrng(1);
* _ B+ B. {+ |. O& W, C[idx, C] = kmeans(data, n_center_vec);
: f- T9 m M' x% N5 M" D1 lhold on
, v# i b% [ o, s3 H iscatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
* b1 P7 t" ?3 e# f. I$ Y( Q/ Y
%% Calulate sigma
& n9 u/ _+ X% h( J9 S& q' Xn_data = size(X,1);
# k) n7 l6 @+ {- ^2 b
- t" F' P' M% J* _( }% calculate K
" i& q8 I/ c3 pK = zeros(n_center_vec, 1);
( r0 [) W! j. C) r4 Wfor i=1:n_center_vec
* m$ P. G6 I7 F& ]+ a K(i) = numel(find(idx == i));
. U( }+ ~" y: H4 L5 aend$ r1 u; f* q- X7 d; ]! z( o
7 k5 O0 j) U* z# f# P5 u
% Using knnsearch to find K nearest neighbor points for each center vector
8 V* d8 X% W$ L2 p% then calucate sigma
8 Q6 _. }: i& M. u! Fsigma = zeros(n_center_vec, 1);
2 S E. Y8 G4 W5 P! T* p: lfor i=1:n_center_vec
# \5 K1 G: @# u+ L2 Z, u [n, d] = knnsearch(data, C(i,:), 'k', K(i));" ~& O+ i: ?6 G8 m" \8 t; R6 f
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);# N8 F0 I# _9 b( R# N
L2 = sum(L2(:));
`- Y9 @+ y8 B, D sigma(i) = sqrt(1/K(i)*L2);0 F: f/ b) X0 B3 _: b3 } m
end
4 `8 x a5 h2 P$ }1 I! S% X! {) t- A" n, ~: d: O, O: ^
%% Calutate weights! E! o6 R0 @# e. M7 }
% kernel matrix! ?" x! p& G5 ]$ |8 q
k_mat = zeros(n_data, n_center_vec);, ^3 Q. N: n8 d2 I8 k1 Q7 k1 S
1 V' s2 J0 a4 n/ _& ~) j
for i=1:n_center_vec
$ O" \% J7 H6 E7 V r = bsxfun(@minus, data, C(i,:)).^2;
+ N' D/ r, o5 ~- F3 [6 c r = sum(r,2);
. J* A5 @4 }& K k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
, q8 z* q+ F) j/ Rend5 @/ O, X( b0 T! V) R o4 U, l4 _
{. b3 a: k6 P$ \5 S8 rW = pinv(k_mat'*k_mat)*k_mat'*label;& C+ M* g Q5 h D/ U
y = k_mat*W;
' r+ M) S" b \%y(y>=0.5) = 1; @2 X0 \# _- k" ]
%y(y<0.5) = 0;
8 `- H7 b2 k! l' b- \! J
4 t4 m' J# d7 e0 Z* G) t%% training function and predict function) O7 v" A$ o- l
[W1, sigma1, C1] = RBF_training(data, label, 10);( d! k/ ^( H- n) f
y1 = RBF_predict(data, W, sigma, C1);
4 p5 ?) |; N1 N" @[W2, sigma2, C2] = lazyRBF_training(data, label, 2);2 X; X6 s8 P1 J+ z' I8 d
y2 = RBF_predict(data, W2, sigma2, C2);6 o" d X9 r7 J% I3 n: N. g
% b/ ?& V, R1 J3 |2 \8 U
; c& A" P% G* |: T) Y( c" b
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。! T, U7 q3 B! {* @
& d; T& N! i: U- p2 B: [RBF_training.m 对demo.m中训练的过程进行封装; q. o$ ~ E0 E2 r2 _1 C2 T
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )8 V6 h' S0 ~; @
%RBF_TRAINING Summary of this function goes here; A" f9 B) c) \) f3 @) P2 s* }
% Detailed explanation goes here
5 I- X% X% x* a* b: _
0 T2 z: e6 x0 `! j( l1 [ % Using kmeans to find cinter vector
6 s. `! p- X! [7 K0 C6 h rng(1);6 P2 N. G9 B& C7 m. p- Q3 \
[idx, C] = kmeans(data, n_center_vec);& a* c' V. r7 U; q. M( h9 B2 z
+ T- F6 _ O8 n4 U- O % Calulate sigma
9 u7 n6 A; z# d) W( n. D5 y n_data = size(data,1);$ |3 H# D F3 k- {5 n% w: h! f; |! \
- H+ T; p( l+ a2 Y' w1 Q
% calculate K
, w( ^5 G H9 T6 i9 k! Z K = zeros(n_center_vec, 1);9 g$ V- m) Y* O1 L
for i=1:n_center_vec
2 a0 s' L; }( k+ C' f( \! W K(i) = numel(find(idx == i));
& e' b" f2 [' S( h, ]+ \ end
5 k1 C) v1 h3 ]; i& m; L8 G1 m
. @" ?# E: A) ^7 `. R9 ^5 v% L % Using knnsearch to find K nearest neighbor points for each center vector9 @- e- g9 C* ~1 H1 U5 L3 i( r* }
% then calucate sigma
- K0 V! z; q. v0 ? sigma = zeros(n_center_vec, 1);
1 O& V! u5 L/ V( S for i=1:n_center_vec
3 s) x* L2 F; c& S0 k7 J [n] = knnsearch(data, C(i,:), 'k', K(i));- `" K) H; z; g7 @
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2); q- L1 V3 e5 Q4 t: F5 H
L2 = sum(L2(:));
& m8 W+ b# u% O% T sigma(i) = sqrt(1/K(i)*L2);$ D3 c) Q) V2 e4 M/ P6 ?
end* s8 `/ a: G( P+ d* H" n
% Calutate weights+ Z0 a. C) V: q' C& P5 X
% kernel matrix
% u! b+ T, b/ M% m( g, j' C7 r& s k_mat = zeros(n_data, n_center_vec);
- |- [4 J2 ^$ P5 }& H; n4 b% \5 l: y/ `! S" d% k8 c
for i=1:n_center_vec. e! r3 w6 i5 c, x: G M
r = bsxfun(@minus, data, C(i,:)).^2;3 l# q( n8 z( i* p0 S: u% g9 u
r = sum(r,2);
, Q" \% N; `/ @. b- a k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));+ \. j! \9 b, F6 W# [/ K
end. A& p! ?% w- P* D5 ^8 z' u4 R, l. Z
* s5 H, }5 f3 K( ~
W = pinv(k_mat'*k_mat)*k_mat'*label;* Q6 D. ?5 \3 A! X
end( X4 \& d: P1 e4 C) J: |8 Y
5 ?8 V8 G4 z( \* J% |RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
: W( F% Y5 `+ t3 `- ?+ Y
3 o3 y, _3 ^% @6 O- Rfunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
1 y5 X7 ~' x8 C- g8 H b9 S' R" g%LAZERBF_TRAINING Summary of this function goes here
$ L9 ~& P( i5 i1 b% Detailed explanation goes here
% X) S9 n: T N, ]$ L if nargin < 3
" M9 t/ \) u) p: ] sigma = 1; ' i. Y' g6 ?: h% J3 ~& E
end
1 P9 T; i, d9 |5 u# R! [; r: A, O# r- k" I( p
n_data = size(data,1);
2 S2 c) {$ g5 ]+ k C = data;
+ t& I1 D. a' q/ n6 d3 w) @
( P! j2 j8 F- L* p % make kernel matrix
5 ?) t7 D1 e. x" G% G- P0 j" q k_mat = zeros(n_data);0 t7 E$ e5 |7 N) E b$ p( X+ H* d
for i=1:n_data
1 S k& [. Y3 b0 B/ ]* J* | L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
4 a, ?& e7 x; M0 I& Z0 e$ I- F k_mat(i,:) = exp(L2'/(2*sigma));, X. z* z) K0 f" {( ]% f1 M3 I+ Z
end* y5 o; S k' F. q/ K4 X
, n+ m8 f* @, ]& o6 i' ^- y8 o0 E W = k_mat\label;' G2 g2 R6 ^9 c. `& l' O
end
9 m& G2 @3 Y% u& g5 p" }3 e" O! u
- l$ g( v# i3 Z6 K' M3 WRBF_predict.m 预测
3 g6 R# x8 D o8 Q7 e* H9 ~5 W# z1 W! S: B; Q
function [ y ] = RBF_predict( data, W, sigma, C )0 L1 F( _& K3 |" q, E) S
%RBF_PREDICT Summary of this function goes here
6 P7 A4 G0 @" j- v. t3 H# c% Detailed explanation goes here
" ~& T, e1 U& V- R6 s; b2 j n_data = size(data, 1);$ W2 ^( N) T4 h5 F
n_center_vec = size(C, 1);
, @! L1 w5 |: R% R; R' L+ D if numel(sigma) == 10 q, e9 |, A" e) X! t# {4 g
sigma = repmat(sigma, n_center_vec, 1);- c7 B0 i5 z1 ^' t- ^7 h0 R
end
5 b* X+ f+ n( V9 ]" j& l# a7 V
7 J4 p" S- \- p5 j. |) j, S+ D % kernel matrix
8 L' z; N: Z5 Y! w k_mat = zeros(n_data, n_center_vec);2 C6 O( Y8 `, x, k4 O- N( N
for i=1:n_center_vec$ {) k- Q0 F/ z* U, d S
r = bsxfun(@minus, data, C(i,:)).^2;& T3 m" _, q! N
r = sum(r,2);
- B, ^7 n4 q5 e2 e; p( {- h& C k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));' j# `1 j2 U5 n/ d. i
end
+ O3 z( Q; N. e8 P$ w& I& A3 \" `2 m0 @
y = k_mat*W;
- g8 Z$ V: A) ?/ @$ H: s0 p! _. t* gend- _- }6 r" p. _$ B
4 P2 l/ f* J" K+ o
————————————————
" j' w) E9 S. O% [0 w6 O! n9 S3 c版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" h1 S' N: {4 L5 K8 V原文链接:https://blog.csdn.net/weiwei9363/article/details/728084968 g1 P: d, s6 N& @$ U
( E/ U* t4 H1 g. V+ ]
+ I5 e; n2 b, m
1 m: F( X) J$ H+ c! \. T. E |
zan
|