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")
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
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)
def init_numbskull(self, argv): """TODO.""" self.args = self.parse_args(argv) self.ns = numbskull.NumbSkull(**vars(self.args))
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])