Я пытаюсь выполнить задачу, в которой меня просят реализовать базовое c обучение Hebbian для одного нейрона (линейная модель скорости возбуждения) с двумя входами; Мне дали обучающий набор, шаблон ввода 2x100, который перетасовывается в каждую эпоху. Основной запрос состоит в том, чтобы построить график окончательного вектора весов относительно основного собственного вектора Q, входной корреляционной матрицы. И здесь возникает моя проблема: Q определяется как
Q = <uu>
, где обозначение угла означает среднее значение по входным шаблонам. Я застрял в правильном вычислении этой матрицы, потому что не могу правильно понять, как создается это «среднее значение по входным шаблонам» ...
Я разделил код следующим образом: функция, которая фактически выполняет обучение
function [w_out,w_t,w_norm] = hebbian(xtrain,eta)
train_size = size(xtrain,2); % Checking training set dimension
w = -1 + 2.*rand(2,1); % Weights random initialization
epochs = 1000;
w_t = zeros(2,epochs);
w_norm = zeros(1,epochs);
for i = 1:epochs
w_old = w;
randp = randperm(train_size); % Generating random index
for k=1:train_size
xtrain_k = xtrain(:,randp(k));% Shuffling training set
% Computing output via linear firing rate model
v = w'*xtrain_k;
w = w_old + eta*v*xtrain_k; % Updating weights
end
w_norm(i) = norm(w);
w_out = w/norm(w);
w_t(:,i) = w_out;
end
end
Хотя это основной файл .m: я думаю, что алгоритм обучения действительно работает, но я не могу сказать, что сравниваю правильные объекты.
T = readtable('lab2_1_data.csv'); % Importing data as table
u = table2array(T);% Converting table into input array
eta = 10e-3; % Learning rate
[w, w_t, w_norm] = hebbian(u,eta);
Q = u*u'; % Input correlation matrix
[vec, D] = eig(Q); % Computing eigenvalues and eigenvectors of Q
% Plotting data points and comparison between final weight vector and main
% eigenvector of Q
figure('Name','P1): Dataset, final weight vector and main eigenvector of Q','NumberTitle','off')
scatter(u(1,:),u(2,:))
hold on
plotv(vec(:,end));
set(findall(gca,'Type', 'Line'),'LineWidth',1.75);
plotv(w)
hold off
legend('Dataset','Dominant eigenvector of Q','Final weight vector','Location','best')
% Weight evolution, first component
figure('Name','P2.1): Weight vector time evolution (1st component)','NumberTitle','off')
plot(w_t(1,:))
% Weight evolution, second component
figure('Name','P2.2): Weight vector time evolution (2nd component)','NumberTitle','off')
plot(w_t(2,:))
% Weight norm evolution
figure('Name','P2.3): Weight vector norm time evolution','NumberTitle','off')
plot(w_norm)