2015-11-12 7 views
2

Я пытаюсь аппроксимировать различные сигналы с использованием радиальных баз данных. В частности, я использую MATLAB's newrb.Новинка MATLAB для проектирования радиальных баз данных не ведет себя в соответствии с документацией. Зачем?

Моя проблема в том, что эта функция ведет себя некорректно, если я следую за descriptionnewrb. Насколько я понимаю, имеет смысл переносить все аргументы, несмотря на документацию.

Следующий пример, надеюсь, иллюстрирует мою проблему.

Я создаю один период синусоидальной волны с 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); 

ответ

0

Поскольку у меня была такая же проблема, я постараюсь дать ответ всем, кто наткнется на тот же пост.

Как я понял, проблема не в транспонировании векторов. Вы можете использовать свои данные так, как есть, без переноса чего-либо. Тот факт, что вы тренируете свою сеть RBF с помощью вектора t, а затем имитируете с тем же вектором, который вы обучили вашей сети, является причиной того, что у вас есть такая идеальная аппроксимация. Вы тестируете свою сеть с теми же значениями, которые вы ее преподавали.

Если вы действительно хотите протестировать свою сеть, вы должны выбрать другой вектор для тестирования. В вашем примере я использовал:

% simulate network 
    t_test = 2 * pi * ((1-Ts)/2:Ts:3-Ts); 
    approx_not_doc = sim(net_not_doc, t_test); 

И теперь, когда вы построить свои результаты, вы можете заметить, что точки, которые имеют такое же значение, как и в вашем векторе поезда почти безупречны. Остальные имеют неизвестную цель из-за небольшого числа нейронов (как вы ожидали). Plot of t_test with approx_not_doc.

Теперь Если добавить больше нейронов (в этом примере я использовал 100), вы можете увидеть, что теперь новая сеть может предсказать, с таким же тестом вектором t_test, неизвестной частью вашей функции. Plot t_test with approx_not_doc for 100 neurons. Конечно, если вы попробуете с различным количеством нейронов и распространите ваши результаты, это будет меняться.

Надеюсь, это поможет любому, у кого есть такая же проблема.