Exemplo n.º 1
0
    def inference_subgraph(self, var_id):
        '''推理子图
        输入: 用于实体识别则var_id是一个变量id,用于情感分类, 则var_id是k个变量的集合
        输出:推理出的此隐变量的概率,此概率需写回variables
        '''
        learn = 1000
        ns = numbskull.NumbSkull(n_inference_epoch=10,
                                 n_learning_epoch=learn,
                                 quiet=True,
                                 learn_non_evidence=True,
                                 stepsize=0.0001,
                                 burn_in=10,
                                 decay=0.001**(1.0 / learn),
                                 regularization=1,
                                 reg_param=0.01)

        weight, variable, factor, fmap, domain_mask, edges_num, var_map, feature_map_weight = self.construct_subgraph(
            var_id)
        subgraph = weight, variable, factor, fmap, domain_mask, edges_num
        ns.loadFactorGraph(*subgraph)
        # 因子图参数学习
        ns.learning()
        logging.info("subgraph learning finished")
        # 因子图推理
        # 参数学习完成后将weight的isfixed属性置为true
        for w in ns.factorGraphs[0].weight:
            w["isFixed"] = True
        ns.learn_non_evidence = False
        ns.inference()
        logging.info("subgraph inference finished")
        # 写回概率到self.variables
        if type(var_id) == set() or type(var_id) == list():
            for id in var_id:
                self.variables[var_id]['probability'] = ns.factorGraphs[
                    0].marginals[var_map[var_id]]
        elif type(var_id) == int:
            self.variables[var_id]['probability'] = ns.factorGraphs[
                0].marginals[var_map[var_id]]
        else:
            print('参数错误,var_id应为int或者set和list')
        logging.info("inferenced probability recored")
Exemplo n.º 2
0
        fmp_index += 1
        factor_index += 1
    # 将定义好的因子图保存为factorGraph.pkl文件,以备后期验证使用
    #factorGraph = weight, variable, factor, fmap, domain_mask, edges
    # with open('factorGraph_original.pkl', 'wb') as f:    #原始的图
    #     pickle.dump(factorGraph, f)
    return weight, variable, factor, fmap, domain_mask, edges


#1.已知所有参数,推理所有变量
learn = 1000
ns = numbskull.NumbSkull(n_inference_epoch=10,
                         n_learning_epoch=learn,
                         quiet=True,
                         learn_non_evidence=True,
                         stepsize=0.0001,
                         burn_in=10,
                         decay=0.001**(1.0 / learn),
                         regularization=1,
                         reg_param=0.01)
fg = create_fg()
ns.loadFactorGraph(*fg)

ns.inference()
print("First Inference Finished!")
for i in range(1000):
    if ns.factorGraphs[0].marginals[
            i] > 0.5:  #推理出来的变量是概率值,保存在factorGraphs[0].marginals,现在写回到fg
        fg[1][i]['initialValue'] = 1
    else:
        fg[1][i]['initialValue'] = 0
Exemplo n.º 3
0
    fmap = np.zeros(edges, FactorToVar)
    domain_mask = np.zeros(variables, np.bool)

    weight[0]["isFixed"] = True
    weight[0]["initialValue"] = 1

    for i in range(variables):
        variable[i]["isEvidence"] = 0
        variable[i]["initialValue"] = 0
        variable[i]["dataType"] = 0
        variable[i]["cardinality"] = 2

    factor[0]["factorFunction"] = value
    factor[0]["weightId"] = 0
    factor[0]["featureValue"] = 1
    factor[0]["arity"] = variables
    factor[0]["ftv_offset"] = 0

    for i in range(variables):
        fmap[i]["vid"] = i

    ns = numbskull.NumbSkull(n_inference_epoch=100,
                             n_learning_epoch=100,
                             quiet=True)

    ns.loadFactorGraph(weight, variable, factor, fmap, domain_mask, edges)

    ns.learning()
    ns.inference()
    print(ns.factorGraphs[0].count)
Exemplo n.º 4
0
 def init_numbskull(self, argv):
     """TODO."""
     self.args = self.parse_args(argv)
     self.ns = numbskull.NumbSkull(**vars(self.args))
Exemplo n.º 5
0
 def prep_local_numbskull(self):
     """TODO."""
     self.ns = numbskull.NumbSkull(**vars(self.args))
            factor[factor_index]["featureValue"] = 1
            factor[factor_index]["arity"] = 2
            factor[factor_index]["ftv_offset"] = copy * (1 + 2 * n) + 1 + 2 * i

            fmap_index = copy * (1 + 2 * n) + 1 + 2 * i
            fmap[fmap_index]["vid"] = copy * (1 + n)  # y
            fmap[fmap_index]["vid"] = copy * (1 + n) + i + 1  # labeling func i

    return weight, variable, factor, fmap, domain_mask, edges


learn = 100
ns = numbskull.NumbSkull(n_inference_epoch=100,
                         n_learning_epoch=learn,
                         quiet=True,
                         learn_non_evidence=True,
                         stepsize=0.01,
                         burn_in=100,
                         decay=0.001**(1.0 / learn),
                         reg_param=0.15)

prior = 0
accuracy = [1, 0.5]
abstain = [0, 0, 0]
copies = 10
fg = create_fg(prior, accuracy, abstain, copies)
print("weight")
print(fg[0])
print()

print("variable")
print(fg[1])