我感兴趣的是运行相同的函数,以并行方式使用mulitple内核上的参数的不同值来执行一些蒙特卡罗评估.我还想确保整个函数在同一个内核上运行,而不会在函数内的计算分布在内核中.例如,假设我有一个功能(故意简化)
f[a_, b_] := Module[{}, RandomReal[{a, b}]]
In[1]:= LaunchKernels[]
Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"],
KernelObject[3, "local"], KernelObject[4, "local"],
KernelObject[5, "local"], KernelObject[6, "local"],
KernelObject[7, "local"]}
SeedRandom[795132, Method -> "ParallelGenerator"];
m1 = 1; m2 = 2; m3 = 3; m4 = 4; m5 = 5; m6 = 6; m7 = 7; m8 = 8;
DistributeDefinitions[f, m1, m2, m3, m4, m5, m6, m7, m8];
Run Code Online (Sandbox Code Playgroud)
我现在想在五个不同的内核上运行f [m1,m2],f [m3,m4],f [m5,m6],f [m7,m8] f [m9,m10],这些内核之间没有信息传递,即,在不同内核上使用单独的随机数流.
如何在Mathematica中做到这一点?
我有兴趣在不需要张量的列表上使用Listable Compiled函数.我想理解为什么有些函数可以工作,而有些函数却没有,关闭内核.这是一个例子.
假设我们有两个矩阵m1和m2如下.
m1 = {{1.0, 0.5, 0.5}, {0.5, 1.0, 0.5}, {0.5, 0.5, 1.0}};
m2 = {{1.0, 0.5}, {0.5, 1.0}};
Run Code Online (Sandbox Code Playgroud)
我们可以制作两个不同的列表,第一个是张量,第二个不是.
In[3]:= mList1 = {m1, m1};
In[4]:= TensorQ[mList1]
Out[4]= True
In[5]:= mList2 = {m1, m2};
In[6]:= TensorQ[mList2]
Out[6]= False
Run Code Online (Sandbox Code Playgroud)
类似地,令v1和v2为两个向量,vList1和vList2为两个列表,如下所示
v1 = {1.0, 1.5, 0.9};
v2 = {1.1, 0.7};
In[9]:= vList1 = {v1, v1};
In[10]:= TensorQ[vList1]
Out[10]= True
In[11]:= vList2 = {v1, v2};
In[12]:= TensorQ[vList2]
Out[12]= False
Run Code Online (Sandbox Code Playgroud)
现在我们定义两个可列表函数func1和func2
func1 = Compile[{{m, _Real, 2}, {v, _Real, 1}},
m.v,
RuntimeAttributes -> Listable …Run Code Online (Sandbox Code Playgroud) 我感兴趣的是将多个向量写入文件,使得每个向量在文件中形成一行,并在生成后立即写入文件.向量的元素需要用单个空格分隔,我不想包含{ }向量的括号.基本上,我想模仿fprintf("file", "%f %f %f\n")C 的功能.
这就是我所拥有的.有没有更好的方法呢?
st1 = OpenWrite["C:\\junk\\mu.out", FormatType -> OutputForm];
vt = Table[
v = RandomReal[{0, 1}, 5];
For[j = 1, j <= Length[v], j++,
WriteString[
st1,
SequenceForm[NumberForm[v[[j]], ExponentFunction -> (Null &)],
" "]
]
];
Write[st1, ""];
v,
{200}
];
In[3]:= Close[st1]
Out[3]= "C:\\junk\\mu.out"
Run Code Online (Sandbox Code Playgroud)
基于精彩的Riffle功能,礼貌Arnoud和Mr. Wizard,我在下面修改它如下:
WriteVector[stream_, vector_] :=
Apply[WriteString[stream, ##, "\n"] &,
Riffle[Map[NumberForm[#, ExponentFunction -> (Null &)] &, vector],
" "]
]
Run Code Online (Sandbox Code Playgroud) 我有兴趣使用Dynamic监控计算的进度.这可以通过以下方式交互式完成:
In[3]:= Dynamic[iter]
In[4]:= Table[{iter, iter^2}, {iter, 1, 500000}];
Run Code Online (Sandbox Code Playgroud)
但是,如果表位于诸如此类的函数内
f[m_] := Module[{iter}, Table[{iter, iter^2}, {iter, 1, m}]];
Run Code Online (Sandbox Code Playgroud)
当我执行函数时,如何跟踪iter的值
f[500000];
Run Code Online (Sandbox Code Playgroud)
?
我期待看到如何编译计算对数似然的Hessian的函数,以便它可以有效地与不同的参数集一起使用.
这是一个例子.
假设我们有一个函数来计算logit模型的对数似然,其中y是向量,x是矩阵.beta是参数的向量.
pLike[y_, x_, beta_] :=
Module[
{xbeta, logDen},
xbeta = x.beta;
logDen = Log[1.0 + Exp[xbeta]];
Total[y*xbeta - logDen]
]
Run Code Online (Sandbox Code Playgroud)
鉴于以下数据,我们可以如下使用它
In[1]:= beta = {0.5, -1.0, 1.0};
In[2]:= xmat =
Table[Flatten[{1,
RandomVariate[NormalDistribution[0.0, 1.0], {2}]}], {500}];
In[3]:= xbeta = xmat.beta;
In[4]:= prob = Exp[xbeta]/(1.0 + Exp[xbeta]);
In[5]:= y = Map[RandomVariate[BernoulliDistribution[#]] &, prob] ;
In[6]:= Tally[y]
Out[6]= {{1, 313}, {0, 187}}
In[9]:= pLike[y, xmat, beta]
Out[9]= -272.721
Run Code Online (Sandbox Code Playgroud)
我们可以写下它的粗麻布如下
hessian[y_, x_, z_] :=
Module[{},
D[pLike[y, x, z], {z, 2}]
]
In[10]:= …Run Code Online (Sandbox Code Playgroud)