我正在寻找一个库来创建贝叶斯网络,并在Scala(或Java,在没有更好的解决方案的情况下)对它们进行学习和推理.除非用法非常简单,否则应该积极维护,保持性能,最好是简单,明确的文档.免费,开源和商业替代品都可以,但对于商业解决方案,需要免费试用.
一个理想的解决方案就是微软研究院的.NET世界中的Infer.NET,但更多的文档记录.
提前致谢!
我正在尝试构建一个贝叶斯网络模型.但是我无法安装合适的包.尝试gRain,bnlearn并Rgraphviz绘图.我在R 2.15和3.2中尝试过
以下是错误消息:
library(gRain)
Loading required package: gRbase
Loading required package: graph
Error: package ‘graph’ could not be loaded
In addition: Warning message:
In library(pkg, character.only = TRUE, logical.return = TRUE, lib.loc = lib.loc) :
there is no package called ‘graph’
> install.packages("graph")
Warning message:
package ‘graph’ is not available (for R version 2.15.3)
Run Code Online (Sandbox Code Playgroud)
R 3.2.1也是如此
> install.packages("graph")
(as ‘lib’ is unspecified)
Warning message:
package ‘graph’ is not available (for R version 3.2.1)
> …Run Code Online (Sandbox Code Playgroud) 我正在使用ruby分类器gem,其分类方法返回针对训练模型分类的给定字符串的分数.
得分是百分比吗?如果是这样,最大差异是100分吗?
我一直在尝试实现这里描述的算法,然后在同一篇论文中描述的"大动作任务"上测试它.
算法概述:

简而言之,该算法使用下面所示形式的RBM通过改变其权重来解决强化学习问题,使得网络配置的自由能等于为该状态动作对给出的奖励信号.
为了选择动作,算法在保持状态变量固定的同时执行gibbs采样.有足够的时间,这会产生具有最低自由能的动作,因此是给定状态的最高奖励.
大型行动任务概述:

