我写了一些有用的东西,但我百分之百地确信有一种更有效,更快捷的方式来做我所做的事。
我编写的代码主要使用OpenBayes的库并创建一个网络,其中包含节点,节点之间的关系以及与每个节点关联的概率和分布。现在,我正在使用Flask创建一个GET请求,以便通过简单地发送请求来处理条件概率。
我将发送一些证据(给定值),并设置我想要其概率的节点(观察值)。在数学上它看起来像这样:
观察值= O 且证据= En,其中n> 1
P(O | E1,E2,...,En)
我的最终目标是让客户端/服务器ping托管此代码的服务器(使用正确的参数)并根据证据(可能是1个或更多值)不断给出观察概率的最终值。我到目前为止为GET请求部分编写的代码是:
@app.route('/evidence/evidence=<evidence>&observed=<obv>', methods=['GET'])
def get_evidence(evidence, obv):
# Take <evidence> and <obv> split them up. For example:
# 'cloudy1rain0sprinkler1' to 'cloudy1', 'rain0' and 'sprinkler1', all in a nice list.
analyzeEvidence, observedNode = evidence.upper().strip(), obv.upper().strip()
string, count, newCount, listOfEvidence = "", 0, 0, {}
counter = sum(character.isdigit() for character in analyzeEvidence)
# This portion is to set up all the evidences.
for y in xrange(0, counter):
string, newCount = "", count
for x in xrange(newCount, len(analyzeEvidence)):
count += 1
if analyzeEvidence[x].isalpha() == True:
string += str(analyzeEvidence[x])
elif analyzeEvidence[x].isdigit() == True and string in allNodes:
if int(analyzeEvidence[x]) == 1 or int(analyzeEvidence[x]) == 0:
listOfEvidence[string] = int(analyzeEvidence[x])
break
else: abort(400)
break
else: abort(400)
net.SetObs(listOfEvidence) # This would set the evidence like this: {"CLOUDY": 1, "RAIN":0}
# This portion is to set up one single observed value
string = ""
for x in xrange(0, len(observedNode)):
if observedNode[x].isalpha() == True:
string += str(observedNode[x])
if string == "WETGRASS":
string = "WET GRASS"
elif observedNode[x].isdigit() == True and string in allNodes:
if int(observedNode[x]) == 1 or int(observedNode[x]) == 0:
observedValue = int(observedNode[x])
observedNode = string
break
else: abort(400)
else: abort(400)
return str(net.Marginalise(observedNode)[observedValue]) # Output returned is the value like: 0.7452
鉴于我的代码,有没有办法优化它?另外,有没有更好的方法来传递这些参数,而不像我的代码那样需要这么多行?我正在计划设置固定的关键参数,但由于我的证据数量可以根据请求而改变,我认为这是这样做的一种方式。
答案 0 :(得分:0)
您可以使用以下方法轻松地将证据输入拆分为字符串列表:
mccr2
你应该可以做一些与观察相似的事情。
我建议您使用HTTP POST。这样你就可以发送一个JSON对象,它已经为你完成了变量名和值的分离,你要做的就是检查发送的变量名在import re
# 'cloudy1rain0sprinkler1' => ['cloudy1', 'rain0' and 'sprinkler1'].
evidence_dict = {}
input_evidence = 'cloudy1rain0sprinkler1'
# looks for a sequence of alphabets followed by any number of digits
evidence_list = re.findall('([a-z]+\d+)', input_evidence.lower())
for evidence in evidence_list:
name, val, _ = re.split('(\d+)', evidence)
if name in allNodes:
evidence_dict[name] = val
# evidence_dict = {'cloudy': 1, 'rain': 0, 'sprinkler': 1}
中是否有效。它还将允许您的变量列表在某种程度上随意增长。