- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55571 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17623
- 相册
- 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的直观介绍3 i7 |) V% Y0 t; D9 N
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
" N; U3 |$ g$ I% V7 k- I" A( B8 k+ C* `, v) P% ~
1 RBF是一种两层的网络) a- S% r8 M A v& \, K# i
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
; b( p! h+ O) Eyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p) * Q% V& p+ O- K; d
![]()
$ L/ K8 X) G' o9 j- M7 s & l5 U y% u- F3 k# t$ Y5 z
2 RBF的隐层是一种非线性的映射
# Q9 c* B+ n) kRBF隐层常用激活函数是高斯函数:
+ _! ~* T f: v3 R* C ^; H- J5 @* p4 a/ n- C1 v6 t8 A- f
ϕ(∥x−u∥)=e−σ2∥x−u∥2
" F$ t' E: R) j; ~; l
) ~# s! d/ L% G# M4 y! C7 ?' c& L5 j' o8 N
' d/ W8 D9 I4 W3 o+ X4 z; _
3 RBF输出层是线性的
3 C9 N/ D& T4 ?. y8 E4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分3 V9 Y8 A& l+ }4 k1 O( F
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:6 M# w7 j6 j6 c: E; I6 D- M. X
. w1 G1 u7 E; E
F) q) ?; H1 s( p) r+ c上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
( e5 t3 S- z5 w" G' P Q
, N6 n/ [, R, ^0 K& \$ SRBF学习算法
B* G4 @* }" I4 W% E 8 x, \0 W& z) A; w
* o* k8 J4 O6 b1 O7 n
: v0 r) p$ u H9 a; g7 L6 ^, A3 z0 v# Y' D对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。$ q: w$ Y$ V8 c1 l ~
学习算法的整个流程大致如下图:
: B/ Q) R! j1 E; k. T6 X8 k3 n# X; a+ ?<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;">WW0 B8 m9 [* I. @
' e, t* l$ n: b2 |' R' ?
9 ^+ z+ Q8 q+ ?- S- e2 F- o具体可以描述为: m# u* _* Q9 n/ [. f
/ H, N. p k0 @; [
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
7 n/ W$ Z/ x2 ~+ l6 `" h( B; u2 ]' W/ [9 e; f) b" e7 p) T) l8 x$ ^
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
2 q9 }0 ^9 r5 f" g: e σ) n8 W* e: ^2 @6 e1 n0 I4 Y
i=K1k=1∑K∥uk−ui∥2
# u/ X% Q& T: x7 q4 ?2 Q: j* }# v- _$ P/ E5 `; h( S
0 B5 t5 y; f( Y* Y + f2 y, T( L Q1 T4 j- E6 {1 _) q
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得 N B' D# I! ]" l
/ I j- C3 h2 l2 ?Lazy RBF
" s6 r* T6 ]$ b9 d: d! n1 ?5 V1 Q7 o
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。* I) |" ?, @, v$ n; `
![]()
3 c5 b# a$ l" }* @MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。$ ^( ^$ H; L# ?0 \, t
9 Y8 n' W4 r. | M }
demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。* U( r. E( L, E: i6 R
/ H, {: B5 r: a9 V, s
clc;7 N0 K: u- x8 J* ~. e5 Q k
clear all;
) K' p! ~6 A0 n+ @5 T7 \- J$ N+ A3 Z) gclose all;
' [8 A( C6 H; g' m9 ~4 v; | U3 E w3 ]0 u' h
%% ---- Build a training set of a similar version of XOR" H; q( e% |# q/ j6 X
c_1 = [0 0];
# K& X5 g( \! n- `' e5 Q& Tc_2 = [1 1];
: m8 V) }4 G& i" t* jc_3 = [0 1];
$ ]4 g" r& U) ~c_4 = [1 0];
* ^- a8 n$ r! v0 M: ]1 f2 y r$ d# d0 I# z( b
n_L1 = 20; % number of label 1( J) s( _; y% D( D; g" I
n_L2 = 20; % number of label 2
' O |3 i1 C) F& ]; _+ q( w
5 g8 R# X$ q' X
* P: p5 ]0 T6 o) @ ^+ M- I7 C5 B2 P, mA = zeros(n_L1*2, 3);. c' C4 i; u* Z
A(:,3) = 1;
* n. \- C7 b5 \1 [$ gB = zeros(n_L2*2, 3);' b# Q% ~, n6 L; b. u! D; p, d
B(:,3) = 0;
: ^! s( {# t, @3 f1 f. L( m: m/ k! t* R" X" y. E
% create random points' k1 ]" ^- O; {6 q5 Z
for i=1:n_L1! x9 _ H& m7 e* }" _/ ]
A(i, 1:2) = c_1 + rand(1,2)/2;7 ?8 v+ F+ `: E9 _# P' C) K
A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
9 F+ q4 j2 ^. A. A1 g# G4 Cend7 ?+ {+ N' e1 N, X" _- t% Y
for i=1:n_L2
0 W9 E4 \5 R3 {2 |# I; c; l B(i, 1:2) = c_3 + rand(1,2)/2;* k- \. c/ y o5 j. f6 I* b- D
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;3 g: W0 m4 C: Q7 F% z$ c5 o- ]
end
, \% u4 s$ n6 z0 ]$ u6 J
# W4 K& f4 Z/ x7 M2 Q0 o5 R% show points
& y! ?7 [, J' |3 a) Mscatter(A(:,1), A(:,2),[],'r');' Z- l6 k+ I8 p5 G6 u) v
hold on0 g4 U8 I! Q! f) D
scatter(B(:,1), B(:,2),[],'g');" d2 f1 ?) Q5 ^* F- w' C ]
X = [A;B];" t, g* Y6 L. O$ q0 g5 w; y7 N
data = X(:,1:2);
6 P% R+ X: c8 y9 Z! o1 C. llabel = X(:,3);
$ i3 G2 n" |+ Z2 J, c$ V0 R
$ L/ t( P- r$ ~' p$ ?%% Using kmeans to find cinter vector3 L; S9 G( w& D3 e
n_center_vec = 10;0 w/ Q4 n* Q7 I& M
rng(1);% h# o$ z5 g: l
[idx, C] = kmeans(data, n_center_vec);$ Y" m3 r# f3 h8 u' R+ L
hold on
& T% G( Y$ q0 u% [scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
4 \& y' r2 j9 H6 C( s7 [& I7 x. X$ m1 b
%% Calulate sigma & F7 l5 A" L' P; l [% v* Z
n_data = size(X,1);
) w& C8 V0 S# R( X
+ N/ B* g F1 _! w6 I! Z' Q% calculate K
A4 \9 ]/ |# |3 d! F" W) MK = zeros(n_center_vec, 1);- f: f" n8 B+ Z% d9 R
for i=1:n_center_vec R; _. Y- @3 u
K(i) = numel(find(idx == i)); 7 N1 k7 X0 t0 v, ^
end. a1 O" S0 }; n* j1 a! t1 F
+ c# u; |# A) S8 C L% Using knnsearch to find K nearest neighbor points for each center vector$ ~: S5 ^9 r) E) ~! Y
% then calucate sigma
^" j1 s+ {5 ]sigma = zeros(n_center_vec, 1);8 Y8 q ~ e- Y" R& a* k
for i=1:n_center_vec
, W( @' K) N) Q6 R3 Y [n, d] = knnsearch(data, C(i,:), 'k', K(i));
, h, z. W# i. |4 ~, T" q L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
% G, t5 O) M3 a& k1 S& `4 k L2 = sum(L2(:));
& V( k7 Q* _( z( `; d sigma(i) = sqrt(1/K(i)*L2);6 W( ^9 v0 T" z
end
o) `4 b9 o: |. d/ {4 y* C7 l4 R) l6 Z U) c+ g
%% Calutate weights+ o' m/ J# O" v8 H/ Z
% kernel matrix
* O% @, c/ U- ik_mat = zeros(n_data, n_center_vec);
0 I5 a# {- Z9 A, V( ~: J' z
0 n3 }4 B1 @6 Y$ e! A7 b# b( G( _for i=1:n_center_vec
2 \6 `( S: g5 r% L0 A r = bsxfun(@minus, data, C(i,:)).^2;- e6 F5 c r9 i! v
r = sum(r,2);. Z6 O" G& ]: ]+ g! P* v
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));' v1 H1 l1 n0 H# R% F" R, F
end6 A) |6 f9 U# c1 E
0 }$ K9 @0 u$ V8 j/ \5 [4 n9 SW = pinv(k_mat'*k_mat)*k_mat'*label;
* t6 D) `# l1 {$ G) t$ iy = k_mat*W;
3 x# Z D$ I- n%y(y>=0.5) = 1;
% i+ F% F4 X3 B& G3 L9 Y; r%y(y<0.5) = 0;
; `% H" j1 ]2 F8 q. p6 q
0 {: G d. P9 h2 J8 z9 }%% training function and predict function
2 H4 D5 y5 ?" |# a, {[W1, sigma1, C1] = RBF_training(data, label, 10);
. n. @5 U; x5 L1 t9 |& c" W1 sy1 = RBF_predict(data, W, sigma, C1);9 N. S# r3 @2 f% P0 c
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);$ O' O% h: d% J5 G# p7 _4 w
y2 = RBF_predict(data, W2, sigma2, C2);* l# `/ `5 V7 Y! h* |% H% p/ L
7 D" L: f+ W$ F) K; |
8 a! K0 w- N: x0 O( n2 x
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
0 T$ I3 c0 O% j1 G# O4 n; H2 n2 W: n8 E( u; ?
RBF_training.m 对demo.m中训练的过程进行封装
$ _. K4 c. y3 Z8 X1 e4 A4 ~function [ W, sigma, C ] = RBF_training( data, label, n_center_vec ) ?6 n4 o$ z% ^
%RBF_TRAINING Summary of this function goes here& p* M8 L% @2 e) _ ~
% Detailed explanation goes here, f# n" L* A0 }$ w2 q8 N, F
& b0 J( l t1 J3 y % Using kmeans to find cinter vector7 s! {4 f: t: A5 b
rng(1);4 g& M, C1 }4 E; G9 N! Q
[idx, C] = kmeans(data, n_center_vec);
0 ]; O. H( d6 n6 J8 n3 P, K' I" z
% Calulate sigma
: `3 E3 u6 F4 |4 H; x7 G5 w5 a n_data = size(data,1);. e& X8 l* b8 v
, L& i6 i0 Q1 e# m. U0 | % calculate K
+ t* ^; b9 N3 R6 R% Z K = zeros(n_center_vec, 1);
: N, g5 L* h3 g$ c3 M for i=1:n_center_vec
, B( D4 [# k! g0 ]/ e K(i) = numel(find(idx == i));: ^8 O: N( o5 V3 F2 d! ?/ v
end
$ X+ d8 N2 G9 Q" i8 M' r5 S& G6 Z( O. A; t f- m
% Using knnsearch to find K nearest neighbor points for each center vector
' y1 f& r3 B) G % then calucate sigma
/ b, X4 `& W, h0 q2 y3 g- v. S2 T sigma = zeros(n_center_vec, 1);; l) S1 L' _2 Y. V
for i=1:n_center_vec* Q3 O8 x- ^+ ?! u0 B
[n] = knnsearch(data, C(i,:), 'k', K(i));
+ i- `9 g' Z7 e7 x! k L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);( A9 D4 n7 f: u" y
L2 = sum(L2(:));' j8 h5 B% [, k; a& n" h
sigma(i) = sqrt(1/K(i)*L2);
1 T/ W+ ?# }, m8 ~" _7 F end2 d8 }0 l/ R$ n3 M! l
% Calutate weights2 V) @8 C( v& u9 m0 H# U0 M
% kernel matrix
5 \6 s: F, ?1 q k_mat = zeros(n_data, n_center_vec);
4 k% A% F: P5 @- t* v1 f. @
& f5 T# d3 x$ G; z5 | for i=1:n_center_vec
+ S. w8 `; @2 s: ~/ B r = bsxfun(@minus, data, C(i,:)).^2;( R7 z( b- R* `6 K7 _- _ i r
r = sum(r,2);1 ]6 V8 v" }+ J v( p
k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));2 f# J+ ~) @* l, w* B
end
( j0 Y6 j& ~' ]& W8 x) `
9 T/ b1 R: k0 \ W = pinv(k_mat'*k_mat)*k_mat'*label;
1 y. E6 w" g5 _% `; N5 U. a1 iend
( A4 R H1 _0 N1 o+ n6 D; I+ n, e1 M7 x) U' y, d
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
0 \ ^( e8 o# y% `( Z) l9 {1 u% H- H2 C ~, I. S& c; L, L
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
- Y' m6 F! b W" T8 }, ]%LAZERBF_TRAINING Summary of this function goes here ?) t$ D5 h" \5 J, A2 [
% Detailed explanation goes here& t0 |8 H! t* u' Q, J$ C9 |
if nargin < 3- d8 J& y: `/ U* ~
sigma = 1;
+ {0 L7 ~. R5 X6 C* S" C% V end/ y" G" s- n" q3 l- g
1 [! t. P) o6 P- ^7 m
n_data = size(data,1);
5 `% k9 f$ d) b C = data;) \9 n" z# [) ~% y' w4 p
, Z" T$ j! m2 p& K' o) \9 F % make kernel matrix2 Z2 C# e. W% |# d6 C/ m
k_mat = zeros(n_data);! |5 K4 X, U- \/ f
for i=1:n_data2 j* @; Q# `, z y* |
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
$ g4 G3 C5 Q3 c7 r& u( g2 z* B4 Z k_mat(i,:) = exp(L2'/(2*sigma));
, s8 Z2 G9 f1 r* ^, @. C end" f% G5 {0 j9 c2 V; U
, V3 } u9 \6 F" w( ^- Q- ~
W = k_mat\label;' [: m( g( I; O2 M7 q
end
: s( ?% }5 V" J& [3 }% J E
( q# H0 p, |5 H; HRBF_predict.m 预测3 Z; N, c& h3 b' P: v
) m0 Q) _8 A0 M. }2 Rfunction [ y ] = RBF_predict( data, W, sigma, C )% e$ n" {. w8 C3 l, h( I
%RBF_PREDICT Summary of this function goes here
1 ?4 m4 H- f: n e2 q/ r* ?. S* g% Detailed explanation goes here& b, p/ n4 [; ~: u
n_data = size(data, 1);2 J6 ~5 p6 G; n8 {6 j) D o
n_center_vec = size(C, 1);/ ?/ D5 |( x5 ~. z' h
if numel(sigma) == 1
0 A; Q" h; R0 l1 e. @( |9 @ sigma = repmat(sigma, n_center_vec, 1);
6 O; G3 X( O2 u/ P# f end
1 O/ h) P/ e1 F2 I, d* w" H
/ T1 b& B6 ~0 e3 [ % kernel matrix
& {5 G7 y/ J% C3 F5 }, i k_mat = zeros(n_data, n_center_vec);
( z. E- D+ j* c0 z+ f1 k& G3 U- _3 H for i=1:n_center_vec" ^& I% G' L |4 N! ^
r = bsxfun(@minus, data, C(i,:)).^2;
& W- d. ^. S6 q. G a r = sum(r,2);
* t- a- P; E5 ?3 m. H& H% `, I k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));. X2 k, U7 I; G4 [, m
end- x6 I/ A/ V# i5 p4 u! I6 h
* N$ [$ J% B, U: ?4 n, T7 v) }" z% v y = k_mat*W;
2 {2 ^5 I: y. S) ~! |end) m8 R; I! K7 j( k( {
3 x2 T/ j$ w1 k* x$ l————————————————
( w$ n; C* l' l4 N版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" i; A% X9 D7 G5 c/ }原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
) j6 q9 J+ L# ]5 ^# b$ B
4 ?5 }* u5 f$ B1 Q( l% U
8 D6 C' N; Q; o; M5 u! O w7 K5 \1 [. }# i
|
zan
|