0

我有一个简单但很大的数据文件。它是神经网络模拟的输出。第一列是时间步长,1..200。第二个是目标词(对于当前的模拟,1..212)。然后有 212 列,每个单词一个。也就是说,在给定特定目标(输入)词的情况下,每一行都有每个词节点在特定时间步的激活值。

我需要做一些简单的操作,例如将每个激活转换为响应强度(exp(constant x activation)),然后将每个响应强度除以响应强度的行总和。在 R 中执行此操作非常慢(20 分钟),而在 perl 中使用传统循环执行此操作更快但仍然很慢(7 分钟),因为稍后的模拟将涉及数千个单词。

看起来 PDL 应该能够更快地做到这一点。我一直在阅读 PDL 文档,但我真的不知道如何进行第二步。第一个似乎就像只选择激活列并将它们放入 $act 一样简单,然后:

$rp = exp($act * $k);

但我不知道如何将每个值除以其行总和。任何意见,将不胜感激。

谢谢!

4

1 回答 1

1

看起来您需要制作矩阵的副本,然后使用第一个读取,第二个也写入。注意使用 $c++ 而不是 for $loop() { 可能更有效!}

$x = sequence(3,3)*2+1;
 [ 1  3  5]
 [ 7  9 11]
 [13 15 17]
$y .= $x; # if you use = here it will change both x and y 
for $c(0..2) { for $d(0..2) {  $y($c,$d) .= $y($c,$d) / sum($x(,$d))  }} 
p $y;
  [0.11111111 0.33333333 0.55555556]
  [0.25925926 0.33333333 0.40740741]
  [0.28888889 0.33333333 0.37777778]
于 2016-01-31T05:23:43.730 回答