作者的实施指南概述:
具有13个隐藏变量的受限Boltzmann机器在具有12位状态空间和40位动作空间的大动作任务的实例化上被训练.随机选择了13个关键状态.该网络运行了12000次,学习率从0.1到0.01,在整个培训过程中,温度从1.0到0.1呈指数级增长.每个迭代都以随机状态初始化.每个动作选择包括100次Gibbs采样迭代.
重要的遗漏细节:
我的实施:
我最初假设作者没有使用指南中描述的机制,所以我尝试在没有偏置单元的情况下训练网络.这导致了近乎机会的表现,这是我的第一个线索,即使用的某些机制必须被作者视为"显而易见",因此被省略.
我玩了上面提到的各种省略机制,并通过使用以下方式获得了我最好的结果:
但即使进行了所有这些修改,我在任务上的表现通常在12000次迭代后的平均奖励为28.
每次迭代的代码:
%%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data = [batchdata(:,:,(batch)) rand(1,numactiondims)>.5];
poshidprobs = softmax(data*vishid + hidbiases);
%%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hidstates = softmax_sample(poshidprobs);
%%%%%%%%% START ACTION SELECTION PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,0);
else
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,temp);
end
data(numdims+1:end) = negaction > rand(numcases,numactiondims);
if mod(batch,100) == 1
disp(poshidprobs);
disp(min(~xor(repmat(correct_action(:,(batch)),1,size(key_actions,2)), key_actions(:,:))));
end
posprods …Run Code Online (Sandbox Code Playgroud) matlab artificial-intelligence machine-learning bayesian-networks reinforcement-learning
我正在尝试实施贝叶斯网络.
我的主图是我想用于信念传播的因子图.但是,在计算消息时的置信传播中,并非所有参数都传递给函数,最终函数将是联合分布的限制.
我想到的最好的方法是以某种方式限制函数,以便每当我想为新值计算边际值时不进行所有替换.
我问过如何在这里实现这样的功能.
我想知道是否有更好的方法来做这样的事情,或者是否有比我想做的更简单快捷的方法.
我有一个贝叶斯网(DAG)模型,我使用pymc 2.3创建.其中的所有变量都是伯努利随机变量.当我在采样之前调用它上面的MAP.fit()方法时,我得到所有随机变量的以下警告:
value is neither numerical nor array with floating-point dtype. Recommend fitting method fmin (default)
Run Code Online (Sandbox Code Playgroud)
从pymc的github repo中,如果随机变量的基础类型不是浮点数,似乎会打印此警告.对于伯努利RV来说,类型是(并且应该是)bool.
这是否意味着MAP步骤会产生不稳定的结果?
我在网上发现了一些文章,提供了如何在SQL中对各种图形(特别是DAG)进行建模的示例,但考虑到它们的建模相对简单,它们看起来都非常复杂.
这样做有最佳/标准的方法吗?我目前的想法是这样的:
create table node (
id int not null auto_increment,
name TEXT
)
create table edge (
from_node int not null,
to_node int not null,
weight float
)
Run Code Online (Sandbox Code Playgroud)
那有什么不对吗?任何人都知道更好(更强大,也许)的方式?
有没有人知道使用WEKA API从数据中学习贝叶斯网络的"正确"程序?我在WEKA文档中找不到好的说明.
基于文档和每个函数"应该"做什么,我认为这将工作:
Instances ins = DataSource.read( filename );
ins.setClassIndex(0);
K2 learner = new K2();
MultiNomialBMAEstimator estimator = new MultiNomialBMAEstimator();
estimator.setUseK2Prior(true);
EditableBayesNet bn = new EditableBayesNet( ins );
bn.initStructure();
learner.buildStructure(bn, ins);
estimator.estimateCPTs(bn);
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.我已经尝试了这个和其他变化,我一直在WEKA代码中ArrayIndexOutOfBoundsException或者NullPointerException某个地方,所以我错过了什么?
我有一个大的哲学论证数据集,每个参数都连接到其他参数作为给定语句的证明或反证.根声明可以有许多证明和反证,每个都可能有证明和反证.语句也可用于多个图形,并且可以在"给定上下文"或假设下分析图形.
我需要构建一个相关参数的贝叶斯网络,以便每个节点公平准确地传播影响它的连接参数; 我需要能够同时计算连接节点链的概率,每个节点都需要数据存储区查找,必须阻止才能获得结果; 该进程主要是I/O绑定,我的数据存储连接可以在java,go和python {google appengine}中异步运行.每次查找完成后,它会将效果传播到所有其他连接节点,直到概率增量低于不相关阈值{当前为0.1%}.进程的每个节点必须计算连接链,然后总结所有查询中的所有结果以调整有效性结果,结果向外链接到任何连接的参数.
为了避免无限重复,我想在goroutines中使用类似A*的过程将更新传播到参数映射,使用基于复合影响的启发式方法,一旦影响概率低于0.1%,就会忽略节点.我曾尝试使用SQL触发器设置计算,但它过于复杂和混乱.然后我转移到谷歌appengine利用异步nosql,它更好,但仍然太慢.我需要足够快地运行更新以获得快速的UI,因此当用户创建或投票赞成或反对证明或反证时,他们可以立即看到结果反映在UI中.
我认为Go是支持我需要的并发性的首选语言,但我愿意接受建议.客户端是一个单片的javascript应用程序,它只使用XHR和websockets实时推送和拉出参数映射{及其更新}.我有一个可以在10到15秒内计算大型链的java原型,但是对性能的监控表明我的大部分运行时都浪费在ConcurrentHashMap的同步和开销上.
如果还有其他高度并发的语言值得尝试,请告诉我.我知道java,python,go,ruby和scala,但如果它符合我的需要,它会学习任何语言.
同样,如果有大型贝叶斯网络的开源实现,请留下建议.
我正在尝试使用bnlearn 包来计算条件概率,并且当在循环中使用"cpquery"函数时我遇到了问题.我已经使用包中包含的数据创建了一个示例,如下所示.在循环中使用cpquery函数时,函数无法识别循环中创建的变量(示例中为"evi").我收到错误:
Error in parse(text = evi) : object 'evi' not found
Run Code Online (Sandbox Code Playgroud)
"evi"的创建步骤基于作者提供的示例.
你能提供的任何帮助都会很棒.我迫切希望找到一种可以将cpquery函数应用于大量观察的方法.
library(bnlearn)
data(learning.test)
fitted = bn.fit(hc(learning.test), learning.test)
bn.function <- function(network, evidence_data) {
a <- NULL
b <- nrow(evidence_data)
for (i in 1:b) {
evi <- paste("(", names(evidence_data), "=='",
sapply(evidence_data[i,], as.character), "')",
sep = "", collapse = " & ")
a[i] <- cpquery(network, (C=='c'), eval(parse(text=evi)))
}
return(a)
}
test <- bn.function(fitted, learning.test)
Run Code Online (Sandbox Code Playgroud)
提前致谢!