2017-01-05 3 views
1

Я беру класс вычислительной нейронауки на 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 по этой верхней ссылке.

ответ

1

Я tryied решения со своими матрицами:

W = np.array([[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 = np.array([.6, .5, .6, .2, .1]) 

M = np.array([[-0.75 , 0 , 0.75 , 0.75 , 0], 
       [0 , -0.75 , 0 , 0.75 , 0.75], 
       [0.75 , 0 , -0.75 , 0 , 0.75], 
       [0.75 , 0.75 , 0.0 , -0.75 , 0], 
       [0 , 0.75 , 0.75 , 0 , -0.75]]) 

и ваш код, генерируемый правильное решение:

This is h 
[ 0.5 0.45 0.5 0.3 0.25] 
This is our steady state v_ss 
[ 1.663354 1.5762684 1.66344153 1.56488258 1.53205348] 

Может быть, проблема с Тестом на Coursera. Вы пытались связаться с ними на форуме?

+0

Я не знал, с кем связаться. Вы уверены в моей программе, чтобы ответить на это правильно? Я сомневаюсь, что Курсера поставит неправильное решение для группы людей. Я чувствую, что мой код должен иметь ошибку, или я должен иметь недостаток в логике. – jlarks32

Смежные вопросы