- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55507 点
- 威望
- 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 u; I9 ]* }; w+ X& g, r7 j! H. \RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
; P8 ~7 ^, r) `7 x/ M) V" E, L) T: Y/ p7 q
1 RBF是一种两层的网络 a& y6 d ` U/ L" [8 w
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
1 i Q, l$ D' j, X- _yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
% Q* n7 g' ~+ B9 d) f/ {* s" q3 K. m: D![]()
p0 e. U: R, w. `+ _" i![]()
7 p% b' k2 K8 ]2 RBF的隐层是一种非线性的映射
* j9 Y/ c6 j* s( B# tRBF隐层常用激活函数是高斯函数:
9 d7 p; D- \% t+ k* J! B
) h, |- U, G, J5 Q8 d8 tϕ(∥x−u∥)=e−σ2∥x−u∥2
9 c3 n; f8 V1 E% R3 v7 V$ \9 m( m( u& G! ~* u* I' @* j! D; k( }
, Y) C% I; ?* _8 x9 m5 G
1 I a: h1 Z, X( x ?/ \3 RBF输出层是线性的
5 e3 D& X. ^1 e# ~4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
0 M+ [/ V7 T5 ^RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
& p K! R% e; T I4 | 8 K @3 x1 z" ]2 R- Z
) E3 ~+ t8 F, I; n, K% X
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
3 L7 w& Q" x' C( y: J# l0 d6 O2 v o! y% V
RBF学习算法7 @. b$ U0 w4 Q' q5 G6 _" I& M+ J
, Z* `+ X! o0 I$ x0 B r
$ `( X& q6 l) Y5 W5 L& K
0 [$ E# d2 Y3 b' g3 j" Y, \对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
c& g E+ t V- [学习算法的整个流程大致如下图:8 l+ J3 t* b' F3 D
<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
3 y9 N9 Q4 Z6 ] J* G4 o$ ^. p : h; k3 x) j8 U" N. |# O: L- N
: T5 k7 Y' ]. K" C2 ^2 Y具体可以描述为:1 [# `2 O! s% Q
5 u7 ^+ l5 R- g1 Z/ }4 C: b
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui* L: A- v3 V* [: N8 z7 E% Z
7 o' V8 b7 L" x4 N6 V2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
1 ~7 _7 E- n4 }7 O σ# T0 i1 Z7 ^5 F# }( d# M6 t
i=K1k=1∑K∥uk−ui∥2
5 u* ^, r J' O% x6 h! \+ C% I7 [
# j& u/ B& A" B7 ?4 q
6 A2 f% N# L% C1 f3 m$ a3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
! q! G3 [3 X& k- I$ X* Q6 E- s( j* n5 f) ?1 d
Lazy RBF
' c3 g3 h1 J8 I( ?8 }+ J8 ^, N6 m: a- ?
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。 `; A: X( E2 Y, t8 r) p4 L2 ]+ F9 o
![]()
2 m8 W/ T& F' c; B, q7 {MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。% U! \+ b9 v( M$ H, k3 j
' u Z' B+ s# n: `3 K1 l
demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。/ _. m: i' q P- u4 c4 L% G
9 d1 h3 q( A, L# q5 b# Xclc;
# S4 {) n/ p* ^; p6 _clear all;, u& c* W3 |& h4 r# {* f3 h
close all;
: q" I# Q1 d$ }+ t6 W+ c" ^8 }) o! J! x) U& W) @* V0 q: o2 o
%% ---- Build a training set of a similar version of XOR5 T# h# e0 u- {0 @
c_1 = [0 0];7 x3 U% b" j4 ]( x6 z D* f
c_2 = [1 1];
# c; Z3 ?- U" \. C* h0 p) l$ U9 K+ W! Hc_3 = [0 1];7 F. b0 Q! {5 O* f% d- R& `
c_4 = [1 0];; w! K: s7 t% y2 { l- B
. S. ?" D: T- R* V' S! V
n_L1 = 20; % number of label 1
3 n2 n e, ~ X% An_L2 = 20; % number of label 2
4 U! S y5 l/ g, W. n$ g7 t" x0 u+ T; p- L
* w- Q, j' p) B5 k, b* rA = zeros(n_L1*2, 3);
- \. Y7 S) [& M% Y" OA(:,3) = 1;8 s6 N* Q6 D! ~# Y+ r8 Q( j
B = zeros(n_L2*2, 3);
- C: {+ l, E3 h; K' \+ gB(:,3) = 0;$ \+ l% F8 i$ J! w0 _, s1 ?
, o8 ^. q3 M& L3 i+ K( q. t( v
% create random points6 v; o: K7 m/ L+ O) e
for i=1:n_L1
/ H$ K. T0 @' M8 c A(i, 1:2) = c_1 + rand(1,2)/2;
& L5 k2 [6 C( |9 R1 B6 J* c A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
' U+ z* g* L$ [( R, L7 o: p. [2 aend
' c4 H+ V' r4 h3 N# P; s1 R tfor i=1:n_L2
' o1 B! r) O/ E6 c7 G, V" C B(i, 1:2) = c_3 + rand(1,2)/2;& {# D9 Z$ o) M; I& G. U
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;% r( `. N( o$ G
end
$ ^8 x6 H* Y9 ~3 a& l& X+ `3 U6 Z: H' A9 w1 }2 F5 l2 C# _9 k
% show points6 V+ ?2 V+ D: s0 ^/ c
scatter(A(:,1), A(:,2),[],'r');5 Y0 {& C4 F6 ^( |7 P! W
hold on
7 @( s9 g* B. J7 g4 C' tscatter(B(:,1), B(:,2),[],'g');
- H. }& c p$ }X = [A;B];: s/ w# e& e5 r; H! D
data = X(:,1:2);
* j5 v. d6 M. V0 a4 N$ ?label = X(:,3);5 r1 D3 c5 I! W L
9 c1 k4 p, ?9 L) l6 s3 m% P
%% Using kmeans to find cinter vector
9 C# _) W& G! T/ _n_center_vec = 10;
/ T5 s% x& m7 @' M2 jrng(1);4 c+ n8 @+ ^+ G* V, z5 G: G
[idx, C] = kmeans(data, n_center_vec);1 ?0 W) V6 W" [3 i1 C# c9 w
hold on- v. x$ b$ I* E5 I
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);. Q& {/ o) z8 k: r; C1 J6 D- K
, X* e L2 _$ L, q, O' c- z# y
%% Calulate sigma
^8 Q& ]4 r( i+ W& Cn_data = size(X,1);2 j5 k) Q p$ O; W6 I6 p
. N% n+ S! g% P+ }+ G) W% a
% calculate K& {: w7 J) f0 n Z/ `( ?8 }3 V3 p v
K = zeros(n_center_vec, 1);2 C. J; X/ y# ]7 Y2 r& k* {
for i=1:n_center_vec0 @* @7 L8 ^1 b* v- o. ]4 c( `4 ]) R
K(i) = numel(find(idx == i)); B2 W* c5 P( ~9 z* w
end2 ?9 B- w$ Y5 H! D7 d. S! y& h
5 j" p2 w/ K; a: e0 s2 e
% Using knnsearch to find K nearest neighbor points for each center vector
3 A& ? K6 Y0 N& t$ y" R6 h6 U/ _& m% then calucate sigma9 p9 i, w! B8 ^+ q" n5 w8 O
sigma = zeros(n_center_vec, 1);
( r9 R o' A! s4 Wfor i=1:n_center_vec
! {- x2 N3 j5 C3 G [n, d] = knnsearch(data, C(i,:), 'k', K(i));5 x# |: _) q0 E) J* m( A9 M
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
( {4 ]6 t4 [1 O8 h L2 = sum(L2(:));
5 H2 ?( a) q) J9 R- |8 e5 y sigma(i) = sqrt(1/K(i)*L2);) t$ D0 ^$ `" F8 [5 y$ ^" c5 x
end3 M5 T* ]+ X2 @% ]' _% |9 t
* H; j' d l! N' u* ^
%% Calutate weights( k( o- x, H L
% kernel matrix' J/ {; t( f; r v8 A
k_mat = zeros(n_data, n_center_vec); }( r- Z1 C8 }" c' u
1 V& f7 G) {' |3 F, o7 ofor i=1:n_center_vec
# O4 z7 y2 |% w S! l r = bsxfun(@minus, data, C(i,:)).^2;
% X6 s$ Z0 t" I# a- J* p; ? r = sum(r,2);
7 t3 H" S; c( L5 Y k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));6 w5 T; K+ O; X% c1 W
end
" @3 H2 P" g. v% o y; z
0 a q' f F+ C6 F' C! Y* ?; R) h9 lW = pinv(k_mat'*k_mat)*k_mat'*label;
9 E" L4 }* F* A3 Cy = k_mat*W;' O2 o8 [+ g R9 A
%y(y>=0.5) = 1;4 W2 i! _7 X) A& a4 z8 L- U
%y(y<0.5) = 0;
6 B$ `: i1 ~$ t9 }" \" ^6 R8 l2 S- _+ C! E" F& K7 A m
%% training function and predict function
9 W# S9 w( }7 F9 w- e6 S[W1, sigma1, C1] = RBF_training(data, label, 10);2 ~' ^, f" @% }& U* g$ a5 b* {' I/ s
y1 = RBF_predict(data, W, sigma, C1);2 I/ |' r; P' u3 v, ~
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);6 i" C2 l9 ~* a4 k, ^0 b* S4 E
y2 = RBF_predict(data, W2, sigma2, C2);
4 c1 p8 p, A5 Q9 Z: M ( r1 Z. |8 J- ?7 x- E
, f0 X |- W6 N) M r4 P& U" A
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
1 }1 T6 n4 R6 P: Q3 ^
# M9 h/ F# J) | N, ?2 MRBF_training.m 对demo.m中训练的过程进行封装( `# t1 x+ a) i
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )/ C6 U. z4 H! r0 Q
%RBF_TRAINING Summary of this function goes here
F9 f7 i1 Q6 e6 h0 C, u% Detailed explanation goes here
+ t- S% _ y. h- i, s8 N: H5 s8 [( G
% Using kmeans to find cinter vector8 m: m7 X8 u9 ]0 ~3 Y9 d! q2 W
rng(1);3 w# T# _) O6 W# z& j0 }
[idx, C] = kmeans(data, n_center_vec);3 h% }/ j9 l: v+ Q, H
" M; \; [. |& ?& a
% Calulate sigma : m$ F' [; ?$ Y, r; Q
n_data = size(data,1);
- B+ x" G Z _; P5 @
/ E1 ~1 w) T) O* { w % calculate K. p. B2 |2 _; f( Z0 [+ E
K = zeros(n_center_vec, 1);4 w" m6 K2 d8 s# M
for i=1:n_center_vec' V% s( R1 l5 V
K(i) = numel(find(idx == i));
3 t( L* [8 C- F5 N end$ ^ `, ]( D+ {! n; t" K
7 ]$ t8 ]4 d& K! B" y6 X5 a3 o/ b5 H
% Using knnsearch to find K nearest neighbor points for each center vector4 S& R1 N- h$ k4 u/ e" b
% then calucate sigma+ R3 ?" l$ p% h% p' X0 f5 o, N
sigma = zeros(n_center_vec, 1);
, R- b: ^4 d: c9 W* H for i=1:n_center_vec* r0 p ]' y* ?, ?
[n] = knnsearch(data, C(i,:), 'k', K(i));
4 d: k& ^ v: M: F L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
: ]* m! K( z( D$ |( [# K L2 = sum(L2(:));- _# H+ Y5 [: D" \# p
sigma(i) = sqrt(1/K(i)*L2);1 M) f1 W8 w& Z3 w+ I2 v( D
end
K5 T+ M) O) q% @7 W, O# l8 G % Calutate weights$ h ^# `! n: Z8 I5 I( t, y
% kernel matrix
6 g/ G: f" K1 m( {* Y( I, ]& |' v k_mat = zeros(n_data, n_center_vec);( `7 g4 g% W8 N3 Q3 l' o( t, C1 j
, M$ F$ W& c! @: A
for i=1:n_center_vec! y! F" j/ Q$ ?% S8 @5 [1 ]
r = bsxfun(@minus, data, C(i,:)).^2;( {- B' j& A* N4 K
r = sum(r,2);
0 `7 I' Y# f) ? k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
3 x$ h9 Y7 I; W! U3 _' V& W end
# K% O* D2 [- @' o
, J& }/ T* `) b q, K; X8 [9 c- o W = pinv(k_mat'*k_mat)*k_mat'*label;
3 H J! U9 [, @6 {$ \; r1 ~end
6 L4 l* J% n! c _4 I/ F: [2 t& S( y4 ^4 H; H+ Y$ ?3 p5 {) k
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
) p* N, u% Q- n" x0 D; I; n& p
9 u" I" V! P. D3 Xfunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )6 P- X* u/ i% \0 l6 p% G6 ~8 K
%LAZERBF_TRAINING Summary of this function goes here
) r6 H- ^: G$ s# ]% Detailed explanation goes here
' m, N& \; W; O+ a6 x) x$ | if nargin < 3. L; L) W9 C7 E# C" T7 |
sigma = 1; & V D) d; ?3 ~
end1 l# C9 g' j9 l0 r5 ^
/ v E4 P% {7 x% O }9 M4 Y, k
n_data = size(data,1);
4 {: S4 v' D$ `6 L% G C = data;0 @8 D! @2 m+ J( g: r( `1 e
2 r! d( r" w1 g% M% C
% make kernel matrix
& Z5 h' f0 v# h' C0 V G k_mat = zeros(n_data);& e% Y/ y7 ^- u: l. K
for i=1:n_data
; p# I$ x- x2 j/ N* x! S' B L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);2 v9 {; G* @4 ~
k_mat(i,:) = exp(L2'/(2*sigma));
9 |- \4 w5 s9 I! m/ _ end8 d; x4 p& E& w- _7 g
3 M$ G, q( S F& B; `! c! |
W = k_mat\label;
. K* H6 Z# Q/ `/ B, aend1 U$ A" M; z; m3 t" ~3 ?( z9 s, t9 }
: I9 C4 m0 I" x Q+ YRBF_predict.m 预测
8 _+ ~. W& w u/ W
0 s- Z* G6 i- P" wfunction [ y ] = RBF_predict( data, W, sigma, C )" G! p, ~$ Y. R T. v+ A |! O
%RBF_PREDICT Summary of this function goes here' J+ @% @2 x- {, y' z( P8 k
% Detailed explanation goes here# {! w; |6 b6 M
n_data = size(data, 1);- o v6 J# u6 T3 h# ?6 z3 H
n_center_vec = size(C, 1);
/ B- I: I6 d* v0 ~7 i' R4 D if numel(sigma) == 1
7 ^: A t8 j' H. f: a sigma = repmat(sigma, n_center_vec, 1);
* c( O0 X5 v+ j4 f/ a" H end
2 m1 ~% I" r: W! z
6 k1 ~! F- b6 ~ % kernel matrix
5 R& \) w2 |9 `9 U* P k_mat = zeros(n_data, n_center_vec);5 L/ A- C+ c! ~% G8 v* Z5 ~0 Z
for i=1:n_center_vec3 J- t( L0 ^% P; l2 M
r = bsxfun(@minus, data, C(i,:)).^2;8 k& }+ l* J1 B) o9 [% k
r = sum(r,2);1 X r( w! l" k# [; R
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));" z: u1 y5 u2 U$ K
end
! M" C# N2 Q/ B& ^5 }& k
# L. V+ Z6 I- m- J$ K% ?$ o4 j y = k_mat*W;
( T0 t ~5 q! ?; b: @: w- wend
( X$ j, a n: k" ^( c1 f2 l5 I8 `: Q! A: V, `, h
————————————————
9 u5 J( u9 M3 ~$ y1 N! T+ G1 j版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 H0 F' z3 t0 D0 M2 s# B/ w
原文链接:https://blog.csdn.net/weiwei9363/article/details/728084960 a/ Y, \+ A. W3 t- q1 B. t
6 D5 @, _5 ] a0 Z3 d
0 B. M2 U/ d% `$ |' h. _
$ P9 z, k: G' K6 X |
zan
|