u++の備忘録

Twitter提供のRパッケージ{AnomalyDetection}で日経平均株価の異常検知

データセット

日経平均株価のデータは、以下のサイトからダウンロードしました。2007年以降のデータをダウンロードし、結合して一つのcsvファイルを作ります。
http://k-db.com/indices/I101/1h

日付の列の処理

ダウンロード時点では"2007/01/01"のような形式で日付が入っていました。
rで日付を処理するには、決まった形式になっている方が都合が良さそうだったので、この時点でExcelの機能で整形しました。

f:id:upura:20170912104815p:plain

パッケージのインストール

install.packages("devtools")
devtools::install_github("twitter/AnomalyDetection")
library(AnomalyDetection)

実行

パッケージとデータセットの読み込み

library(AnomalyDetection)
df = read.csv("nikkei_index.csv")
data = data.frame(as.POSIXlt(df[,1]),df[,4]) # 終値を利用
plot(data, xlab = "date", ylab = "ending price")

f:id:upura:20170912105226p:plain

異常検知

res <- AnomalyDetectionTs(data, max_anoms=0.02, direction='both', plot=TRUE)
res

本来ならば、$anomsに異常と判定された行が抽出されるのですが、今回は全て異常ではないという判定だったようです。
確かにプロット結果を見ても、ある程度自然な推移のようにも捉えられます。

f:id:upura:20170912105314p:plain

終わりに

今後はより大規模なデータセットで試してみたいと思います。

github.com

【遊戯王デュエルリンクス】メテブラオートの初期手札で融合できる確率をPythonで計算 最適なデッキレシピの推定

 遊戯王デュエルリンクス*1におけるレベル上げ*2などで「メテブラオート」*3を使っていますが、スキル「バランス」*4がないキャラクターだと、少なからず手札事故で融合できないまま敗北することがあります。今回は、ランダムで配布される初期手札で融合できる確率を計算することで、できる限り手札事故が起こらないデッキレシピを推定します。

現在のデッキレシピ

 下図が、現在のデッキレシピです。感触として融合のための魔法カード*5が引けずに融合できないことが多いので、「バランス」を使用する場合よりも「融合」「フュージョン・ゲート」「融合賢者」の合計枚数を増やしています*6

f:id:upura:20170902235139p:plain

 ただし今回、例外的に「青竜の召喚士」*7はデッキの安定化のために3枚固定で入れることにします。また「サンダードラゴン」*8は当然3枚入れるのが良いため、3枚で固定します。

現在のデッキレシピにおいて初期手札で融合できる確率

 計算に用いたコードは、GitHub*9で公開しています。

デッキレシピの定義

# deck_list
deck_list = []
FUSION_CARD_NUM = 6 # 融合のための魔法カード
THUNDER_DRAGON_NUM = 3 # サンダードラゴン
RED_EYES_NUM = 3 # レッドアイズ
METEO_DRAGON_NUM = 2 # メテオドラゴン
SUMMONER_NUM = 3 # 青竜の召喚士
FUSION_SUPPORT_NUM = 3 # 融合呪印生物(指定された融合素材の片方の代わりにできるカード)
card_list = {"FUSION_CARD": FUSION_CARD_NUM,
             "THUNDER_DRAGON": THUNDER_DRAGON_NUM,
             "RED_EYES": RED_EYES_NUM,
             "METEO_DRAGON": METEO_DRAGON_NUM,
             "SUMMONER": SUMMONER_NUM,
             "FUSION_SUPPORT": FUSION_SUPPORT_NUM}

def deck_list_init():
    for card in card_list:
        for i in range(card_list[card]):
            deck_list.append(card)

初期手札の配布

 先攻の場合は初期手札が4枚、後攻の場合は5枚です。先攻か後攻かはランダムで決定します。

def first_hand_init():
    if np.random.rand() > 0.5:
        first_hand_num = 4
    else:
        first_hand_num = 5
    return random.sample(deck_list, first_hand_num)

融合できるか否かの判定

def can_fusion(first_hand):
    if "FUSION_CARD" not in first_hand:
        return False
    elif "THUNDER_DRAGON" in first_hand:
        return True
    elif "RED_EYES" in first_hand:
        if ("METEO_DRAGON" in first_hand) or ("FUSION_SUPPORT" in first_hand):
            return True
        else:
            return False
    elif "METEO_DRAGON" in first_hand:
        if ("RED_EYES" in first_hand) or ("FUSION_SUPPORT" in first_hand):
            return True
        else:
            return False
    else:
        return False

N回デュエルし、初期手札で融合できる確率を計算

def duel():
    deck_list_init()
    first_hand = first_hand_init()
    return can_fusion(first_hand)

