- 在线时间
- 661 小时
- 最后登录
- 2023-8-1
- 注册时间
- 2017-5-2
- 听众数
- 32
- 收听数
- 1
- 能力
- 10 分
- 体力
- 55578 点
- 威望
- 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的直观介绍
9 ?! j4 g2 e. W1 ORBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识* u) h* R9 B+ g+ }
# o! I( a' i* q! Y1 RBF是一种两层的网络
0 q- ^6 f: ~& z5 t& t是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:
& V4 Z2 l$ b j' Lyj= i=1∑nwijϕ(∥x− ui∥2),(j= 1,…,p)
$ g# {) ?; ~% D2 J$ {![]()
: K& R/ I1 c9 t3 E9 P ; V* Y# z: Q! k3 o
2 RBF的隐层是一种非线性的映射
: |, v* g) s- S: r& M, J |RBF隐层常用激活函数是高斯函数:- g8 B" `: Z' j( {, n5 t' l
2 D0 r4 Y' O1 X4 x1 b
ϕ(∥x−u∥)=e−σ2∥x−u∥2# j9 F3 E$ B0 b7 L6 @" s) A# s
W! N: Q; W% }8 h! { J
/ q2 w: e$ u m% P, H
, N+ p8 ?# V/ I/ X3 RBF输出层是线性的
' }* f Q# E5 J- V+ ]4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
0 C1 {% ~' C2 @4 KRBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:
% X4 B* [, p% i& G0 V: Y& B![]()
8 ~' @3 B* r6 ~6 ^" ^1 Y- }/ B! W. X# a- E, V
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。5 H/ F) j) | S6 v
0 M+ }! [7 J- S6 i# ^0 ~
RBF学习算法1 u: \3 y+ q3 w+ O' W, p5 G
( k3 A" z( F& _- z% [
G# k% [! F! j2 S9 o
6 C3 v+ U6 e8 G* A对于上图的RBF网络,其未知量有:中心向量ui ,高斯函数中常数σ,输出层权值W。4 A8 I8 ]$ F" g
学习算法的整个流程大致如下图:
/ U/ I. @8 E n* b<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
0 \+ a9 y$ Z! r' ~9 i$ y& P![]()
) s. l0 L" d& ~" R8 ~5 H) C3 `6 v& a3 m
具体可以描述为:
7 d. g7 i5 x( K1 J3 w; M2 d: I' m2 ?; }( U# R" _" o
1.利用kmeans算法寻找中心向量[color=rgba(0, 0, 0, 0.749019607843137)] ui
" u* Q# i/ p0 q* k9 Z. e6 c" X, V. K( K
2.利用kNN(K nearest neighbor)rule 计算 σ[color=rgba(0, 0, 0, 0.75)]
: @. g7 N5 d, \ σ0 m+ k% T% J' u0 d/ g, H
i=K1k=1∑K∥uk−ui∥2% W! J; J2 Y: f
. O% X( h7 B7 I3 A9 h5 _0 [3 F8 R% l9 E+ z6 p; _5 I2 \
# b' C; R* N' f3 t
3. [color=rgba(0, 0, 0, 0.75)]W [color=rgba(0, 0, 0, 0.75)]可以利用最小二乘法求得2 O+ [% g2 C: T1 |. Y( R/ f
" v2 h x8 d- k8 V& m
Lazy RBF3 K4 Y2 |( w, p* g
) \. e. i7 P) e8 A
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。
' L9 k% j: Q$ K % i @2 Z0 ^. ?& x) _) z4 C2 X
MATLAB实现RBF神经网络下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是WWW变成了多个,这里就不实现了。- D8 [, o4 h' k( W" ]/ k
D& F3 F" @/ h" k. L& n/ Y3 hdemo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
: l3 j O1 ]; n' z0 B
5 s8 A/ H3 I, w" fclc;
+ g3 C8 K% V/ o! Z! Gclear all;
" ~$ w" @. ?7 m9 H. T M3 K0 i% wclose all;
; z2 ^: t0 {9 E9 ?+ ~ h$ Z* R$ ^" V. ]3 e7 \- n
%% ---- Build a training set of a similar version of XOR
" s$ f6 z: V" Cc_1 = [0 0];
3 @; @, \; v& {' kc_2 = [1 1];7 O( {- e0 B6 \
c_3 = [0 1];! G' h8 B% A' q& R* r
c_4 = [1 0];9 Y/ J5 Z7 z. K% s
7 a. ^# r) k, r3 m! y3 tn_L1 = 20; % number of label 1
W! n2 D$ Q% J, R$ n( pn_L2 = 20; % number of label 23 u6 B9 Z, s3 Z& X
2 Z! t" U- M; W! z% V- j* E' a* A J
1 w+ B8 M* l4 ~' Z8 GA = zeros(n_L1*2, 3);0 e# ]# S3 q9 C6 V8 o" v# w
A(:,3) = 1;
& c; H" ^7 \1 d% ~- `. N" D7 UB = zeros(n_L2*2, 3);
2 J0 Q; e3 {/ g& B6 B: P; UB(:,3) = 0;
" i- o4 @* W# Y9 `1 r5 v6 K* z5 v d3 W8 L' g- o
% create random points
9 A, o1 E. W; ~for i=1:n_L1
3 Y5 G# E2 k$ k7 \9 q2 l A(i, 1:2) = c_1 + rand(1,2)/2;
, [4 m0 A6 f8 F A(i+n_L1, 1:2) = c_2 + rand(1,2)/2;
* b7 ~; m% E3 Lend
1 {* ^. t) i5 xfor i=1:n_L2
- H. E I+ R5 i- B: g, } B(i, 1:2) = c_3 + rand(1,2)/2;2 O; Y3 l3 M$ A' E7 Y
B(i+n_L2, 1:2) = c_4 + rand(1,2)/2;
- b0 D# s9 _# i" n9 {; [ \+ oend% d/ ]: b* z) ]# {6 t" c, [; v b
{2 L' Y: k0 v8 p8 I! F8 R. j
% show points: @( U" R5 f/ h5 O7 ]- R0 Z4 K1 Z# X
scatter(A(:,1), A(:,2),[],'r');/ p4 a6 z9 x: f" S' B
hold on
9 z" _7 G" o1 tscatter(B(:,1), B(:,2),[],'g');! O$ H2 ?( l7 h
X = [A;B];
, s3 j7 T( A, `/ w: ]! Odata = X(:,1:2);' ^" g* H9 [% D6 r% v$ W, {( e
label = X(:,3);
7 s( P2 o) \6 S% w3 d$ Z$ Y1 m, K# X/ X2 \9 ]1 Z$ Z
%% Using kmeans to find cinter vector( g: I! V1 B7 b% f5 T7 X
n_center_vec = 10;
6 F" p6 O+ B5 o/ ?* ]6 m0 w0 W! brng(1);: k8 ]3 b+ H/ n8 t( q4 \7 n
[idx, C] = kmeans(data, n_center_vec);
4 A" a6 J$ W$ vhold on
% p( J0 V5 I% }scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2);
' [- O" k. f: _8 R' F7 z- o- I& L5 y5 i! r
%% Calulate sigma
# e, o3 ^5 ~$ N9 nn_data = size(X,1);
& z9 C0 w1 i! ]& j/ U3 h- n: ?# l! @- l4 {' {- J0 P
% calculate K! ~. ] V' ]2 [
K = zeros(n_center_vec, 1);: ]5 p# y0 [2 L' I( T
for i=1:n_center_vec
4 R9 e5 l) G# r( G; _ K(i) = numel(find(idx == i)); 2 K1 |# V/ U& W4 L
end
( F7 T! @2 q J/ D
1 O0 u! l o( c8 r% Using knnsearch to find K nearest neighbor points for each center vector5 Y; l& J6 b; N# x! q; `% c/ Y
% then calucate sigma
5 u- x( O7 @, asigma = zeros(n_center_vec, 1);, Q \) }8 t. r7 [, } k3 T r, q
for i=1:n_center_vec
2 u' {: a& l, Q, ^" p! k) w# w2 i [n, d] = knnsearch(data, C(i,:), 'k', K(i));
, L! [1 X: g9 j- w L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);6 W# v+ y2 c- I( @7 h& ~, `+ x
L2 = sum(L2(:));
8 L% N- `9 i/ J, { x4 P# E5 O sigma(i) = sqrt(1/K(i)*L2);
8 v4 h% H3 n" x- R$ w6 ]end% g2 R. i9 _) ?! l8 M( F
' V/ |; W( i: c6 A' a; ^
%% Calutate weights
; L# A+ I. a4 y [1 c$ j( C% kernel matrix
% u& C0 ~; u! i! xk_mat = zeros(n_data, n_center_vec);, {& s7 j% s& ~3 f/ e/ F# Q! `
! {7 k/ ^0 q) y5 e1 ifor i=1:n_center_vec
# m$ b$ V0 o9 I) Z9 { r = bsxfun(@minus, data, C(i,:)).^2;! v$ E8 j5 h# W7 ?4 d, P7 T+ t
r = sum(r,2);
9 D0 d3 p$ p; L& j% W k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));" A6 _, N0 `. i& {& |6 P* V) J M
end+ m) a" F6 q/ n& I$ s
5 o. [+ Q5 Q' _7 d8 I9 w0 P/ b9 oW = pinv(k_mat'*k_mat)*k_mat'*label;
* V r5 R8 P$ f8 P+ ]7 F$ @4 U" d6 ~y = k_mat*W;( z) O9 T# Z) _7 {
%y(y>=0.5) = 1;
6 p* |$ A# |! @2 `4 I%y(y<0.5) = 0;
. O5 a4 m9 }4 [( _. \6 J
9 J3 R/ A5 }1 z/ }%% training function and predict function
9 @/ F9 W# ]+ t8 l. F0 k$ A+ G5 l[W1, sigma1, C1] = RBF_training(data, label, 10);) H+ C5 ?) _9 j: q1 {7 H; ~
y1 = RBF_predict(data, W, sigma, C1);' g5 p' x1 t, K$ A( q% M
[W2, sigma2, C2] = lazyRBF_training(data, label, 2);
' ?6 V8 l9 a! @" g4 J9 q6 l6 oy2 = RBF_predict(data, W2, sigma2, C2);5 U: T+ u- I- R1 A; c/ H5 W
0 t2 J1 {6 S; D. m5 p w. V
; E" u$ q8 I( T! Z1 `' o% b上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果yyy来看,其实对于XOR问题来说,4个就可以了。
- ?7 u; R& r+ {9 q2 v4 b
" t% M6 v' q7 Q4 \ F4 VRBF_training.m 对demo.m中训练的过程进行封装; v- Y! R& _) i2 B$ L$ K" W
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec )3 X- ]( Y) a0 x* s1 _' q+ ]. P; Y
%RBF_TRAINING Summary of this function goes here$ }% H( y* t+ |. i1 ]$ y5 |
% Detailed explanation goes here
( b3 W7 n" A; m" P7 b$ S3 W
& u. t% l' V, D# i4 c- d % Using kmeans to find cinter vector! r4 l/ S4 g% t, I% Z% e
rng(1);
$ U" l. p$ o3 g2 J: R/ z, @ [idx, C] = kmeans(data, n_center_vec);6 ^1 p& [! L* i. I
+ k ? C( q. P& |' T
% Calulate sigma
5 S5 \1 F2 J" [; S6 N n_data = size(data,1);
( {$ T; J3 m! Q& U; C/ m4 b5 }" u3 ~ x5 X4 F7 q) G
% calculate K
3 H( h4 N6 A4 m% E2 ~" S/ Q K = zeros(n_center_vec, 1);+ @, @& h9 b) O/ X6 M
for i=1:n_center_vec
" ^5 i2 D4 }4 _3 {* m& W K(i) = numel(find(idx == i));3 G( O) `: H9 k4 W! Z" I
end1 D9 c/ y6 `$ {/ _2 X& o
' J( _4 I9 c7 F& o$ b3 B9 c % Using knnsearch to find K nearest neighbor points for each center vector& U. K: j6 ~2 H1 @
% then calucate sigma% N; y; K: Y/ b4 B; d3 f, f
sigma = zeros(n_center_vec, 1);: V: i4 R5 T% S: p( S
for i=1:n_center_vec
X% ~7 k6 N, o! Q' q, s4 @4 ` [n] = knnsearch(data, C(i,:), 'k', K(i));' {6 B( @1 M/ l: x+ B! d
L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2);5 l( B- O) u y, H y! R
L2 = sum(L2(:));- |1 S" S/ u7 T5 k, v Y( z/ L
sigma(i) = sqrt(1/K(i)*L2);
' P+ j3 T) r% r2 O1 v7 ^- S end% I5 K8 z7 M& n0 |" u: F2 x" [
% Calutate weights
, i6 p! z* ~8 s' W3 F % kernel matrix
6 b6 N. ^( C$ U1 w k_mat = zeros(n_data, n_center_vec);
6 f! g- D. U5 g* H- @; ?' u( c0 Z! ~+ @+ ~
for i=1:n_center_vec
, U I% j+ w1 P9 y! q3 O r = bsxfun(@minus, data, C(i,:)).^2;6 a5 w0 P7 u; l3 c+ v
r = sum(r,2);
1 w7 ~. l( c$ ?( i) T* |9 B k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
2 }) e) i) e" j, e3 D4 h. F/ Z end6 E. M! h6 F; ^! ] g
2 u" h2 m$ Z3 f4 A
W = pinv(k_mat'*k_mat)*k_mat'*label;6 y) t5 j. f& \' `
end
* \- A' |$ K2 W _/ Y8 h" f' r& U, M9 L5 l
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的'/'方法
. `+ h0 P' F9 l) I6 u f. q( _% `% z! Y+ n& r1 {5 ?1 L5 |/ O
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma )' ]! b. w1 }- [! D8 x
%LAZERBF_TRAINING Summary of this function goes here7 c% }) V" |% w
% Detailed explanation goes here
2 s `% R# E) e- \+ H if nargin < 3# c1 W0 H% @/ x0 o b2 R
sigma = 1; & m7 ~+ l9 n: j7 K. ]
end) [6 p$ s# ]8 m9 w& ?
, d* G1 @# G; t8 y/ i. b- @* C5 E$ f n_data = size(data,1);7 b* b K$ `7 A( I$ c8 c
C = data;
+ H( l: ` l( B+ T( W
k7 q, [) w+ B* T$ l; T p5 u % make kernel matrix* J' Y* W# L1 [) R7 F, R
k_mat = zeros(n_data);! i; o7 G% C* t% H' y' D; J
for i=1:n_data* F0 ?2 D5 L9 Y
L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2);
; @) [ E7 L1 R W% @0 ` k_mat(i,:) = exp(L2'/(2*sigma));
& d& `( i$ Y& b end+ h# t) _6 t: N) j5 A7 k
* [4 ~# S8 S3 ~. G5 r* Y
W = k_mat\label;2 |+ T+ Y7 v1 [" x W7 ]( E2 H( C
end
* j0 z- ?& A$ H' g a+ F( U/ v0 q" k+ U
RBF_predict.m 预测
: P" X* H& g0 s3 k5 }. Z& M; k
% o, A% H+ f6 l: o4 l. r; @) ~: m. |- R4 qfunction [ y ] = RBF_predict( data, W, sigma, C )8 _ ]) J. A d) }& j" C: J
%RBF_PREDICT Summary of this function goes here2 X% O9 g# I; Z, x) h+ K
% Detailed explanation goes here: g: C1 M$ Q# i( m9 N: `
n_data = size(data, 1);$ }& p2 B E% d1 c; n
n_center_vec = size(C, 1);, Q4 Z* i$ y' T
if numel(sigma) == 18 b9 H1 I/ U$ }7 F
sigma = repmat(sigma, n_center_vec, 1);
. a2 ^# V1 x# ^4 H1 S: W2 K. W( v end0 [# N6 y9 j8 i1 z4 G! _3 |
8 v% G# z) c, s$ I% p" t* ~ % kernel matrix
* z0 \ U8 A1 _& U% _- i( c8 G k_mat = zeros(n_data, n_center_vec);
& G/ L$ p. \% Y' P for i=1:n_center_vec
9 r- ~# _ ^" @4 D2 u% S) p7 p r = bsxfun(@minus, data, C(i,:)).^2;& \7 g. { ?9 p
r = sum(r,2);
/ r; B- f- O; F( ` k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2));
" ?/ W# c# a" R4 R& `/ R end5 u% b: D% _$ ]% {, t7 D
4 \7 r+ E( e2 s: J* v y = k_mat*W;
1 J. G6 m# N* v( x4 Tend8 H, ~! d+ Q! O& k
( O$ h# P3 `/ m* }- j* b/ c
————————————————9 ^" |5 i% Z5 @- P1 F. ~9 Q
版权声明:本文为CSDN博主「芥末的无奈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" ?9 ~8 U! L- j6 P- s( X原文链接:https://blog.csdn.net/weiwei9363/article/details/72808496
/ R- F' y# [0 m6 s+ i1 b- z
! p( L0 }7 c- I2 _% D
, s* g+ p/ z- T- ]9 x, W" ]9 B$ U( ], p8 r5 J, F* C
|
zan
|