classdef SCN
properties
Name = 'Stochastic Configuration Networks';
version = '1.0';
% 基本参数(网络结构)
L % 隐藏节点数目,从1开始
W % 输入权重矩阵
b % 隐藏层偏置向量
Beta % 输出权重向量
% 配置参数
r % 正则化参数
tol % 容忍度,目标误差
Lambdas % 随机权重范围,线性网格搜索
L_max % 最大隐藏层神经元数
T_max % 随机配置的最大次数
% 其他参数
nB = 1 % 一个循环需要在网络中添加多少个节点
verbose = 50 % 命令行显示频率
COST = 0 % 最终误差
end
%% 方法
methods
%% 模型初始化
function obj = SCN(L_max, T_max, tol, Lambdas, r , nB)
% 设置初始损失
% format long;
obj.L = 1;
% 初始化最大隐藏层神经元个数
if ~exist('L_max', 'var') || isempty(L_max)
obj.L_max = 100;
else
obj.L_max = L_max;
% 如果最大隐藏层神经元个数超过5000,调整显示频率
if L_max > 5000
obj.verbose = 500;
end
end
% 初始化随机配置的最大次数
if ~exist('T_max', 'var') || isempty(T_max)
obj.T_max= 100;
else
obj.T_max = T_max;
end
% 初始化训练目标,容忍度
if ~exist('tol', 'var') || isempty(tol)
obj.tol= 1e-4;
else
obj.tol = tol;
end
% 初始化随机权重范围,线性网格搜索
if ~exist('Lambdas', 'var') || isempty(Lambdas)
obj.Lambdas= [0.5, 1, 3, 5, 7, 9, 15, 25, 50, 100, 150, 200];
else
obj.Lambdas = Lambdas;
end
% 初始化正则化参数
if ~exist('r', 'var') || isempty(r)
obj.r = [0.9, 0.99, 0.999, 0.9999, 0.99999, 0.99999];
else
obj.r = r;
end
% 初始化每个循环节点添加个数
if ~exist('nB', 'var') || isempty(nB)
obj.nB = 1;
else
obj.nB = nB;
end
end
%% 不等式返回 ksi
function [obj, ksi] = InequalityEq(obj, eq, gk, r_L)
ksi = ((eq' * gk)^2) / (gk' * gk) - (1 - r_L) * (eq'*eq);
end
%% 搜索 nB 个节点的网络权重和偏置
function [WB, bB, Flag] = SC_Search(obj, X, E0)
% 停止标志
Flag = 0; % 0:继续; 1:停止; 返回一个好的节点/或通过 set Flag = 1 停止训练
% 存储网络权重和偏置
WB = [];
bB = [];
% 获取样本和特征数目
[~, d] = size(X);
[~, m] = size(E0);
% container of kesi
C = [];
% 线性搜索最佳节点
for i_Lambdas = 1: length(obj.Lambdas)
% 获取随机权重和偏差范围
Lambda = obj.Lambdas(i_Lambdas);
% 生成 W 和 B 的候选 T_max 向量以供选择
WT = Lambda * (2 * rand(d, [obj.T_max]) - 1); % 权重矩阵大小: d-by-T_max
bT = Lambda * (2 * rand(1, [obj.T_max]) - 1); % 偏置矩阵大小: 1-by-T_max
% 激活函数
HT = logsig(bsxfun(@plus, X * WT, bT));
for i_r = 1: length(obj.r)
% 获取正则化值
r_L = obj.r(i_r);
% 计算Ksi值
for t = 1: obj.T_max
% 计算 H_t
H_t = HT(:, t);
% 计算 kesi_1 到 kesi_m
ksi_m = zeros(1, m);
for i_m = 1: m
eq = E0(:, i_m);
gk = H_t;
[obj, ksi_m(i_m)] = obj.InequalityEq(eq, gk, r_L);
end
Ksi_t = sum(ksi_m);
if min(ksi_m) > 0
C = cat(2, C, Ksi_t);
WB = cat(2, WB, WT(:, t));
bB = cat(2, bB, bT(:, t));
end
end
% 判断是否结束正则化循环
nC = length(C);
if nC >= obj.nB
break;
else
continue;
end
end
% 判断是否结束lambda循环
if nC >= obj.nB
break;
else
continue;
end
end
% 返回好的节点或停止训练。获取网络权重
if nC >= obj.nB
[~, I] = sort(C, 'descend');
I_nb = I(1: obj.nB);
WB = WB(:, I_nb);
bB = bB(:, I_nb);
end
% 循环结束,丢弃 w b
if nC == 0 || nC<obj.nB
disp('End Searching ...');
Flag = 1;
end
end
%% 向模型添加节点
function obj = AddNodes(obj, w_L, b_L)
obj.W = cat(2, obj.W, w_L);
obj.b = cat(2, obj.b, b_L);
obj.L = length(obj.b);
end
%% 计算 Beta、输出、ErrorVector 和 Cost
function [obj, O, E, Error] = UpgradeSCN(obj, X, T)
% 获取隐藏层输出
H = obj.GetH(X);
% 计算网络输出权重
obj = obj.ComputeBeta(H, T);
% 获取网络输出
O = H * obj.Beta;
% 计算网络均方根误差
E = T - O;
Error = Tools.RMSE(E);
obj.COST = Error;
end
%% 计算网络输出权重
function [obj, Beta] = ComputeBeta(obj, H, T)
Beta = pinv(H) * T;
obj.Beta = Beta;
end
%% 回归
function [obj, per] = Regression(obj, X, T)
% 累计误差损失
per.Error = [];
% 均方根误差
E = T;
Error = Tools.RMSE(E);
% 输出模型名字
disp(obj.Name);
% 判断是否满足停止条件
while (obj.L < obj.L_max) && (Error > obj.tol)
% 显示训练过程
if mod(obj.L, obj.verbose) == 0
fprintf('L:%d\t\tRMSE:%.6f \r', obj.L, Error );
end
% 搜索候选节点数目和网络权重和偏置
[w_L, b_L, Flag] = SC_Search(obj, X, E);
% 找不到足够的节点
if Flag == 1
break;
end
% 添加节点数目
obj = AddNodes(obj, w_L, b_L);
% 更新网络输出权重
[obj, ~ , E, Error ] = obj.UpgradeSCN(X, T);
% 记录均方根误差变化
per.Error = cat(2, per.Error, repmat(Error, 1, obj.nB));
end
% 显示最后的均方根误差和节点数目和均方根误差
fprintf('
SCN基于随机配置网络的数据回归预测(Matlab完整源码和数据)
版权申诉
51 浏览量
2023-11-23
12:52:55
上传
评论
收藏 19KB ZIP 举报
前程算法屋
- 粉丝: 4182
- 资源: 712
最新资源
- 基于Python的大数据分析项目.zip
- 卷积神经网络CNN 代码解析.docx
- androidx.media3.exoplayer,libffmpeg库
- androidx.media3.exoplayer,libgav1库
- androidx.media3.exoplayer,libopus库
- androidx.media3.exoplayer,libvp9(libvpx)库
- 机械设计双边工作自动裁断机非常好的设计图纸100%好用.zip
- 2023-04-06-项目笔记 - 第一百二十三阶段 - 4.4.2.121全局变量的作用域-121 -2024.05.04
- vmware官方下载地址
- CNN网络中关于数据预处理的三种方法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