performance - 如何提高 Julia the Storkey 的学习表现?
问题描述
嗨社区我是新来的,在 Julia 1.0.3 中也是新来的。现在我正在研究不同数字系统中的 Storkey 学习规则。在我第一次尝试编码这个想法时,我尝试了这个幼稚的代码:
function storkey_learning_first(U)
# The memories are given by the columns
row,col = size(U)
# First W matrix
W_new = zeros(row,row)
for mu=1:col
W_old = copy(W_new)
for i=1:row
for j=i:row
s = 0.0
# Putting this value in the new matrix
s += U[i,mu]*U[j,mu]
s -= local_field_opt(W_old,U[:,mu],i,j,row)*U[j,mu]
s -= local_field_opt(W_old,U[:,mu],j,i,row)*U[i,mu]
s *= 1/row
W_new[i,j] += s
W_new[j,i] = W_new[i,j]
end
end
end
return W_new
end
这是主要功能和由
function local_field_opt(W_old,U,i,j,row)
hij = 0.0
for k=1:row
if k != i && k != j
hij += W_old[i,k]*U[k]
end
end
return hij
end
然后给定一个 n 维实值向量,两个代码都会创建一个维数 (nxn) 的矩阵。对于低维向量是有效的。但是对于高维数组来说真的很慢。事实上,我想存储维度 n = 8192 的向量。此外,我想使用低维复值向量或四元数,但在实际情况下我不能做得更好。在第二次尝试中,我将完整的结构分为两个函数,特别是,我将两个内部循环分开,以避免重复调用相同的元素:
function_inner(U,W_old,W_mu,mu,row)
# Calling one time the column
U_mu = U[:,mu]
for j=1:row
U_j_mu = U[j,mu]
for i=j:row
U_i_mu = U[i,mu]
s = 0.0
s += U_i_mu *U_j_mu
s -= U_i_mu *local_field_opt(W_old,U_mu,j,i,row)
s -= local_field_opt(W_old,U_mu,i,j,row)*U_j_mu
s *= 1/row
W_mu[i,j] += s
W_mu[j,i] = W_mu[i,j]
end
end
return W_mu
end
有了这个,我获得了几秒钟。在这种特殊情况下如何改进我的语法?以及使用复数或四元数:这应该是一个相当大的额外负担吗?最后,到目前为止,我正在为维度 n=1352 的向量获得这个时间标记:
@time W = RealStorkey.storkey_learning(U,RealStorkey.first)
349.680284 seconds (268 allocations: 1.376 GiB, 0.09% gc time)
解决方案
推荐阅读
- mysql - 获取时间戳之间的行数作为列表
- python - 警告:不要在生产环境中使用开发服务器,并且在服务器上找不到请求的 URL
- amazon-web-services - 如何从 Lambda 函数与私有 EC2 实例通信
- android - 图像不断旋转android studio
- sql - 从我的 SQL 查询结果中删除重复项
- python - 班级没有看到另一个班级,我该如何解决这个问题?
- java - vaadin 工具提示未显示在对话框中
- java - Apache poi excel writer 在 ide 中工作,但不在 fat jar 中?java.io.IOException:您的 InputStream 既不是 OLE2 流,也不是 OOXML str
- regex - 替换无效的文件名字符
- swift - 在 SwiftUI 中将数据从一个 ViewModel 传递到另一个 ViewModel?