- 在线时间
- 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的直观介绍2 P8 k. K, g8 b& N R
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
# p# ]2 D) p3 t* p% i3 Q) Z- g3 L3 p( }- a
1 RBF是一种两层的网络
0 W( y9 P/ ^1 w是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
: w/ {0 f# Y: x, Gyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) ) X6 w+ K- u5 v$ u( c; D
" K2 [" s" {9 `) w+ s3 {. t+ n: [
![]()
7 J5 [) ~; |8 Z' @% }: Y9 y2 a: f2 RBF的隐层是一种非线性的映射
8 Z5 l0 j( ]9 c& X6 |- _) ERBF隐层常用激活函数是高斯函数:0 G" |1 [ Z; o; O+ Q. v
5 u) v! B7 S- x) C' b6 Rϕ(∥x−u∥)=e−σ2∥x−u∥2* `$ |* K) l' A8 q& o/ k0 }9 E
9 F; ^' R; [# B% _8 X
1 R. ^# ]* U0 s# L* m2 h! A; Y* B
- h2 W0 F( | n4 }& ]; ~
3 RBF输出层是线性的
6 z4 K0 s4 w3 {" L& D5 m6 } O( H4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分, g( }- o. E4 I' Z- h& r" H
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:4 ? L2 r! @. t% Q9 ^6 }! q8 q
![]()
- A2 f& H' ], g5 j, r6 B8 r4 F& E
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
. y2 \2 L9 l' B4 M& u% r
# l$ C% g& ]* X" h( ?RBF学习算法
_' Q; S* X& y) W 4 i* d+ @, T1 O% S& b, q
+ W: N/ n* \6 S# `: W
5 O* L) }2 l7 J8 T对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
6 a2 s# H' p. v4 B( H# H学习算法的整个流程大致如下图:% h$ k$ E0 v! 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
, R( y6 i. A4 y1 R/ Z9 v* D# X 9 a/ ]- d/ t8 `+ \( V2 K* b
/ |3 S0 Q+ n. P3 b& U$ a) ]5 O
具体可以描述为:
8 e4 L4 J1 j8 w8 Y$ e: r- J1 ^+ x# {( Y1 A, X" d# _7 |
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui% @1 I" ]/ y9 W' W! g1 e
# l6 G f5 F* c i' o3 |8 B7 Q
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]2 h( Q; Z+ T8 j7 ^2 G
σ0 z- u1 H m) Y6 G b- J; M5 s' D
i=K1k=1∑K∥uk−ui∥2" U$ H5 A% z0 Z9 c, _+ P5 ~) ~% W Z
" k- ?$ L( |% q2 t% r7 x g
4 `# C$ r" v/ I2 n- w1 J7 x
|; ]( }' L6 A. k' M
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得% E1 O1 g4 G" @* A: Y+ z
9 k4 Q' X7 Z5 J6 t, Y7 OLazy RBF
8 _) t( }8 c) D3 A, a R8 q3 N! j# z7 [( |
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。1 I5 J/ @5 o5 T$ X7 V) s
![]()
" Z) | v) t# @& F8 f1 a# H2 q FMATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。
# V, L e# M0 r$ D5 O
( C! S+ v4 p1 ? p( hdemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
, @. o( i- B& r: A7 {7 C6 A0 H2 b- p: W) b' u+ }
clc;
6 Z( @9 a- x8 V% w- N2 `clear all;4 n8 k4 x# K" c
close all;) d( x: ~7 s" t& m t% z( r M
0 J' |; z5 i# f3 w
%% ---- Build a training set of a similar version of XOR
6 l+ S0 o J6 Q8 @' M7 c: N( u) t( ec_1 = [0 0];7 g, F1 X. G# I% C: t
c_2 = [1 1];
& s9 j# ]5 ~: T5 G/ W& v, D9 {c_3 = [0 1];
" L# Q1 P& F; Xc_4 = [1 0];0 m1 A; U/ X0 \& [
8 }+ O# z @0 m# O: Wn_L1 = 20; % number of label 1
1 e' ~8 ?" W Y: ]( {& x2 B! ^n_L2 = 20; % number of label 2( z) }; G4 N- Q0 P% I/ @3 A
8 F a5 X4 a7 o, }
$ W; R/ _: ?. _
A = zeros(n_L1*2, 3);5 u; M# O# X9 G a/ P2 I4 K
A(:,3) = 1;9 _( t: }4 W2 c) H; j$ U: J% W
B = zeros(n_L2*2, 3);$ p3 R5 N" ]+ h) {
B(:,3) = 0;( d; O* u7 u/ `6 p7 K
{! m3 B% p6 m/ A$ M" ]: h! r3 L% create random points7 w& G P& w: G- {
for i=1:n_L15 k3 P4 z2 I1 h7 r
A(i, 1:2) = c_1 + rand(1,2)/2;
7 F/ d% X I/ s# S& [: J A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;8 }6 ]& C8 ?+ {% y" w' c
end
! l( b% e1 t: }4 ~for i=1:n_L2
- y; g5 a: Q' }" G6 S$ T' F/ Y B(i, 1:2) = c_3 + rand(1,2)/2;0 o3 h! J3 J0 ]1 S6 L+ N
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;2 j" S+ ]7 U5 j7 H- A3 x5 j
end
0 u, b3 v/ U, p/ P" V# e* n; F0 q6 H: u9 s4 W. j- D
% show points
& b8 J( H( }+ @scatter(A(:,1), A(:,2),[],'r');
' z, \$ ^ r7 f' A9 C) ehold on( J6 ] T/ M7 s
scatter(B(:,1), B(:,2),[],'g');" O' J( j6 G3 N) U1 @1 P. Y
X = [A;B];
, E3 Q2 s. M8 Q/ w& ]: a+ x) idata = X(:,1:2);
$ b4 I8 N# y8 X! u: Flabel = X(:,3);+ O+ `9 g0 w+ g" d4 g
0 u+ n& E3 L6 {/ M%% Using kmeans to find cinter vector; l' e4 L' Q5 V0 t( f
n_center_vec = 10;
) R0 r. Z+ w2 f4 l% Prng(1);
8 Y& @) P3 k, ~4 p: F: U[idx, C] = kmeans(data, n_center_vec);
b% W4 y! H) u* B. H9 chold on) O( u0 u0 R) o8 x
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);0 H2 F6 }6 P* k
" `' n: C& m d1 Q%% Calulate sigma
# q3 d7 }" Z/ P( X' H$ An_data = size(X,1);+ X/ V4 y1 G& l$ Y/ k" L& v
# g' M) t3 V* i% calculate K/ ?) r _+ Q: |$ P
K = zeros(n_center_vec, 1);
: }8 C C2 b9 j' J; a8 Xfor i=1:n_center_vec; R; K6 n) q }& ]8 G5 b, [
K(i) = numel(find(idx == i));
. J" V S3 {9 S2 F# p" W$ C @end
) i2 R) z |) K: A7 ?7 Q2 e) j% @: x$ A) U& {. m B+ ]- b
% Using knnsearch to find K nearest neighbor points for each center vector
6 g5 c! \) l& ]- G. G# w% then calucate sigma, M9 u+ s a% _1 [
sigma = zeros(n_center_vec, 1);# p* X, q- F' ~* n- X
for i=1:n_center_vec6 C- q1 w- e/ y% w' v# P% \
[n, d] = knnsearch(data, C(i,:), 'k', K(i));
~5 f: ] u# c: D L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);) Z. p5 ]4 ?. v9 F$ B- E
L2 = sum(L2(:));
& P% M" H( h0 n& O% c. m* a# n sigma(i) = sqrt(1/K(i)*L2); V4 b/ J# U+ p
end
0 N3 R; \ v7 c" j% f/ S: a4 {5 i) m* X! q$ C0 \+ `3 G
%% Calutate weights
% H2 U" B& ?8 ]7 q6 C/ x9 j% kernel matrix" {& n0 ^* x. ^( ?) Q
k_mat = zeros(n_data, n_center_vec);
% i/ x% P# {+ f: E
2 ]* m3 W2 G( U" w$ O# ^for i=1:n_center_vec4 c3 j& G2 p* m
r = bsxfun(@minus, data, C(i,:)).^2;
% q/ N- M& d1 Z# B6 d, G r = sum(r,2);
% S/ g# d) w6 w: } k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));4 p& E: z% _4 X* E8 v1 {6 l ?+ {
end
( E R/ E. g! G2 j
; s, K1 V) S7 X1 @3 u3 zW = pinv(k_mat'*k_mat)*k_mat'*label;
8 d4 D$ W6 r# r7 }y = k_mat*W;% E+ t/ H3 }9 d. K4 D' o$ q
%y(y>=0.5) = 1;
0 Z! S- E- T2 O+ [8 v7 F, j%y(y<0.5) = 0;6 l- z- L' o) \- F8 s' u$ m
. F) \ W, x, ?: ~7 p
%% training function and predict function
% J+ V4 i8 E2 U8 H[W1, sigma1, C1] = RBF_training(data, label, 10);8 K; Q; [+ s. d5 D+ J
y1 = RBF_predict(data, W, sigma, C1);+ I! M+ F7 G/ {2 r2 Y' ]3 A
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
@/ S% [& O$ m! V3 R" {9 T% ry2 = RBF_predict(data, W2, sigma2, C2);2 B2 E! Z- f @" B I$ d3 B
, L" T3 f( }) M }9 {
% O! | P6 L, \; F, |上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。% C0 q: w( u3 E$ j' r3 P C/ M
4 N- Q! N; S! x3 I
RBF_training.m 对demo.m中训练的过程进行封装$ O- h9 U' ]8 D* K, d
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )
! f$ u% d& @0 z* b& g" ~%RBF_TRAINING Summary of this function goes here
7 \; ?) f$ \ B' P% Detailed explanation goes here
* w$ { T7 C* {, D7 G3 `+ _
7 ?0 c& n, \9 T % Using kmeans to find cinter vector
+ R( P7 \# D' ` U z! k rng(1);( \' m8 t4 o1 f' N. K/ F- b' O
[idx, C] = kmeans(data, n_center_vec);
0 I$ v$ U6 @: Y! `. E% d- S1 [* Y; l, a; {
% Calulate sigma % e/ f& `5 J# i; {! N8 q& Z
n_data = size(data,1);6 Q) q. j2 N7 d( Z4 Q5 }
$ u- |# `; K6 t* F' K4 K' L0 L
% calculate K% _0 }2 c: c" M) v% t+ Z
K = zeros(n_center_vec, 1);
7 _1 j/ G2 k3 @" B7 ~2 T for i=1:n_center_vec
! X8 @8 R3 E! t+ D, w* m8 _ K(i) = numel(find(idx == i));5 j8 | d) |0 Y* p. H
end
) `1 B+ D5 C# P4 m- W; ~
4 Y& `/ y; T' S$ O. @, \ % Using knnsearch to find K nearest neighbor points for each center vector
$ o/ F( r, r7 C/ ?0 `+ C+ I* S % then calucate sigma
, y/ D7 i- l$ ]2 ^; b% Z- p sigma = zeros(n_center_vec, 1);
! B+ m/ D7 ]2 N, O6 G- E for i=1:n_center_vec
3 h8 l4 V8 Z' o! g) [3 \; w [n] = knnsearch(data, C(i,:), 'k', K(i));$ T& B+ q( ~" d" w: R
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
3 ]7 G, e9 R# j( i( F4 D L2 = sum(L2(:));
$ h7 a9 ] M1 T1 L9 t( T" F sigma(i) = sqrt(1/K(i)*L2);
& N8 U W# c- |- {1 q end* X) B4 u8 v) Z0 I, u/ @
% Calutate weights& ^& [3 i5 c# n. f- W; H
% kernel matrix) J) M+ m; O) X I
k_mat = zeros(n_data, n_center_vec);
& C1 m! b0 M; p4 K5 f% n8 o: ?) ]5 {# ^. U
for i=1:n_center_vec- \% t1 }& m* |- B/ ]) K
r = bsxfun(@minus, data, C(i,:)).^2;2 M( s8 ]; A* j6 c% e
r = sum(r,2);5 s s% ^$ V { F/ k
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));: t' V& A: e$ S4 h/ P+ U# x/ T' t* A
end, k" Z# J4 k8 k6 k" L1 ^
* d* z4 I5 b7 s8 T- u0 o
W = pinv(k_mat'*k_mat)*k_mat'*label;
# D! d% U3 m* }& ?0 Eend
8 C% ^* ?8 L$ h* h0 p8 F' g
2 {, F/ p% B" e3 ^* e/ `RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法% }! X6 B2 V. D) S. X
9 D& }/ L! H7 [( x4 Z- R
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
1 W% i* K2 L" Y. ^: T/ Q%LAZERBF_TRAINING Summary of this function goes here1 f+ z! E# k1 |- n
% Detailed explanation goes here7 N5 y- @' t6 l/ w2 j
if nargin < 3/ O- J8 ]) d/ e: c# M4 k# N
sigma = 1; 3 \: b6 K* j0 g+ a! H0 p2 P
end* e9 a2 p7 _3 p- S: V; K' s, P
- j8 A, _7 B) ^' a' i( L n_data = size(data,1);
# L2 J6 R% g( T/ f; v* g+ t C = data;
+ u. B( F d6 g3 K8 T4 O8 Y8 d0 u. k/ k2 i
% make kernel matrix0 P1 v& t8 X4 L2 a, F3 q
k_mat = zeros(n_data);5 W6 P2 p! C$ F! N( d4 I
for i=1:n_data# D* S" O% W$ h% g5 E- [; x
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
2 z) T# s+ Z0 |6 ^; s3 V8 w2 X k_mat(i,:) = exp(L2'/(2*sigma));' p& z+ C$ ?/ ^/ M% C' {9 C. U1 C
end
4 ?/ e% u0 s. `" a" {; L: o. ]& i' d5 S7 g* x
W = k_mat\label;
4 l" o2 Y1 S4 ~3 gend" Z0 R& O8 L! s2 f% @5 s. k
+ O5 |- K& ^9 s" w! x* W+ ERBF_predict.m 预测
* I+ q: S& w Y) b/ O) w. ?, c. X* E
function [ y ] = RBF_predict( data, W, sigma, C )
7 b" R* c0 c7 L, c# d8 N' z K%RBF_PREDICT Summary of this function goes here4 K- K2 i5 `( T% L5 D6 J+ t' m" K$ C
% Detailed explanation goes here
' W8 |+ ]* k, u' Y8 k* [ n_data = size(data, 1);
5 h: v; A8 k6 o& ? w0 I n_center_vec = size(C, 1);7 e, \9 @" Z2 D0 ?
if numel(sigma) == 1
5 Y2 E6 T, p7 M7 w# f6 `. b" I sigma = repmat(sigma, n_center_vec, 1);( A9 r+ @1 d* g; y
end
- y. Y1 i7 G g3 P/ [7 z1 o7 ^0 k$ _, ?- M
% kernel matrix
/ K( P0 @1 M4 V' j- g* `8 w; n k_mat = zeros(n_data, n_center_vec);8 D3 a/ l, g: y$ P* b2 P+ r5 e
for i=1:n_center_vec J& c9 [" a! C
r = bsxfun(@minus, data, C(i,:)).^2;
2 f8 I6 Z" y- O; j& y- ^ r = sum(r,2);
, x3 B+ \# j* F+ r& u3 B k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));" s6 r+ ]" h5 F
end. R0 N% q- a. R; e
, I* s3 o/ r6 f y = k_mat*W;
, |7 _ F4 q$ s/ e" Y( g. _, mend, ^5 T& i) F4 {
& t1 `0 L* v; A0 K0 F" I
————————————————
7 m3 U# {. v1 I! u7 c: L4 y5 D版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" |1 w" D8 \) d: v& P) k7 k原文链接:https://blog.csdn.net/weiwei9363/article/details/728084968 [7 @2 l5 I- ^; Y. M1 v a
7 Z) L4 j- g K4 u) F
" y; c8 f5 I4 F: x% K" F* g3 u q! G+ u4 g9 r
|
zan
|