def calc_prob():
    DUEL_NUM = 100000
    duel_result = []
    for duel_index in range(DUEL_NUM):
        duel_result.append(duel())
    print("Fusion Success Probability:" + str(sum(duel_result)/DUEL_NUM))

calc_prob()

出力

 現在のデッキレシピにおいて、初期手札で融合できる確率は約59%でした。乱数を使っているので、多少の数値は変動します。

Fusion Success Probability:0.59219

デッキレシピの調整

 続いて、上記の「デッキレシピの定義」に当たる部分をいろいろ変えながら、確率の変化を探索します。ここでもコードを書こうかと思ったのですが、あまりパターンがなく何を増減するかが若干複雑でコードを書く方がむしろ大変かと思ったので、手作業で判断しました。

 最初に、融合のための魔法カードの枚数を4~9枚で変動させてみました。上述したように「青竜の召喚士」と「サンダードラゴン」は3枚固定し、その他のカードをバランスを考えながら減らしています。

FUSION_CARD_NUM 4 5 6 7 8 9
THUNDER_DRAGON_NUM 3 3 3 3 3 3
RED_EYES_NUM 3 3 3 2 2 2
METEO_DRAGON_NUM 3 3 2 2 2 2
SUMMONER_NUM 3 3 3 3 3 3
FUSION_SUPPORT_NUM 4 3 3 3 2 1
Fusion Success Probability 0.507 0.561 0.592 0.601 0.604 0.591

 表の一番下の列の結果から、融合のための魔法カードの数は7、8枚が良さそうだと分かります。そこで、融合のための魔法カードの数が7、8枚のパターンを詳細に調べてみます。

FUSION_CARD_NUM 7 7 7 8 8 8 8
THUNDER_DRAGON_NUM 3 3 3 3 3 3 3
RED_EYES_NUM 3 3 2 3 3 2 2
METEO_DRAGON_NUM 3 2 2 3 2 2 1
SUMMONER_NUM 3 3 3 3 3 3 3
FUSION_SUPPORT_NUM 1 2 3 0 1 2 3
Fusion Success Probability 0.591 0.602 0.601 0.572 0.591 0.604 0.590

 この結果、表の右から2番目の列の組み合わせが最も確率が高そうだという結果が出ました。

おわりに

 こういう結果が得られたのは良いのですが、僕は「フュージョン・ゲート」を2枚、「融合賢者」を1枚しか持っていないので、自分で計算した最適なデッキレシピが組めません……。あと1枚ずつ手に入れたい(┐「ε:)_

*1:www.konami.com

*2:このスマホアプリでは、レベルアップのために多くの回数デュエルすることで経験値を稼ぐ必要がある

*3:このスマホアプリ内ではオートで戦うモードが有り、そのモードで使いやすい「メテオ・ブラック・ドラゴン」という融合モンスターの召喚に特化したデッキのこと

*4:初期手札にモンスターと魔法・罠がバランスよく入るため融合しやすい状態を作る効果を持つ

*5:緑色のカード。融合モンスターを出すためには、指定されている融合素材モンスター2枚以上と融合のための魔法カードを揃える必要がある

*6:バランスを使用する場合は魔法カードの合計枚数を5枚にするのが一般的

*7:appmedia.jp

*8:appmedia.jp

*9:github.com

【遊戯王デュエルリンクス】モンスター5枚のバランスデッキ

スキル「バランス」によって、初手に必ずモンスター1枚が来ることを前提にしたデッキ。プレイングの上手さに応じて勝率が変動する印象。プレイヤースキルが試される感じで、使っていて楽しい。
f:id:upura:20170823014112p:plain

【論文メモ】Extractive Summarization by Maximizing Semantic Volume

論文名

Dani Yogatama, Fei Liu, Noah A. Smith: Extractive Summarization by Maximizing Semantic Volume, The 2015 Conference on Empirical Methods on Natural Language Processing(EMNLP 2015), 2015.09.

link

どんなもの?

文章要約タスクにおいて、文章中の各文を特徴空間に埋め込み、文の集合で作られる容量を最大化するように文を選択する手法を提案している。

先行研究と比べてどこがすごい?

特定のデータセットにおいて、先行研究よりも高い性能を示した。

技術や手法のキモはどこ?

特徴空間内の容量を、文章要約に向けた新しい目的関数に設定している点。

どうやって有効だと検証した?

特定のデータセットにおいて、先行研究と提案手法を用いて性能を評価した。

議論はある?

実行時間に関する言及あり。提案手法はsingular value decomposition (SVD)を計算するため、前処理に時間がかかる。

次に読むべき論文は?

―――