- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55541 点
- 威望
- 51 点
- 阅读权限
- 255
- 积分
- 17614
- 相册
- 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的直观介绍 g3 K& i+ A+ z0 d. b0 H
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识
: L6 {7 P7 G1 t. `9 q% I) J& W% [ E- o6 S
1 RBF是一种两层的网络
/ ~* C: `7 L8 K2 A7 ?是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
0 Y6 D' e9 h: n+ E8 ^$ Y+ tyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
* x" u k/ F( A# a& w![]()
2 R9 R0 u1 H; i; O: \ % |5 T" k9 e/ j# P7 @$ E
2 RBF的隐层是一种非线性的映射
5 Y& H; h2 m( b7 `' fRBF隐层常用激活函数是高斯函数:
% r- K8 d" N- Y# P" {) T2 P; I: I
ϕ(∥x−u∥)=e−σ2∥x−u∥2
2 K. n) ], Y; s7 k, n0 G
0 C! ]- i1 m8 L2 \' M- i. k( u! ^8 m2 A. f7 K- m7 M3 i% x5 T l# f
2 q/ b9 l+ v* ~5 x
3 RBF输出层是线性的
) G- g" M( X2 _4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
" L+ J% _! u& k( H0 ~. x5 ]RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
; E* `! j" z. s% |7 S 7 n- T, M% H/ x0 v
' o. N6 I0 }. @9 i
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。4 q$ n4 N% J# U# o5 h
& U0 ^4 J/ g/ _& c5 }( d
RBF学习算法
3 y( |, B/ y/ n( ^3 z/ ~ + v# [8 z( b: C! |) o
0 ]. U2 ]7 `$ D1 ?5 _
5 ~) b b# q5 ?" Y3 l6 y对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。
, `+ x( c# w: V C, D学习算法的整个流程大致如下图:* ^8 P6 a" h& A5 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;">WW
7 @/ X, O" q! x6 s" y2 T; j5 W* ? 9 L1 M3 @, i6 i+ u+ U/ A
# J! g1 g7 ^9 _' U" }具体可以描述为:
5 F* N* |! M. K* U3 [7 h
; q( K9 q4 u0 |+ b3 b# z" |( A1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
' m3 L3 _1 y2 J$ E8 z: K
, C, x/ i1 k$ y2 I2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]& G) ]+ I) j. ]( d
σ2 {3 _; T/ B) H
i=K1k=1∑K∥uk−ui∥2; f! }, G) j- ^- e$ F" f1 ?
0 r$ V0 l0 @; A4 P
" _" f# q- i, H3 e' x
' U3 _; S; E* t% l# f0 E" {! b! Z; x2 s3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得( J6 d: s/ n9 J& }$ _5 C
- P1 ?7 _1 d, J4 V) x$ G- d3 j# \
Lazy RBF, Z; j% y& v$ D$ F8 ~1 R
" F+ ?2 J0 S: z. e- j- }! J$ e可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
' f. v: B) |( F2 x! v5 ]! Z' X- _![]()
^# c* V: d7 p2 k0 W6 V# wMATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。 G3 ~% @. P! T8 T
$ _9 p8 V" G( ?demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。& ~. h& p& Y5 G+ y8 ~# {6 Q
7 ?3 L/ I" C' _# ^
clc;* T1 R! U$ M* R* s8 ]+ H* l
clear all;
X; g) D6 t) U) j% S% I6 t- _close all;
3 k8 E* p8 I) s/ R$ i, I; ], i9 i. x
%% ---- Build a training set of a similar version of XOR
0 H/ n! O" Y5 m& O/ Lc_1 = [0 0];5 M; \/ O5 W# @' H: E" y7 g x
c_2 = [1 1];) ]5 H. I- f# v7 u0 g5 I2 S) q
c_3 = [0 1];7 [6 z! o$ p8 V9 V
c_4 = [1 0];: ~1 R- O4 F3 r# c* ?/ D: D. c
8 @2 d; \ d/ V" in_L1 = 20; % number of label 1
+ z8 {, S4 \( a! y' @n_L2 = 20; % number of label 2
( h9 w3 h6 T* |) }5 K1 k4 ]3 h7 Q% F% M9 g
! z% B: f$ a$ W1 i( a* j) R+ mA = zeros(n_L1*2, 3);
) b6 A/ C2 O3 a- Y3 mA(:,3) = 1;1 K, O5 @ _3 L& j/ \3 t0 j
B = zeros(n_L2*2, 3);0 g, J; y, J1 r1 f( L6 L: O
B(:,3) = 0;
2 A/ x7 W' `! K; z+ ], Y; A5 V( P: m2 r0 S; X) B: o3 X
% create random points
- n6 y- a) ^4 s2 gfor i=1:n_L19 v* R; C; i1 i
A(i, 1:2) = c_1 + rand(1,2)/2;
4 S" `. |) x Y: R5 K A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;/ e# T' ?) D0 _
end
1 v% R% Z7 ?# E& }, ?+ g4 Rfor i=1:n_L2
0 P7 P) L @5 g) T$ x, G) M B(i, 1:2) = c_3 + rand(1,2)/2;
4 f3 }1 c9 m; d3 t1 }& h B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;/ ^* x+ V! U+ \9 g
end
/ ~4 U8 G7 J9 e. v5 i$ s8 P, \( w2 ^1 L, f; T" Z3 H0 O& @
% show points
& @7 B! y- {/ z! o' Rscatter(A(:,1), A(:,2),[],'r');
_5 R) f8 d N6 l6 I" p* |hold on
4 r3 @, R: [4 b7 G3 ~3 z0 I Yscatter(B(:,1), B(:,2),[],'g');: ]$ i( C" E/ x+ m* X# i
X = [A;B];9 k! Z& }" G' k9 P9 p' x" }& ^0 T
data = X(:,1:2);
, @: E- G. C3 m) |6 g; s, S9 |label = X(:,3);
^! |9 ?& X$ k* D/ y( d, C" ^1 V0 L0 [( M3 p. @! j" M
%% Using kmeans to find cinter vector
/ ]& j8 I; m7 P- Xn_center_vec = 10;0 z: ^% A1 R! B6 }* R a3 |
rng(1);
& u0 O" u5 s5 @+ b- Z* c8 Q6 R[idx, C] = kmeans(data, n_center_vec);) ?% ~" y) ?9 W
hold on
5 R" f& {' g6 I6 Qscatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);& O' f6 ~# j6 x
, I. b5 ?3 k) r9 ^
%% Calulate sigma 9 }! w) F* t0 U* V1 y, M0 d! U7 }
n_data = size(X,1);
; _& `- \2 ?! G$ D! h7 y2 x6 S
% calculate K
5 I8 G2 _8 U# A6 OK = zeros(n_center_vec, 1);
* }4 t- N; R3 `' |. k( } s$ yfor i=1:n_center_vec& B, W6 }( t( S5 P' N% Q
K(i) = numel(find(idx == i));
$ E) x1 t V6 G( r: _8 X4 oend9 Z) F6 b! U. p/ u, S! G! r
0 T# ]* e" U. E5 m& N1 h) @
% Using knnsearch to find K nearest neighbor points for each center vector
8 V& ~ B; w# \9 O/ v @3 x% then calucate sigma8 E# r% \8 q+ V
sigma = zeros(n_center_vec, 1);) P' M: ?- E* X; l* v
for i=1:n_center_vec
2 |3 Z0 s8 M/ I$ N+ C) A/ g [n, d] = knnsearch(data, C(i,:), 'k', K(i));: A7 T# L1 a9 r/ } R0 _
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);, I6 S& s i) @7 z
L2 = sum(L2(:));
5 T4 N2 Z! a8 m- U! `3 M sigma(i) = sqrt(1/K(i)*L2);
& H% u$ h9 z; tend
7 z! ^" O, g2 v3 C* t, i9 N ^, V7 }( w" I$ g+ m1 g
%% Calutate weights
L' m" F7 g8 |. c1 b. @/ F% kernel matrix
+ q# A* s. W/ r$ B6 u) _! |, I% r' [k_mat = zeros(n_data, n_center_vec);/ i! V' O6 F, K8 P( d+ g+ `" M
3 O$ U: }) W! x7 @# k
for i=1:n_center_vec( M4 Q. p* {# t3 P- n# U
r = bsxfun(@minus, data, C(i,:)).^2;1 J& N" n$ j; X
r = sum(r,2);
) u* v" Y3 z# {! ]" _" X k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
' t# E' `! m: W) iend8 ~0 I+ w, O. u: s/ G
& W3 X6 |1 y' H ~
W = pinv(k_mat'*k_mat)*k_mat'*label;
/ Q0 _+ M. A, X( O- F, j5 Y7 w9 S, s. yy = k_mat*W;
/ R& j9 S! o, Q. Q- ~8 W3 V%y(y>=0.5) = 1;* W5 k# R& ~% \" ?8 s$ T
%y(y<0.5) = 0;
6 n& w, y& K: }9 b" B# L; |$ r* ~
%% training function and predict function
1 S5 Y1 N9 e, h& Z[W1, sigma1, C1] = RBF_training(data, label, 10);
$ M6 m# o5 W) n/ X0 I& iy1 = RBF_predict(data, W, sigma, C1);
! w, j. ]$ |, k. F" |- m% W1 m[W2, sigma2, C2] = lazyRBF_training(data, label, 2);4 n# g& a9 z- [6 d4 o4 l: V
y2 = RBF_predict(data, W2, sigma2, C2);3 C. A5 o+ \8 B
$ e* D: G7 f3 s+ @ z" D- k
/ [5 c8 m7 ~: i' j6 `- w$ w上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。( l) g* s2 A6 W
) ~0 j6 Z* r2 V. T# |RBF_training.m 对demo.m中训练的过程进行封装
+ E" b8 { P3 H, n! u* O! |function [ W, sigma, C ] = RBF_training( data, label, n_center_vec ); N+ F$ R/ P) U* l+ A
%RBF_TRAINING Summary of this function goes here
/ m, b" C {) f8 H/ n* `; O( \% Detailed explanation goes here2 K) V9 e+ _' g
; U- C5 e4 u7 a0 d % Using kmeans to find cinter vector
$ W' s2 @' Q# D3 q; j0 k rng(1);
% k1 e! \; W/ @1 P [idx, C] = kmeans(data, n_center_vec);" l4 \! {/ q. G# w) r
+ W, x0 k6 }* G( C, \7 C, J) F % Calulate sigma - B. Q9 b2 z+ P
n_data = size(data,1);1 e% _" W4 U- m0 v0 |" C* u
3 ? j2 |$ Y, o" d
% calculate K( ~3 ?1 u+ j* n; T6 |
K = zeros(n_center_vec, 1);
' y0 X6 a$ c$ m& t# ]* C for i=1:n_center_vec
+ s+ I1 b. ]: j K(i) = numel(find(idx == i));
$ G7 L% W2 B: T6 u end
; x: H/ A9 A9 r/ f
_% R7 j0 s1 j % Using knnsearch to find K nearest neighbor points for each center vector8 v' C* m5 }% o$ C
% then calucate sigma
* \, l; f5 V& L2 p7 o- O" I2 ^ sigma = zeros(n_center_vec, 1);
- t# n( g$ x# d for i=1:n_center_vec
. X( @; `) J q( c1 p; { [n] = knnsearch(data, C(i,:), 'k', K(i));
0 a1 Z5 S* S8 Y( G# c& h5 _# c L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);
. q" K7 R/ x, C5 C6 I( c L2 = sum(L2(:));- V$ C# y# D. q$ {7 U
sigma(i) = sqrt(1/K(i)*L2);* Z0 q- q) h7 ~5 S* |, g
end
, S2 {# s F. w' x % Calutate weights
8 t7 e# O0 p2 J, Q* s % kernel matrix* g1 n) B, P1 G1 y
k_mat = zeros(n_data, n_center_vec);
( ~% D4 c! Q7 X7 p# K! ~! ^% w& n4 t$ J1 b8 z. V
for i=1:n_center_vec( j" c2 B6 `' a: ^9 u
r = bsxfun(@minus, data, C(i,:)).^2;
: |: S: }- o8 | r = sum(r,2);
) g9 i* I" o4 U' l* x i u; ~ k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
7 z- Q' S( `, b9 f' Y end; R# k7 f+ f- ?2 k: k& L
% ]" ^6 r7 d; z. x
W = pinv(k_mat'*k_mat)*k_mat'*label;
/ p# A5 [6 D. R: X' _3 i$ Nend% I, U! ^3 ?$ a* w& @# e* Y$ s
! E4 T1 W+ T/ @8 u E# t X7 L7 ]
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
, D2 l6 D; W' p1 ]' s
m5 J) T1 V; y$ m$ K8 Ufunction [ W, sigma, C ] = lazyRBF_training( data, label, sigma )
/ k5 U" N2 d6 c+ g) W/ e/ \%LAZERBF_TRAINING Summary of this function goes here
' P7 Y& A+ s1 d$ V) i$ _% |. ^% Detailed explanation goes here; ~" [& n, q" V
if nargin < 3
/ Z. K2 a9 A0 M% U sigma = 1; 8 y" v( j3 h+ u/ X$ a2 m: V
end1 s4 M# s: R/ b, @( {8 Z) t
. C7 f6 `* z! G
n_data = size(data,1);5 R4 V6 u1 A: s$ `/ E+ y
C = data;$ j3 D; `. v& a
5 k/ Y$ a" p, k5 R8 P
% make kernel matrix1 h$ c1 b3 A: C, y: {4 V. m
k_mat = zeros(n_data);
x# P( l( J1 z, H1 o; z for i=1:n_data- V+ _( L! E1 P- N3 m& P* {1 ]9 G' v0 r
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
8 N8 L' ]2 f: r) x4 W/ C k_mat(i,:) = exp(L2'/(2*sigma));2 i9 p+ b- F7 K1 ]/ M3 H% M
end
2 V# {% W3 P- H% s1 u8 e. ~& |0 O6 I6 o3 w1 Z
W = k_mat\label; W) \. o I0 P& P7 h* ]# I' g
end# N1 i4 O( ?. ? y; d; [9 p
9 K7 S! w( X" H" q! O6 o
RBF_predict.m 预测5 ~; g* G7 k9 \) f
1 P# p6 @' L, @+ S: Q# gfunction [ y ] = RBF_predict( data, W, sigma, C )
# q1 v% S$ }: n: V$ k%RBF_PREDICT Summary of this function goes here
x3 d9 G) T* e$ G% Detailed explanation goes here: q1 e! p- o1 L& Y4 l& b
n_data = size(data, 1);
. z0 v4 y/ W! I) ^8 R% a) b, D0 W n_center_vec = size(C, 1);/ s/ X: Q" v6 {( c& Y4 J e! Q
if numel(sigma) == 14 f3 R A3 v8 @" c
sigma = repmat(sigma, n_center_vec, 1);
) { y' x. \5 S) M8 x8 T& W end! q# ]% G" {5 R* X1 I" [# {
+ C" c- O: ^6 l5 L* X/ i
% kernel matrix
$ H% E; D5 o4 x k_mat = zeros(n_data, n_center_vec);5 {& V( ]5 m1 ~9 T5 m% a$ M
for i=1:n_center_vec
- C4 O: d z1 Z4 o5 W r = bsxfun(@minus, data, C(i,:)).^2;
' X- x! ]! @& \4 v r = sum(r,2);
- ^$ [( ~& z4 N/ P k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));, C6 U! S# c, B; O6 D D( V$ B: Z6 W1 O
end
2 J2 D" ^. i- ]4 D, [
0 A& a; U. n' U6 D* H, n. W( W y = k_mat*W;
' u2 g) K0 [% ^end' V* l/ \% K, ?, r! h
* \ s' ]6 k0 A H2 F" w+ ]3 y
————————————————. A& ]+ c8 F# O9 G! ]9 g
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# t {( |) D: [" B3 O# b原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496% ~0 p' h( S8 ^3 n6 U1 ]) J' n2 i' t
- A* Z) I. c" z7 T- l" Q) ~' j; L" c4 c; T) j
2 u& U) \3 T$ w
|
zan
|