Я беру класс вычислительной нейронауки на Coursera. Пока это здорово! Тем не менее, я немного застрял в одной из проблем викторины.Поиск стабильного состояния линейной рекуррентной сети
Я не принимаю этот класс за сертификат или что-то еще. Только для удовольствия. Я уже принял викторину, и через некоторое время я догадался, что ответ не будет отвечать на викторину.
Вопрос обрамлен как: Предположим, что у нас была линейная рекуррентная сеть из 5 входных узлов и 5 выходных узлов. Будем говорить, что наша сеть по весовая матрица W является: (. По существу, все 0,1, кроме 0,6 по диагоналям)
W = [0.6 0.1 0.1 0.1 0.1]
[0.1 0.6 0.1 0.1 0.1]
[0.1 0.1 0.6 0.1 0.1]
[0.1 0.1 0.1 0.6 0.1]
[0.1 0.1 0.1 0.1 0.6]
Предположим, что мы имеем статический входной вектор и:
u = [0.6]
[0.5]
[0.6]
[0.2]
[0.1]
Наконец, предположим, что мы имеем рекуррентную вес матрицы М:
M = [-0.25, 0, 0.25, 0.25, 0]
[0, -0.25, 0, 0.25, 0.25]
[0.25, 0, -0.25, 0, 0.25]
[0.25, 0.25, 0, -0.25, 0]
[0, 0.25, 0.25, 0, -0.25]
Какое из следующего является выходным сигналом устойчивого состояния v_ss сети? (Подсказка: См лекцию о возвратных сетей, а также рассмотреть написание некоторых октаву или Matlab код для обработки собственных векторов/значений (вы можете использовать функцию «ГЦОС»))
Заметки для класса может быть найдено here. В частности, уравнение для формулы устойчивого состояния можно найти на слайдах 5 и 6.
У меня есть следующий код.
import numpy as np
# Construct W, the network weight matrix
W = np.ones((5,5))
W = W/10.
np.fill_diagonal(W, 0.6)
# Construct u, the static input vector
u = np.zeros(5)
u[0] = 0.6
u[1] = 0.5
u[2] = 0.6
u[3] = 0.2
u[4] = 0.1
# Connstruct M, the recurrent weight matrix
M = np.zeros((5,5))
np.fill_diagonal(M, -0.25)
for i in range(3):
M[2+i][i] = 0.25
M[i][2+i] = 0.25
for i in range(2):
M[3+i][i] = 0.25
M[i][3+i] = 0.25
# We need to matrix multiply W and u together to get h
# NOTE: cannot use W * u, that's going to do a scalar multiply
# it's element wise otherwise
h = W.dot(u)
print 'This is h'
print h
# Ok then the big deal is:
# h dot e_i
# v_ss = sum_(over all eigens) ------------ e_i
# 1 - lambda_i
eigs = np.linalg.eig(M)
eigenvalues = eigs[0]
eigenvectors = eigs[1]
v_ss = np.zeros(5)
for i in range(5):
v_ss += (np.dot(h,eigenvectors[:, i]))/((1.0-eigenvalues[i])) * eigenvectors[:,i]
print 'This is our steady state v_ss'
print v_ss
Правильный ответ:
[0.616, 0.540, 0.609, 0.471, 0.430]
Это то, что я получаю:
This is our steady state v_ss
[ 0.64362264 0.5606784 0.56007018 0.50057043 0.40172501]
Может кто-нибудь запятнать мою ошибку? Спасибо огромное! Я очень ценю это и извиняюсь за длинный пост в блоге. По существу, все, что вам нужно посмотреть, это слайд 5 и 6 по этой верхней ссылке.
Я не знал, с кем связаться. Вы уверены в моей программе, чтобы ответить на это правильно? Я сомневаюсь, что Курсера поставит неправильное решение для группы людей. Я чувствую, что мой код должен иметь ошибку, или я должен иметь недостаток в логике. – jlarks32