Exemple #1
0
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
Exemple #2
0
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