Реализация обучения Hebbian в Matlab - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь выполнить задачу, в которой меня просят реализовать базовое 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)
...