- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55580 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17625
- 相册
- 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( [7 ?4 H* \$ c+ x# URBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
( ^( c9 Y0 G% f0 C# t: M$ I6 \( X+ U% j1 ~
1 RBF是一种两层的网络
! ?2 \& v2 u* {$ t7 a2 z1 J是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
( \/ |3 w2 O* Y) n, W& n& C* uyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
: K4 \' i$ d3 e- X& J # C+ c" ^7 Q/ W, u
![]()
3 @) _- P+ ^; Q7 z8 R# v; ?3 t! e5 D2 RBF的隐层是一种非线性的映射' m" y0 U: n) P
RBF隐层常用激活函数是高斯函数:
0 u& R8 Z1 O8 I2 K! e. ]
5 @8 C& L W1 T' w4 eϕ(∥x−u∥)=e−σ2∥x−u∥2
* j( Z+ `3 [6 r& M! j
6 Z! L4 d0 P D2 j$ {# j: a' Q. U! w5 Z, p. R) T0 d5 Z w
( }" K- P6 K4 R$ l3 _ [1 R: Q
3 RBF输出层是线性的% o& y S2 n0 s! N
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
5 e5 U9 w6 Q* V: XRBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
. W/ v) R' y' f2 \8 T![]()
7 W9 }( T4 P8 K6 @- N U# m; ?5 b0 C8 @4 ~
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
! _/ `' r% I/ Q4 H% S. n! ]" y" b+ ?3 A' k# w0 l$ s7 Z+ G" k$ `
RBF学习算法
+ [! X ^4 d( e![]()
) U2 M' }6 t/ C' @: Z- y0 S; n5 d1 z2 m) D1 }0 Q
]7 ^2 g! W2 g' Y3 w
对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
" B, }' W1 y% s2 n. A8 {7 }学习算法的整个流程大致如下图:- l( d1 O; {) 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
: [" s& q/ U/ G) x - u4 K, O) e2 C6 N4 E l! I
! J. R+ y) T3 R4 \
具体可以描述为:
* a+ S% A w: q% i* t1 D+ s: ?
0 e$ ?2 N1 r5 W' x/ s: O1 X1 S1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui, i$ D9 R* _+ ]
: k3 D" L- \) J* w2 W: g
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]; d% z/ p" \- r2 Z# U& I
σ
0 X- [: T; H6 z; l! c$ si=K1k=1∑K∥uk−ui∥2% C( ^. _- Z5 G
& V) L9 y" e! E) p0 O
( y5 I! f3 O/ W8 }2 f & [6 h4 n. Z. m& W- {, ]
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
& X- e! ?% q: n( A1 o8 q" m2 J: ^; G9 ]9 ?, a; m
Lazy RBF
! |( f1 n& W' K
% y6 t6 Y- g$ H* j* {0 l& }可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。( ^1 ~4 ]5 p6 Q; p3 W9 v) y# q9 h
" e S% w. s+ ?" c: e0 ]2 x( g/ w+ V
MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。' V1 N h- n, L: q
9 Z1 S7 p: T/ S0 B( W$ o2 |
demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。 `- s- W, ?3 Y( `
0 `7 |7 n& e, n2 @( v! p2 F0 |clc;! W3 U8 o0 p, Q9 p5 k
clear all;* T5 n# t' k6 B9 V, a. \
close all;
1 I$ {1 W9 F& X1 K! X/ E5 q8 C( s4 g( o% s; C" T3 O) w2 w
%% ---- Build a training set of a similar version of XOR
9 H- J. k& j& a, Zc_1 = [0 0];" t- H" C* c, e: Z+ G q# [
c_2 = [1 1];
6 v& v& M ]9 i6 lc_3 = [0 1];) @) T- e: T! I* i! }$ P' G
c_4 = [1 0];
# ]' M2 [9 \4 U( Y$ K8 J+ m7 o, s m8 h8 z: v q
n_L1 = 20; % number of label 1
6 ?- M* P" i& t; y9 `5 g+ s/ an_L2 = 20; % number of label 2( T+ V+ M. R5 f8 k/ U0 |# s( K# x
% O, n' T% A5 Z- b4 P; R8 A
) t2 w; n3 Q- j4 X0 _A = zeros(n_L1*2, 3);2 M' p+ f ~7 E
A(:,3) = 1;0 b, U& e8 l* S' @
B = zeros(n_L2*2, 3);6 ?) [. U2 N. m. d7 {% M1 n+ I
B(:,3) = 0;$ {6 k& S+ s2 w
8 |3 [, x3 F7 G( }& B
% create random points! y' H0 D0 I9 l7 m
for i=1:n_L1: [* w* S3 j5 z* @
A(i, 1:2) = c_1 + rand(1,2)/2;
" i+ G8 f9 }/ i. a0 V4 Z1 _ A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
$ q+ Y" ?: T' Z# [ R9 V) n% Uend
( i3 r2 A Z% R3 O" cfor i=1:n_L2
$ |7 f) z1 v6 | B(i, 1:2) = c_3 + rand(1,2)/2;0 G6 |0 D- d" }; R
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
7 G) U( r/ P0 u$ D& Y0 Jend
9 ]3 N% O( }$ a' n; {2 T; M
& X' b% ?# [. [, n9 }% show points
. z; o* \1 S$ n+ \, f Qscatter(A(:,1), A(:,2),[],'r');
( O' H6 A0 n% b" b1 Y' j& b# u ohold on
7 Z5 [" `) c' a7 j& ?" V( R, ]scatter(B(:,1), B(:,2),[],'g');
5 a) c% \: B& HX = [A;B];
. y; r j" [. Hdata = X(:,1:2);$ ~" c+ q0 v4 d X& F( k) E
label = X(:,3);, e8 X$ S. u8 h. J
; F" Q/ C" G1 y" g
%% Using kmeans to find cinter vector
4 `5 M. w& F& ?7 Fn_center_vec = 10;
$ D% u7 `* K+ ]% g9 V7 Trng(1);
/ X- H0 a9 c% Y& X8 w[idx, C] = kmeans(data, n_center_vec);
% J& X9 L+ r) G% p: K0 }# Xhold on
& Z+ A% j' ]: V. t3 W- ~scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);8 l4 ?3 M3 l# p; w D3 D
! s5 B$ T# k) ?0 x' I: g4 }# d%% Calulate sigma 8 s6 l" ?/ f- n: |
n_data = size(X,1);
( [. w; {3 e# H1 ]
1 t6 g% h* M; h; w1 U% calculate K
+ F" {$ ]* v4 F: L- \K = zeros(n_center_vec, 1);$ J' r) \9 ~0 T: p# t! ~( ~) k
for i=1:n_center_vec" @+ Y1 ?* Y, V+ Z
K(i) = numel(find(idx == i)); 2 ~; C1 W$ Z9 m ]: O. \
end
1 m9 z+ X! I( F: k& V4 A" F/ V! z1 q
% Using knnsearch to find K nearest neighbor points for each center vector0 X+ r c9 R; H4 B$ Y5 t1 c; T6 L
% then calucate sigma
+ T& ^0 G2 L3 \) _% Hsigma = zeros(n_center_vec, 1);# | I8 s% K4 b" |/ @8 H" R' e
for i=1:n_center_vec
4 ^- N2 a, `5 b [n, d] = knnsearch(data, C(i,:), 'k', K(i));
& c' J! a* c3 k2 K3 L- k7 \- w L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
+ Z( z3 d. m. l7 ] L2 = sum(L2(:));* u3 V6 u2 i$ J/ f& }7 E: y) f3 ~
sigma(i) = sqrt(1/K(i)*L2);) @/ i+ L9 P+ m" s# v
end
! Q1 d3 L) T2 @$ @0 r7 N1 a U8 d- d. E6 U3 x" |$ Q
%% Calutate weights( T3 d" ~3 ?4 v, R+ h0 t
% kernel matrix
2 D# r; x3 H8 O% e; fk_mat = zeros(n_data, n_center_vec);( R! D( s- v5 T. H
0 n9 O5 A% x6 W9 W d& L
for i=1:n_center_vec
4 _. T- D8 u0 Y7 x3 l5 h" O! G r = bsxfun(@minus, data, C(i,:)).^2;7 M% U- }5 {' Y1 w# ]6 h G
r = sum(r,2);% A0 O5 y z/ @& Z0 U: l7 E
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2)); \6 ~& L- j4 H% H! i/ x' F: Y5 n
end
2 ^2 Y9 q8 g! R
( b) M: w) C$ V6 B+ L' W% GW = pinv(k_mat'*k_mat)*k_mat'*label;
( }# h$ |$ \& g G& My = k_mat*W;
% w0 j& D& s; o( E8 ^%y(y>=0.5) = 1;
4 x; U( M6 J, X* p, I& [# d1 M%y(y<0.5) = 0;
6 f `; ?4 J* `% j' s- Z. @% A
, }' h# A. S0 t3 r%% training function and predict function
+ n' o' Y6 z B" B" ~' A8 Q[W1, sigma1, C1] = RBF_training(data, label, 10);1 x2 t9 Z; H! G/ w/ h
y1 = RBF_predict(data, W, sigma, C1);
$ Q. P- r% {; E; z1 H; ~6 o[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
. L [2 X0 a" b( ?: [/ ky2 = RBF_predict(data, W2, sigma2, C2);
; V* L7 y3 U' v- a 5 @$ A6 ^) e. S3 P6 {
/ ~5 W' z4 `4 S: j2 y
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
' \! C) D. R9 d1 d4 I: z3 ]- w! T/ H9 }% C* z
RBF_training.m 对demo.m中训练的过程进行封装
* N/ H3 n; x0 M- ^# S2 v. p" `function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )( @3 ^9 w" O- f* K7 S8 r) K1 h, T! _
%RBF_TRAINING Summary of this function goes here0 P1 l! z9 t1 v' r( f" n7 w
% Detailed explanation goes here
1 F! w+ {) @8 U2 v3 }& c+ `
6 P! _9 T! v9 K; v- c% m9 H6 q % Using kmeans to find cinter vector
' z& Y& w& c3 K; L0 y, a2 J/ I6 n rng(1);1 ?1 r9 {2 D" k# J( a# L" k
[idx, C] = kmeans(data, n_center_vec);( P) [# T) T1 j6 Y7 J
2 N, Z Z( N& T. Q
% Calulate sigma
5 T1 k5 W4 E) o6 Z2 A n_data = size(data,1);
6 G3 B0 Q3 q5 Z. |. n: d! u6 N0 I- Q% @- i7 y) E
% calculate K
& U8 m7 f& |4 `8 J K = zeros(n_center_vec, 1);
, q* T" _; H: r2 \ for i=1:n_center_vec
8 u0 W) j- S. C' q9 h# w K(i) = numel(find(idx == i));0 y# g, E4 j3 k- ~
end
9 } Y9 N+ V3 k0 e0 m
# q" U" ]3 }$ W % Using knnsearch to find K nearest neighbor points for each center vector
7 J# [! N1 _& H# v8 W3 j4 b! v- ` % then calucate sigma3 I0 x0 Y! F" Y/ S6 @
sigma = zeros(n_center_vec, 1);8 l2 B% z& l- p. R# Q
for i=1:n_center_vec
, L. H8 y, @$ v4 y" C [n] = knnsearch(data, C(i,:), 'k', K(i));1 J" z$ O, z8 L
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);& R$ X& B ?( T+ W
L2 = sum(L2(:));) u8 K2 W4 b* `* z
sigma(i) = sqrt(1/K(i)*L2);
* F& N# j3 y3 M y# K end; k6 H( {# L- t6 H0 l
% Calutate weights0 g; O1 l7 O9 [
% kernel matrix) }( L% S4 @( g! Z& q4 P0 {
k_mat = zeros(n_data, n_center_vec);
! |! x# B5 G) l
& C/ F6 y `3 q+ g for i=1:n_center_vec$ J0 v, Y4 {+ v6 { a. C# M- u
r = bsxfun(@minus, data, C(i,:)).^2;4 ?: C; Z7 l: C) n
r = sum(r,2);
; N5 p& F& z( E/ _$ w k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
- u |' N, E- G8 ~& L/ J8 Q) B5 x end
; s/ t; }; T; v l+ a7 x$ P" l4 d* Z: n
W = pinv(k_mat'*k_mat)*k_mat'*label;
* t2 h6 v: L4 C) a3 B6 Q$ C$ ^end
8 E9 F6 s6 F* Z5 D3 a* L1 L: l8 x& m* ?
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法' e- ^& k6 L" u
2 l4 M! B1 w* n5 {
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
/ e* h3 b5 l8 ~- A6 Y$ i) O%LAZERBF_TRAINING Summary of this function goes here
& B$ ]# X* f1 m7 l% A6 X% Detailed explanation goes here
6 @. W6 y$ p. {, w8 S4 o6 V$ O+ c if nargin < 3
3 e, \) t3 e# i* {& Q5 d sigma = 1;
" B7 Y7 m% y8 } end6 U6 n; E5 [3 ^0 g
9 o) @, i, @- u; Y) n- R n_data = size(data,1);
# O. T, j3 Q; T' I C = data;
$ `, K3 j& |& D$ ~5 J
# Z; [; `+ e/ B6 X. l7 W0 m: K: ?: G % make kernel matrix3 ^. Y. f6 H6 B6 X" m% T% H( Z' a
k_mat = zeros(n_data);
5 C0 N; ^& s7 |! D* W for i=1:n_data
2 J$ Z5 W9 K1 V% W3 k t L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
$ M" ~! v- M" f- f9 a k_mat(i,:) = exp(L2'/(2*sigma));
( M2 k ~9 w* n end
- |7 K( Q8 {# K8 g K2 ]# t, A6 j: X# r( i v; e% C
W = k_mat\label;1 _: }2 o2 T* f4 O( w! f
end: u3 q0 ~5 o4 s" P! m
- s' w& `0 i" M
RBF_predict.m 预测# |# M2 }, H/ s1 q/ o% ~: c; J
! ]( S$ T1 R8 G! u# J1 l
function [ y ] = RBF_predict( data, W, sigma, C )4 G# R6 Y0 r4 z4 \* k/ K
%RBF_PREDICT Summary of this function goes here
( r% c7 R. I5 d j9 k% Detailed explanation goes here, W. l6 w8 \; A/ b6 @" `0 j$ q+ U
n_data = size(data, 1);
$ V2 l, l& {- }- |8 p( X n_center_vec = size(C, 1);- d+ P5 L# k, [" f: B
if numel(sigma) == 1; E5 i/ v2 v2 B; y9 i) S2 P" O9 l
sigma = repmat(sigma, n_center_vec, 1);( z! u5 L% }# E. k8 q9 @3 ?
end+ v2 C) o6 x6 D7 p h+ z* j
9 v: U" K9 W3 |! L
% kernel matrix
/ [+ e. S4 _* a, d4 I# n1 ? k_mat = zeros(n_data, n_center_vec);, Z% W9 g L3 ?5 O5 X: A5 D* ?
for i=1:n_center_vec
" _3 i% t r, _ r = bsxfun(@minus, data, C(i,:)).^2;
7 P+ V. p z0 K: K) q m# m6 F r = sum(r,2);
% R/ z y( A* q! v6 z k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
: \, x* Q& d8 f0 w7 V8 ?. M end
4 V6 L# b9 t2 j7 m2 o# a+ t% |9 a, ^. c7 J
y = k_mat*W;) I& H5 Q% l/ i# p: _) D, y+ c4 N
end
r0 \( S3 ^% n% k) Y5 O/ A& D5 ^8 ~* L% L; M0 l7 a6 t: J4 c3 l F+ N
————————————————: y0 m9 l7 Y( T. R0 ~ d5 Y. w1 c
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, j: Y9 \' x$ ?+ Z5 ~- P1 Y
原文链接:https://blog.csdn.net/weiwei9363/article/details/728084961 K2 e' y+ r6 ?8 t/ x
; B H r2 ^" F" f: S3 H6 L) |
7 y0 l$ g: J( Y3 Y y8 x2 s( G4 o y+ r0 N
|
zan
|