我正在尝试使用径向基网络来近似各种信号。特别是,我使用了MATLAB的newrb
。
我的问题是,如果我遵循newrb
的描述,这个函数的行为似乎不正确。据我所知,尽管有文档,但转换所有论点是有意义的。
下面的例子有望说明我的问题。
我用100个样本创建了一个正弦波周期。我想通过最大有两个隐藏神经元的径向基网络来近似这个正弦波。我有一个输入矢量(t
)和一个目标矢量(s
)。因此,根据文档,我应该使用两个列向量来调用newrb
。然而,近似值太好了。事实上,均方误差为0,仅使用两个神经元是不可能成立的。此外,如果我使用列向量,那么view(net)
的可视化不仅显示了一个输入,而且显示了100个输入。
在本例中,对应于"正确"(根据文档)函数调用的向量由_doc
表示,对应于_not_doc
的"不正确"调用的向量。
有人能解释这种行为吗?
% one period sine signal with
% carrier frequency = 1, sampling frequency = 100
Ts = 1 / 100;
t = 2 * pi * (0:Ts:1-Ts); % size(t) = 1 100
s = sin(t); % size(s) = 1 100
% design radial basis network
MSE_goal = 0.0; % mean squared error goal, default value
spread = 1.0; % spread of readial basis functions, default value
max_neurons = 2; % maximum number of neurons, custom value
DF = 25; % number of neurons to add between displays, default value
net_not_doc = newrb( t , s , MSE_goal, spread, max_neurons, DF ); % row vectors
net_doc = newrb( t', s', MSE_goal, spread, max_neurons, DF ); % column vectors
% simulate network
approx_not_doc = sim( net_not_doc, t );
approx_doc = sim( net_doc, t' );
% plot
figure;
plot( t, s, 'DisplayName', 'Sine' );
hold on;
plot( t, approx_not_doc, 'r:', 'DisplayName', 'Approximation_{not doc}');
hold on;
plot( t, approx_doc', 'g:', 'DisplayName', 'Approximation_{doc}');
grid on;
legend show;
% view neural networks
view(net_not_doc);
view(net_doc);
因为我自己也有同样的问题,我会尽力为任何偶然发现同一帖子的人提供答案。
正如我所想,问题不在于转置向量。你可以按原样使用你的数据,而不需要转换任何东西。事实上,你用向量t
训练你的RBF网络,然后用你训练网络的同一向量进行模拟,这就是为什么你有如此完美的近似。你用你教给它的相同价值观来测试你的网络。
如果你真的想测试你的网络,你必须选择一个不同的向量进行测试。在你的例子中,我使用了这个:
% simulate network
t_test = 2 * pi * ((1-Ts)/2:Ts:3-Ts);
approx_not_doc = sim( net_not_doc, t_test );
现在,当你绘制结果时,你可以观察到与训练向量中具有相同值的点几乎是完美的。其余的有一个未知的目标,因为神经元数量很少(正如你所期望的)。t_test与approx_not_doc的关系图。
现在,如果你添加更多的神经元(在这个例子中,我使用了100个),你可以看到,现在新的网络可以用相同的测试向量t_test
预测你功能的未知部分。用approx_not_doc绘制100个神经元的t_test。当然,如果你尝试使用不同数量的神经元并进行传播,你的结果会有所不同。
希望这能帮助任何有同样问题的人。