在线时间 661 小时 最后登录 2023-8-1 注册时间 2017-5-2 听众数 32 收听数 1 能力 10 分 体力 55527 点 威望 51 点 阅读权限 255 积分 17610 相册 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的直观介绍
, y3 Q: v7 I0 U4 x RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识( }2 e" b; f0 `6 q7 |/ t
9 s7 A+ }/ e: W. u 1 RBF是一种两层的网络
) ]% m+ W% K" m1 f4 E 是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
& j, H4 x/ X1 S yj=
i=1∑nwijϕ(∥x−
ui∥2),(j=
1,…,p)
9 |+ A K, x- `. d
5 ?: I) w2 q& I2 v
( O. [# P8 M6 `& _2 F4 v
2 RBF的隐层是一种非线性的映射
: k7 s9 z# C+ d. b N, f, i RBF隐层常用激活函数是高斯函数:6 f% C8 A6 K. `" m/ H5 Y
) k$ |+ ]' S% w2 l
ϕ(∥x− u∥)= e−σ2∥x−u∥2) T3 P6 z: P1 q2 v: O+ P
& Q8 ~ K6 }1 ]- _5 N+ T
$ n8 x: N4 K+ O1 m, Y+ g7 U
* W9 j+ w+ O7 M9 | 3 RBF输出层是线性的! U- o) F: Q1 C$ S- X# u9 X+ _
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
' }% i7 Y- m) u" ?6 ] RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:6 f/ k/ G9 O7 B: Q- y1 c
2 [2 ?2 y( [* w/ ]7 d 9 W/ z- u9 n* N6 b8 ~( Y
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
+ Q% X% T6 b \/ W! b7 w, l 2 \, r; c. V7 D( {
RBF学习算法% \, r F9 v; R
( d" d" R% {& y) Q
, P- c. R, @3 O; u% B7 G6 @
+ W' u. o1 ]0 v4 r 对于上图的RBF网络,其未知量有:中心向量 ui , 高斯函数中常数σ, 输出层权值 W。 2 |# n8 P7 a1 w" v# b0 B8 L, F; R
学习算法的整个流程大致如下图:
9 u3 a) N' d! L/ 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" H; K/ ^5 o6 B k3 v
. `9 d. h& N* G' h" Z
0 C' U" s3 o4 t4 b' q/ I1 {3 @
具体可以描述为:
) |% V6 G" q( I7 s) b+ w4 ?% u3 y 7 F* w% _* H- J+ B9 Y# x
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
9 u5 Y' {* H3 [8 h9 p4 z
2 ]4 N( X* l( v3 f 2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
7 r' W4 l: A; X σ 9 I, A$ L" h+ ?! y. w0 M9 e
i= K1k=1∑K∥uk−ui∥2' ]6 Q8 ^- i- e. c, U# \
2 G. j% R, U- E; \# E
; o5 E: {7 R }0 C' P# n7 m 7 E* H1 A, y" T( O/ W8 }# K( M
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得 " \7 E4 B4 n( @0 x# R
* k: ~. M# ^6 Y9 W0 S# G& I5 ? Lazy RBF _8 k) S/ |! _4 o+ s& V
2 ?" |, ^3 Y) S4 s4 g" B( ] 可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。! f# |% p R0 }& I0 y8 w/ D
- ^" Z' w) @) s% B; T9 w6 X MATLAB实现RBF神经网络 下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。) O# |6 Q" _9 ]5 P
' \+ H$ P9 w0 H5 s3 B, ^7 q demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
; U8 D/ C( f9 O4 X5 h3 T$ c
* G8 v' z( H/ C8 f' ~) W clc;
0 P" a! Q* P4 f' O clear all;4 w) A T* M& x3 `1 t5 V
close all;& V: Y [& I# m( A- {/ {/ f8 ~
& c+ o2 N4 D7 } %% ---- Build a training set of a similar version of XOR
* ^7 v; ?) {+ h/ y c_1 = [0 0];
1 R' w; I* n8 v: v0 Q$ k c_2 = [1 1];: K; t$ V3 M( x$ Y9 d
c_3 = [0 1];; N2 N4 h# l X9 b
c_4 = [1 0];/ f5 A4 V1 {. _1 A0 d% A8 u; U
; w$ [" }* W8 R7 M
n_L1 = 20; % number of label 10 D* p& M1 K! O- z" c+ g( X
n_L2 = 20; % number of label 2
1 ?+ ^$ v) [( ?: {6 o$ M$ K. r- J
9 K" T" i8 R8 o% {* ~# s8 s , M! w9 q" U. m4 q+ u
A = zeros(n_L1*2, 3);
' [9 O- P H0 |# U A(:,3) = 1;- s2 I1 h7 C- H. a5 D0 n; F9 c
B = zeros(n_L2*2, 3);+ ^3 Q* x' Y! v! E4 Z" G4 _ D
B(:,3) = 0;
3 r, \, p/ `! G% F 9 i, ?1 ^, m8 t3 K% _! z7 V( O4 c
% create random points
0 D; T' k* J7 r D: [( W for i=1:n_L1; K# r5 q2 v" c# M4 S! M i, k# ~
A(i, 1:2) = c_1 + rand(1,2)/2;' ~ q5 ?7 P' E/ a5 H2 H) X
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
7 l* @; P Z7 o) d$ x. R end4 r1 t' U% e$ s' l3 _( \9 A
for i=1:n_L2" {8 ` _$ `. m$ i! A
B(i, 1:2) = c_3 + rand(1,2)/2;1 s# S% r% A# u% I8 N4 G
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
. N+ G- G9 p# U: L end
9 @0 z& A4 g4 j" ? Y% T- Y, C1 d; a0 y
% show points
$ H' I/ [, Z# o* b1 r scatter(A(:,1), A(:,2),[],'r');2 s' [6 I) f9 J( X+ J
hold on2 W8 Y9 d' A0 \6 @
scatter(B(:,1), B(:,2),[],'g');
d8 ?, Y1 ~8 x' C8 c X = [A;B];
, i% m1 Y! A# x7 q$ k9 s1 X4 Y7 X data = X(:,1:2);
- J( t/ P5 ~, t label = X(:,3);/ S/ o8 [8 D! ~- F
$ y1 K, Q5 ]* B% v2 ?8 s
%% Using kmeans to find cinter vector4 b& \/ r& k1 c$ y/ f) F% s4 B
n_center_vec = 10;
6 Q1 c9 x; f8 k' z, s3 s rng(1);
2 c7 z* D- R+ b% Z2 y9 K! f [idx, C] = kmeans(data, n_center_vec);
4 U; B1 m, o9 @0 D, S hold on
- ]- J) U3 d5 n w* Z scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);+ p' k2 }3 O, p# A2 a1 {# w2 t
$ B; _9 e2 O) ^2 G0 x
%% Calulate sigma
$ s/ ~! T" j! w# s n_data = size(X,1);
1 u! K. V2 x( ~ # _" |3 a) e! o) P1 ?
% calculate K
6 `2 c/ S9 Q5 t7 i6 d9 K K = zeros(n_center_vec, 1);( V% c e4 Z6 a. B; B
for i=1:n_center_vec; a$ f& ~/ @$ `0 l- e- V& s& ?
K(i) = numel(find(idx == i)); 8 G: B/ u0 W4 I1 g; j9 ~
end
3 V- q/ b( k) W' M1 z" Z* @6 N% A
. W9 S" o' v' d/ F % Using knnsearch to find K nearest neighbor points for each center vector
" q- p+ {% N7 A % then calucate sigma; v/ u+ t1 A W; P3 F$ W
sigma = zeros(n_center_vec, 1);
7 @- B; d/ X% e- z0 r/ a7 p" |* j for i=1:n_center_vec
) Z. q+ b3 E* Q& y6 E! S3 q [n, d] = knnsearch(data, C(i,:), 'k', K(i));' l5 k- p$ M. u* A
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
# i9 J% s4 ]# B+ X# S: f L2 = sum(L2(:));
- A1 X$ ^: g4 L3 D sigma(i) = sqrt(1/K(i)*L2);
/ f( D+ n9 h9 b% }8 y$ } end$ ?6 D2 p1 D7 N: ]4 u( E) X: z7 b
& S, n8 M1 T5 o: t9 _5 z% ~
%% Calutate weights9 R4 E. W$ i5 O, i* I
% kernel matrix
8 d6 k8 W+ A( w k_mat = zeros(n_data, n_center_vec);8 g4 g5 t6 z' p2 l3 n
g) ?2 l, R4 n* g; U3 [
for i=1:n_center_vec, S% X7 v$ V: N- Z9 c" g
r = bsxfun(@minus, data, C(i,:)).^2;
! Y' P1 ~" `/ u4 k( c( n" ?5 d$ z r = sum(r,2);, u1 B+ S% h3 ]- k' X
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
' E3 Y$ w: }" K+ q8 T( j7 b end) B) M- L2 n+ n7 E% T: _. b
8 z0 o, @" M, ^( b$ y* p
W = pinv(k_mat'*k_mat)*k_mat'*label;
/ w& ~0 f) U, U; h" s0 x y = k_mat*W;. }4 @, z. {6 K/ S: a/ Y7 K& R
%y(y>=0.5) = 1;& i j) T- Z$ u/ m
%y(y<0.5) = 0;& d5 k( n3 m2 M, W0 k: R/ y8 K% p0 o
$ m( x' e) n5 Q5 C
%% training function and predict function
. T- a8 I% j7 F* |- _* r8 g/ E [W1, sigma1, C1] = RBF_training(data, label, 10);
$ l3 J( [# w+ P& z y1 = RBF_predict(data, W, sigma, C1);
; \- m; F6 `7 `5 {) \ [W2, sigma2, C2] = lazyRBF_training(data, label, 2);
/ R1 F, @8 N$ v3 C+ @& B7 O y2 = RBF_predict(data, W2, sigma2, C2);8 ^' a" h$ u& y& Q1 k q
6 @* X2 }: ^; T, _' g9 X$ W
" I" S! {4 e# s. { 上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。% C* U1 t# c# p
) @5 o. Z) o, K4 l( }. t& V
RBF_training.m 对demo.m中训练的过程进行封装
- T0 F% h, G9 S/ J2 m" j" P: w7 Q function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )
6 m1 J* Z S3 ^0 [% o% ?$ V) J %RBF_TRAINING Summary of this function goes here2 ]0 h3 `+ m/ o, l7 A+ E
% Detailed explanation goes here7 Y9 c; V! r- T- @: x
. C* I: G& B3 E. l9 Y9 F8 G
% Using kmeans to find cinter vector
" v, f+ G: s3 P1 W, z+ G/ X rng(1);
7 T D. r8 K" q9 Z' Q [idx, C] = kmeans(data, n_center_vec);
8 H: i% s: ?6 R1 G( }( w, n
1 Z6 p: h5 |, y0 B" m& b % Calulate sigma
d& ~% x3 G1 G C( F7 k- Y n_data = size(data,1);5 l f* m+ b0 Y$ m5 g
/ ?. y) f& M8 Q0 M
% calculate K3 S7 s5 A! }; W$ H- Z2 U% {& _
K = zeros(n_center_vec, 1);& U) G ~# Y5 x& V4 Y! p
for i=1:n_center_vec
! {1 }/ ^0 e) q" U# Z( w- O K(i) = numel(find(idx == i));
@0 r7 x2 |" I end1 W& v+ Y* y+ R# I, F( c
J7 x8 b; y8 j5 N/ p % Using knnsearch to find K nearest neighbor points for each center vector
5 R. {& k M R % then calucate sigma
+ \; ~! t$ B! V% q. W6 c sigma = zeros(n_center_vec, 1);
- O5 F4 d% q# ]# L! ^9 s1 X0 q for i=1:n_center_vec
9 _5 \1 X$ E2 J0 S" }8 [- ^ [n] = knnsearch(data, C(i,:), 'k', K(i));! q" Z$ h( R. W9 F2 V6 s! b$ T% @
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
) x5 T0 A! K @! ` L2 = sum(L2(:));
, Z" Y% g4 c. L- R+ _5 s: V sigma(i) = sqrt(1/K(i)*L2);
- m5 H2 s3 e; I5 F# R1 f) U end0 \9 m1 G5 I3 g E5 @/ Y% L- b* n
% Calutate weights x7 d% a4 l& v* ^ I
% kernel matrix
0 I2 O: m( ?9 w2 W k_mat = zeros(n_data, n_center_vec);0 ~4 ~# R9 f- y+ H
% T2 Z2 I( e& t* s
for i=1:n_center_vec
# ]( F6 J/ @, W" U/ P9 m# x2 b4 l r = bsxfun(@minus, data, C(i,:)).^2;
2 y! o/ R' k4 \7 Q r = sum(r,2);
3 I) G/ H, }' Q$ O3 I8 w k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
- I/ S, m6 g, Z. |6 ? end
' q! p& `, U8 i" O9 R. \8 ] / T k0 P& H! b
W = pinv(k_mat'*k_mat)*k_mat'*label;% ]9 a- F4 N6 o4 C
end
# S! p5 a5 _9 O8 `5 g- R1 p
# |! L, d5 M! q3 t: Z8 q RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
+ y6 {! J9 m9 c/ z 3 M! Z' E+ e# X$ |
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )- L- a' e' o0 y9 t! ]
%LAZERBF_TRAINING Summary of this function goes here" O% L& x' a, L% F) G! I
% Detailed explanation goes here. p/ ~6 o7 `0 F' s, o4 F) |# \
if nargin < 33 Z# x' R! T7 U6 n1 b. {" ?
sigma = 1;
3 e8 x; P! N1 E, @ end
0 P" m) k5 H: E' v/ G7 z
" C7 w. k% v* Z; {# e- H$ E n_data = size(data,1);2 Y5 E& @2 n) h; _- X0 j! j" ~; d
C = data;
. }5 M3 v# [% P9 V . V5 g% z) A. g; i8 k
% make kernel matrix- N% u% A* B; _
k_mat = zeros(n_data);
3 j: V1 w3 ~" u for i=1:n_data0 h) `- p: o! W! d( _! a( w+ N6 m7 d
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
3 ` ?! w6 O* N7 ] k_mat(i,:) = exp(L2'/(2*sigma));: V( p- r( F9 y: ^# D& E% r9 b
end" Q; c8 a) c, H
0 {! c7 l* l+ K W = k_mat\label; e# z3 v* C( V1 h3 `
end6 E6 d2 k# l2 K) Y, h
0 [! m" P- t7 h& z3 l; M# \ U
RBF_predict.m 预测
# M' h! G; I6 G
* _& [7 Y( h; A function [ y ] = RBF_predict( data, W, sigma, C )
8 B7 H: K) X9 C! D9 N" O7 n$ u6 u %RBF_PREDICT Summary of this function goes here8 N# x7 z% Q+ d& {% O
% Detailed explanation goes here
2 A3 W4 q& ?$ i) Q+ x n_data = size(data, 1);
0 ?+ |' O0 H6 X7 Y1 z n_center_vec = size(C, 1);
) p J% S$ c4 G1 o$ t% g G if numel(sigma) == 1
9 f, G; _3 P9 }# W6 S2 j7 { sigma = repmat(sigma, n_center_vec, 1);7 x v& P+ g9 H( r
end
: x5 S6 i* K2 j# ~% J7 m
# i: c4 l$ o$ g2 f' @( ` % kernel matrix
; E5 C& n2 D. W4 i k_mat = zeros(n_data, n_center_vec);. \- E5 W% ?/ e7 {& b
for i=1:n_center_vec
7 x4 v$ m/ F: V+ {3 ?* h9 V b r = bsxfun(@minus, data, C(i,:)).^2;
5 t; x* P/ ]9 B3 t4 a! E) {* k! }$ \8 n r = sum(r,2);1 P5 { E8 s0 j, y' K" X1 M" z
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
, _! R, O* Z1 o. J7 y" A end
9 Z9 `/ X* q3 q2 L
0 I$ U1 K2 f& J) W- t y = k_mat*W;
8 W4 m8 {3 N; T% @ end8 r u( \! i& w4 B+ Z! R
9 u' U4 Q* [0 ]& T: X) L" |
————————————————
+ _/ j' {; q: H; p$ m$ G X 版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; Q7 j- @: c; F, U3 K9 [
原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
& s$ ^* S# Z; `* V0 e, S- s
. m$ r# I& \6 |7 N8 b k2 b& V
, \/ M/ V. j5 [2 ? " l0 s0 B5 ~* \, W4 @; I4 P9 `% g
zan