def getWorstData(stateDict, detail=False): if detail == True: print("[predictMatching]getWorstData:start") # TODO 暫定的に「ステップ数の遠いデータにはペナルティ」としよう # 本質的ではないので他の方法を考える bMean = int( sum([b["step"] for b in stateDict["before"]]) / len(stateDict["before"])) aMean = int( sum([a["step"] for a in stateDict["after"]]) / len(stateDict["before"])) output = {} output["score"] = 0 output["worstIndex"] = -1 output["worstScore"] = 0 for i in range(len(stateDict["before"])): if detail == True: log = "step " + str(i) + "/" + str(len(stateDict["before"])) print("[predictMatching]getWorstData:" + log) # 学習データをコピーし,テストデータ分をポップ tempDict = copy.deepcopy(stateDict) tempTest = {} tempTest["before"] = tempDict["before"].pop(i) tempTest["after"] = tempDict["after"].pop(i) tempTest["fname"] = tempDict["fname"].pop(i) tempTest["isadd"] = tempDict["isadd"].pop(i) # 学習データで学習を行う vp = manager.getViewPoint(tempDict) # 学習した観点でテストデータの推定を行う predicted = manager.predictwithViewPoint(tempTest["before"], vp) # 推定結果と実際の状態とのずれを計算する error = manager.calcDifference(predicted, tempTest["after"]) # TODO ステップ数のずれを考慮する # TODO 他の方法を考える tempsteprate = 2 error += tempsteprate * (tempTest["before"]["step"] - bMean) * (tempTest["before"]["step"] - bMean) error += tempsteprate * (tempTest["after"]["step"] - aMean) * (tempTest["after"]["step"] - aMean) # ずれが最大を更新したら記録する output["score"] += error if error > output["worstScore"]: if detail == True: print("[predictMatching]getWorstData: updateWorst") output["worstIndex"] = i output["worstScore"] = error # score は平均化 output["score"] /= len(stateDict["before"]) if detail == True: print("[predictMatching]getWorstData:score:" + str(output["score"])) return output
def DP_sub(datas, stateDict): output = {} matching = {"before": [], "after": [], "fname": [], "isadd": []} ignored = {"before": [], "after": [], "fname": [], "isadd": []} pending = {"before": [], "after": [], "fname": [], "isadd": []} # 閾値以下になるまでworstState を抽出 matching = copy.deepcopy(stateDict) while True: result = getWorstData(matching) # if result["score"] < THRESHOLD: rate = result["worstScore"] / result["score"] print("[predictMatching]DP_sub:rate:" + str(rate)) if rate < THRESHOLD: break elif len(matching) < 3: print("失敗よ!ばか!") exit() pending["before"].append(matching["before"].pop(result["worstIndex"])) pending["after"].append(matching["after"].pop(result["worstIndex"])) pending["fname"].append(matching["fname"].pop(result["worstIndex"])) pending["isadd"].append(matching["isadd"].pop(result["worstIndex"])) print("[predictMatching]DP_sub:pended:" + str(pending["after"][-1]["step"])) # 除去した状態のbefore でgetAdditional vp = manager.getViewPoint(matching) additionals = [] for i in range(len(pending["before"])): additionals.append( getAdditionalIntermediate(datas[pending["fname"][i]], pending["before"][i]["step"], vp)) temptext = "[predictMatching]DP_sub:additionals-(before, after, additional):(" temptext += str(pending["before"][i]["step"]) + ", " temptext += str(pending["after"][i]["step"]) + ", " temptext += str(additionals[-1]["step"]) + ")" print(temptext) # additional のステップが after のステップよりも手前なら保留データ for i in range(len(additionals)): # 無視だろうが保留だろうが,additionals したデータは適切なので # additionals を用いて matching に復帰 matching["before"].append(pending["before"][i]) matching["after"].append(additionals[i]) matching["fname"].append(pending["fname"][i]) matching["isadd"].append(True) # additional のステップが after のステップよりも奥なら無視データ if additionals[i]["step"] > pending["after"][i]["step"]: ignored["before"].append(pending["before"][i]) ignored["after"].append(pending["after"][i]) ignored["fname"].append(pending["fname"][i]) ignored["isadd"].append(pending["isadd"][i]) # pending[after] を消しておいて,あとで # 「消されてないのは保留データ」というように処理する pending["after"][i] = None temppend = {"before": [], "after": [], "fname": [], "isadd": []} for i in range(len(pending["before"])): if pending["after"][i] is not None: # temppend["before"].append(pending["before"][i]) # pending の前状態は additionals で更新 temppend["before"].append(additionals[i]) temppend["after"].append(pending["after"][i]) temppend["fname"].append(pending["fname"][i]) temppend["isadd"].append(True) pending = temppend # 返す output["matching"] = matching output["ignored"] = ignored output["pending"] = pending return output