python - 寻找线性循环网络的稳态输出

标签 python linear-algebra algebra neuroscience

我正在 Coursera 上学习计算神经科学类(class)。到目前为止一切进展顺利!然而,我在其中一个测验问题上有点卡住了。

我参加这门类(class)并不是为了获得证书或其他任何东西。纯粹是为了好玩。我已经参加了测验,过了一会儿,我猜到了答案,所以这甚至不会回答测验。

问题的框架如下: 假设我们有一个包含 5 个输入节点和 5 个输出节点的线性循环网络。假设我们网络的权重矩阵 W 是:

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]

(基本上都是 0.1,除了对角线上的 0.6。)

假设我们有一个静态输入向量 u:

u = [0.6]
    [0.5]
    [0.6]
    [0.2]
    [0.1]

最后,假设我们有一个循环权重矩阵 M:

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? (提示:请参阅有关循环网络的讲座,并考虑编写一些 Octave 或 Matlab 代码来处理特征向量/值(您可以使用“eig”函数))'

类(class)笔记可以在 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。

最佳答案

我用我的矩阵尝试了你的解决方案:

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 上的测试上。您是否尝试过在论坛上联系他们?

关于python - 寻找线性循环网络的稳态输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492020/

相关文章:

python - PyQt5 QListWidget 带有复选框和拖放

computer-science - 抽象代数与程序设计

python - 在 DataFrame 中获取连续几周的第一周

java - 应该将矩阵数据和数学分开吗?

python - Python中的快速整数矩阵零空间?

math - 在 MATLAB 中求解矩阵?

algorithm - 如何将一条线反射到另一条线上

haskell - Haskell 的有限域线性代数库

python - n = 1如何成为函数的参数

python - 将结构指针传递给 ctypes 中的函数