- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55559 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17619
- 相册
- 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的直观介绍7 ~. u7 v1 \/ B ?. C
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
9 O- B, ^: l$ \% B8 z& p5 D
0 Y$ k- a0 M: w9 }$ d! j1 RBF是一种两层的网络
% v6 Z$ f* y: e是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:4 d, D$ E0 V0 p
yj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) 8 Z' \" S3 n5 }5 V: W% t7 ?
& E5 d6 L7 N# e' |* s
![]()
7 a x" S: L+ W0 ]* F5 A2 RBF的隐层是一种非线性的映射7 ?4 X1 s; E6 _$ `, k& u
RBF隐层常用激活函数是高斯函数:# m4 W) L! E9 [: n* ]2 B/ e1 f
u: a& ]0 _1 `( K7 s% H# F
ϕ(∥x−u∥)=e−σ2∥x−u∥28 h2 v; h( n. U5 V8 m
* ^3 |# Y5 X! T! I8 \
3 t; {: Z& f) y) ]* o! _* i0 a9 e% g* F6 Y; f& y
3 RBF输出层是线性的; E" Y9 x' N6 N: e7 G7 ?% S. N
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
! O( K. s$ l0 h" Y& v5 _RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:# u# h, X3 w3 E4 l b! n
![]()
& }! n7 \" w( K% ^
W F8 a4 O# D/ ~: ^" w上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
9 D5 M7 o8 M0 \+ u. v6 P2 l6 Y( ~! i1 h3 c0 b
RBF学习算法
/ _6 \& W% }3 ?* _ * Z+ T% u3 |& [ }/ t/ b
6 h. ^- j; L& N, f- m, _3 ?
/ I0 o5 [- _/ O G8 q对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
% C8 L- W; u/ S; E# q学习算法的整个流程大致如下图:+ I/ R6 g3 ^3 _! C, p4 v, F d8 I
<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
8 J/ l' E; c4 C# u6 Y% z3 s![]()
! L' c$ G! F- b+ j) K
' t! q% X/ o0 E- T& v具体可以描述为:
9 d" k" C# c& ?# F' t. \; ~
9 f6 H4 L" B# k6 Q. F4 `% N' ~1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
6 H- @% ~8 c; G6 ]8 m$ z0 d
. w) n' I) C) }2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
% P" q- }. S( s4 X# ?7 x# f8 O σ: Q% F, O/ Q7 ?/ D e
i=K1k=1∑K∥uk−ui∥29 |3 u% I4 i o! ^
) D! y/ ?/ {0 Z2 T, ~ V" b! H
H6 N4 G' t& T' b" G8 t/ J; c) ^ L; H* Y& a" d8 f( r
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得
4 Q2 U8 d1 H0 ?) r; O7 T/ z5 t0 v1 s
* h# m7 @+ z Z2 mLazy RBF
: V. r( y1 y8 \2 C/ A+ v# k8 s4 @1 ^ b+ R$ t/ o3 Z
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
2 q1 m0 d2 e% G![]()
* G; B6 ]4 ^5 L7 J' [' p3 |MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。 V: X3 E* Y. P. X
! X6 o4 n7 T# t/ K r
demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。" h7 ^7 [8 E! ~; f, e
4 R: q% |8 b# e( Rclc;2 r K l2 ? t- U. k) c
clear all;; k" i: z2 \( w& T* O
close all;/ I& }' v3 | a' W5 l% n
% c" v* `; d+ v0 p2 P9 C
%% ---- Build a training set of a similar version of XOR" R) a! r) R: l/ g+ E+ q1 a) f
c_1 = [0 0];
3 X- T3 ^: @- I# v7 J# Z; u7 bc_2 = [1 1];
; x# v9 u3 K" Z2 ?c_3 = [0 1];
6 J9 l+ M( R7 h$ v- mc_4 = [1 0];
2 j) T' E) R/ ^0 j5 ~0 G: V
' f5 c6 g6 F; a: L, H' |0 on_L1 = 20; % number of label 1
$ Y) |* \& @4 G$ p9 F2 d, [n_L2 = 20; % number of label 2
* D) n! x5 C# z3 n" }( H
4 h7 y+ N% S1 d0 p. V, K2 J. @ a1 x, n9 J8 e; D
A = zeros(n_L1*2, 3);9 _0 g8 S% P( l) [
A(:,3) = 1;) t8 M* B8 ~, K1 H
B = zeros(n_L2*2, 3);5 _ y. K6 T7 }3 Z2 r
B(:,3) = 0;# m1 M9 ~, ~9 n4 f+ x7 U
0 Q! V. P; y; ~- r% create random points
) T, L; Z# J' ~* N0 Lfor i=1:n_L1! B1 O2 X+ {" \
A(i, 1:2) = c_1 + rand(1,2)/2;
* q: \( o$ m! V9 q* p A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
1 Q1 Q: H7 |. {" T' o( Z0 U+ m; J: nend
1 e7 `, b- e1 c: J, efor i=1:n_L2
% D6 Q' n2 s2 k0 a1 z- i; q B(i, 1:2) = c_3 + rand(1,2)/2;
8 j1 h7 a1 z' d8 S B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
0 H$ i) h2 \( T8 h. ~& E( H* Vend# `. H1 V+ r1 I: Y j
' ~) G/ |) Q; d! K) l% show points" ^' R3 ^* R( }- ~. {. h% _
scatter(A(:,1), A(:,2),[],'r');: q. A$ |( Q4 x9 s2 y Y- }
hold on$ H6 |8 B2 Y# a" g6 m. p
scatter(B(:,1), B(:,2),[],'g');
. I. K, H, B# I# L0 NX = [A;B];! Q" x) {2 k; U2 r, n
data = X(:,1:2);
+ Y1 n; c2 ~- h i/ [; R( G( v) E, Hlabel = X(:,3);7 D4 V4 F& z1 t4 a
3 z' d6 k. _/ T" k8 e9 A
%% Using kmeans to find cinter vector
* k, z' }) @# N8 ]/ K; q$ @! on_center_vec = 10;; ~+ h5 r d( a: R7 O3 T2 P* @
rng(1);
1 L3 _0 I/ {7 v; a[idx, C] = kmeans(data, n_center_vec);$ Z9 l- G K( E5 p9 Q+ T$ x
hold on* T0 M6 R0 W; o* ~) k, Z5 u; Q/ A' K
scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
9 O* Q( y8 g n' k) ]; Y! l: c0 Z* u H( t0 ^7 s; Y4 e% B( X' p
%% Calulate sigma
! q" D) D) D X5 ^n_data = size(X,1);5 z% W% v# j# i2 ]
6 Z3 T7 y: l5 u# q% calculate K# |+ `: p' O9 |% g3 B/ ?
K = zeros(n_center_vec, 1);/ I* Q' c7 t" D# o& S O
for i=1:n_center_vec
; @2 |! d. m2 W4 o1 N; ]6 u K(i) = numel(find(idx == i)); ( {; y R0 ?0 Z5 s/ i$ b; h
end
7 O- C0 C* J( R% N# K" @. B( |) ^ Q
% Using knnsearch to find K nearest neighbor points for each center vector5 Q9 L2 d( i# z- e5 E' V
% then calucate sigma5 w7 N/ y" g- R( N: [
sigma = zeros(n_center_vec, 1);2 ]. B w7 y* B& W
for i=1:n_center_vec
/ t* }# p7 P5 D [n, d] = knnsearch(data, C(i,:), 'k', K(i));
( u3 k: y9 r5 L9 K2 w. a7 o. e7 X% o" z* s L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
8 d9 q0 h. M# N w2 B" m L2 = sum(L2(:));# x: T* T- A- J# _, j& }
sigma(i) = sqrt(1/K(i)*L2);
& a, S) f( a7 T8 Y0 D8 i# H& kend
5 {& I: A# G# j' `8 V; l% l
" _( t1 T3 X! V. `, ~. `! Z%% Calutate weights
: I: Q$ h$ Z8 K# y) u, ?% kernel matrix
2 J( W$ c( x0 K5 gk_mat = zeros(n_data, n_center_vec);
0 y( }6 f2 {* p/ G9 _$ @+ R0 B# Y/ ^5 Y- Z5 {8 G' m
for i=1:n_center_vec' y: H. b% E+ M& n. |- Q0 X, [
r = bsxfun(@minus, data, C(i,:)).^2;
0 t3 Z+ \( ~6 K7 R2 l+ } r = sum(r,2);
, T5 A% N# y3 g) r k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
6 M5 @% j* J# k& Z1 c x0 Hend
3 U7 O3 V; e# G E. y4 m
$ \0 w. i* k, I3 i& L# nW = pinv(k_mat'*k_mat)*k_mat'*label;
$ m$ }, P$ B/ @2 z' \ F* [& @y = k_mat*W;/ V/ {# b$ T. G
%y(y>=0.5) = 1;
( A5 o9 I: j7 W' f% ~%y(y<0.5) = 0;
# l9 [4 c3 d: y% Q9 t' l9 U& ^+ @& i. M, e: t
%% training function and predict function
/ @9 Y# k) p1 B. P1 h( N1 s+ V[W1, sigma1, C1] = RBF_training(data, label, 10);9 H ^: {; m8 t P2 x
y1 = RBF_predict(data, W, sigma, C1);1 v8 X. G2 [# Y7 ~0 R
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
; }" R3 {" Q/ g; ~0 Dy2 = RBF_predict(data, W2, sigma2, C2);1 n9 B3 H9 S6 \: e/ Z( G
![]()
# y- N% K2 n& N7 V/ s& @
3 j/ H$ u- w5 T3 K; f# x* ^上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。' h6 u# [2 [" x
" d* ^9 U% c1 n. XRBF_training.m 对demo.m中训练的过程进行封装
$ `; S1 o/ g/ R h3 u K/ `1 f3 x( cfunction [ W, sigma, C ] = RBF_training( data, label, n_center_vec )
: E9 S- r. d- W: h2 n" w7 a%RBF_TRAINING Summary of this function goes here
# i. [- K) ?" S, v7 m% Detailed explanation goes here9 |2 }0 G8 h9 S9 T6 }, k/ T. q. b
' P; p' F+ i4 p8 k' m$ K % Using kmeans to find cinter vector
- Y/ X1 j! a7 \% J. q0 U rng(1);9 ^0 r, n) F0 g- ]3 P
[idx, C] = kmeans(data, n_center_vec);
: @" \3 I4 l4 |; k0 r8 n
" B+ j! d# e, w % Calulate sigma
$ w. w" C1 h( a+ ~, w N n_data = size(data,1);
2 U; x. Z/ r- z! b7 g8 }
$ P7 h y0 V! w7 R3 M % calculate K! U; I, b: G3 E3 r. Q+ x
K = zeros(n_center_vec, 1);
" b' a& W) p8 m for i=1:n_center_vec
/ x C1 ?0 _8 d! i. N) Z2 L0 F) q& r K(i) = numel(find(idx == i));
5 }5 D! U& C" N end
! ?0 [) H1 s/ Q6 B, c9 Y
; Q- J* J; O" A4 M5 d+ }7 f3 @4 Z6 e % Using knnsearch to find K nearest neighbor points for each center vector& M7 q8 t& v: F1 ?4 W K ^
% then calucate sigma
* C7 i! |0 ?5 m sigma = zeros(n_center_vec, 1);
, g0 L4 w+ D9 W% `5 | for i=1:n_center_vec
& n7 @3 o0 O1 S [n] = knnsearch(data, C(i,:), 'k', K(i));
0 ~& q, J8 F9 R: {- g L$ \4 S L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
) f1 q1 C' l- p1 A& l L2 = sum(L2(:));4 W9 J& s5 r* g: [
sigma(i) = sqrt(1/K(i)*L2); k) J0 A8 z; Y+ z+ ?, Y. j
end
" L& d9 m# w" x5 S % Calutate weights
- |+ o x: r5 G# C, F9 N* W) V& _ % kernel matrix, S" C% V% O, v( D+ C
k_mat = zeros(n_data, n_center_vec);: V: f& [6 y9 L7 g( \0 u" s
! v& `7 s: }$ L I- _0 p2 h
for i=1:n_center_vec
3 m- [, i" @" [& X- ^ r = bsxfun(@minus, data, C(i,:)).^2;
6 A1 L( m. D0 x( Y0 V% @1 o9 e r = sum(r,2);" n6 ~8 ~4 f* W. A$ c0 I/ [: |0 ?
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));# B4 |6 p4 m& L1 t% Y+ X! G ~8 `. ^
end
" A8 g! o' _5 S
2 l. _( W$ @; K( D* r) ]' { W = pinv(k_mat'*k_mat)*k_mat'*label;3 w1 t: q+ L! d8 E
end7 t0 P( Q! B* V3 Q, {. F# I' h2 f
W3 K; L0 |- V: ZRBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法1 I1 p4 M0 X5 `2 T1 [% t) B
& s$ g+ }6 S+ {; C4 ^
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )7 _2 N. Q' ?2 I
%LAZERBF_TRAINING Summary of this function goes here2 i1 s# I( L# m& E: v" i1 G7 Z
% Detailed explanation goes here
; C6 b6 C4 p# j+ K9 D0 t if nargin < 3
) W3 f4 C) }# f4 q sigma = 1; 8 ~, A0 v8 v' s" l: }
end0 t; N* M8 Z* t* R8 k6 t
0 o6 t9 {, ~( y# u' d3 w
n_data = size(data,1);9 I$ v& M+ X/ F7 w4 }+ E
C = data;$ ]' _ r' W) I; R0 ^
: q* r7 H3 J0 b+ c8 v0 Q& ?
% make kernel matrix" Q& |* j9 H9 T( }3 h( X- |4 U' \
k_mat = zeros(n_data);
2 I' t: o- {3 i8 y7 L9 `5 f9 ^2 n for i=1:n_data9 v+ p v% P5 }! f2 ?* z
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);# C' O) n e1 O; M# m
k_mat(i,:) = exp(L2'/(2*sigma));$ L3 \5 f+ q" f# x5 z
end- [- E" L7 ]/ G* R0 |
5 N, Z$ I- p: V W = k_mat\label;1 o4 _+ u7 ]4 e5 d/ K" x
end
+ o# l3 H2 ?$ m
, x' g% J5 t" N; o+ r7 FRBF_predict.m 预测
" s& m& [) {1 D# ~2 y( s% W) `) t; S' O; t' f4 U2 L8 f% ^! @ q( s
function [ y ] = RBF_predict( data, W, sigma, C )
8 x, F; P1 g9 `9 A0 ~* j3 n6 X; R; u%RBF_PREDICT Summary of this function goes here
% h/ f$ X# J; J+ K" i* e, v% Detailed explanation goes here t2 l% T8 E; P1 Q# G/ P
n_data = size(data, 1);% E' |" a$ R% i! S
n_center_vec = size(C, 1);
6 W0 D! B+ S5 S3 ]5 ~0 u) w if numel(sigma) == 1% y5 @" A/ {7 U. Q2 x0 ]# a y
sigma = repmat(sigma, n_center_vec, 1);! l6 D& Y% L% S( T& |. [1 Q6 L$ n
end
3 I) A# U5 W2 Y7 X
3 [7 n1 p. e# M6 j+ ^3 R: I& _/ n8 H % kernel matrix
4 d7 i& w7 J- W, F8 T$ M k_mat = zeros(n_data, n_center_vec);2 o b6 U8 m7 ]% Q. r7 `+ O
for i=1:n_center_vec
9 E1 ]5 }- w. r' c r = bsxfun(@minus, data, C(i,:)).^2;
" v( W8 a" k9 e; i: o0 B/ b! M r = sum(r,2);4 C2 k0 E3 j- r
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));& W% [9 s- X& Q7 O+ B
end
* S# ~8 k- X k6 ^! m' V( ]$ p( }. c& T3 A% F- \
y = k_mat*W;0 J& N: T$ C4 F& \* D
end
& B1 z+ T" G# h4 B6 L. f. o1 n/ R O6 ]1 j- z8 F3 q. Q
————————————————
! X' e% Z9 M5 K, ~4 F7 i! S' n( d' k版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& ]5 w0 p( A; s
原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496" C' }$ _' s1 u6 S0 M/ t& n: z
6 |+ w" X+ s, o, q. M1 z7 t/ D$ G2 B' Q, F3 M1 q5 Y. Y
: k5 N: h. d V) k |
zan
|