u++の備忘録

【遊戯王デュエルリンクス】修正されたスキル「バランス」で50回戦った初期手札の分布 スクリーンショットからPythonで自動集計

11月6日のアップデートで、スキル「バランス」に一定のランダム性が付与されたそうです。どの程度のランダム性が付与されたかを調べるため、初期手札の分布を集計しました。

使用デッキ

f:id:upura:20171110075543p:plain
モンスター10枚・魔法5枚・罠5枚デッキで、スキルは「バランス」です。

集計方法

デュエルを始めた際の初期手札の画面でスクリーンショットを撮影し、下記のPythonスクリプトで自動集計しました。
upura.hatenablog.com

集計結果

f:id:upura:20171110080504p:plain
※ 0: モンスター, 1: 魔法, 2: 罠

修正前の効果だと、確定でモンスター2枚・魔法1枚・罠1枚になっていました。今回の調査で従来通りの配分になったのは36回(72%)で、以下のようなランダム性がありました。

  • モンスター2枚・魔法2枚……5回
  • モンスター3枚・魔法1枚……3回
  • モンスター3枚・罠1枚……3回
  • モンスター1枚・魔法2枚・罠1枚……3回

例えば、罠カードをデッキに5枚入れて「バランス」で初期手札に1枚入れようとするデッキの場合、今回の調査結果によると16%の可能性で失敗すると推定されます。

【Python&遊戯王デュエルリンクス】スクリーンショットから初期手札の「バランス」を自動取得するスクリプト

11月6日のアップデートで、スキル「バランス」に一定のランダム性が付与されたそうです。どの程度のランダム性が付与されたかを調べるため現在、モンスター10枚・魔法5枚・罠5枚デッキで「バランス」を使ってデュエルを始めた際の初期手札のスクリーンショットをひたすら取り続けています。

(オートで回している隙間時間を使って)その集計を簡略化するべく、スクリーンショットの画像から初期手札のモンスター・魔法・罠の割合を自動取得するプログラムを書きました。
github.com

手法

  1. 画像から、手札の1枚ずつの領域を取り出す
  2. それぞれの領域内のRGB値の平均を導出し特徴量とする
  3. 全てのデータ(特徴量+各ラベル)からKmeans法でモンスター・魔法・罠に分類する
  4. 集計して棒グラフを出力する
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import cv2
from sklearn.cluster import KMeans
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

img_dirs = ['img']
CARD_NUM = 4
CLASS_NUM = 3
img_data = []

def convertImgToRGB(img):
    for card in range(CARD_NUM):
        trim_img = img[1180:1200,(80 + 113 * card):(193 + 113 * card)]
        averages = trim_img.mean(0).mean(0)
        img_data.append(averages)

def imgImport():
    for i, d in enumerate(img_dirs):
        files = os.listdir('./'+d)    
        for f in files:
            img = cv2.imread('./' + d + '/' + f)
            convertImgToRGB(img)

def createBarplot(counter):
    labels = []
    cnts = []
    for label, cnt in counter.most_common():
        labels.append(label)
        cnts.append(cnt)
    left = np.array([(i+1) for i in range(len(cnts))])
    height = np.array(cnts)
    plt.bar(left, height, tick_label=labels, align="center")

def converRGBToCollection(img_data):
    pred = KMeans(n_clusters = CLASS_NUM).fit_predict(img_data)
    pred.resize(int(len(pred)/CARD_NUM), CARD_NUM)
    pred = list(pred)
    for i in range(len(pred)):
        pred[i].sort()
        pred[i] = str(pred[i])
    counter = Counter(pred)
    createBarplot(counter)

imgImport()
converRGBToCollection(img_data)

画像処理のイメージ

github.com

Kmeans法の結果

f:id:upura:20171110090559p:plain

from mpl_toolkits.mplot3d import Axes3D
def plotRGBVectors(img_data):
    pred = KMeans(n_clusters = CLASS_NUM).fit_predict(img_data)
    x = []
    y = []
    z = []
    for i in range(len(pred)):
        x.append(img_data[i][0])
        y.append(img_data[i][1])
        z.append(img_data[i][2])
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel("X-axis")
    ax.set_ylabel("Y-axis")
    ax.set_zlabel("Z-axis")
    ax.set_xlim(0, 256)
    ax.set_ylim(0, 256)
    ax.set_zlim(0, 256)
    ax.scatter(x, y, z, "o", c=pred)
    plt.show()

plotRGBVectors(img_data)

スクリーンショット募集

データ量が大事なので、同条件でのスクリーンショットを下記フォルダにアップロードいただけると大変ありがたいです。
https://drive.google.com/drive/folders/1N4kV_Mu0qq--IEJO0EwoLKBk4ygD_r3M?usp=sharing

kmeansのinertiaとは何物か

暇だったのでkmeansのdocumentationを読んでいたら、今まで曖昧な理解だった"inertia"という語についてまとまった言及があったので、自分用メモ。

2.3. Clustering — scikit-learn 0.21.3 documentation

inertiaとは

kmeansの最適化において最小化すべき指標で、各クラスター内の二乗誤差のこと。

  • 凸面や等方性を想定しており、細長い集合などイレギュラーな構造が合わさった集合などを扱うのには向いていない
  • 正規化された指標ではないので「低い方が良く、0が最適」以上のことは言えない

inertiaの算出

ここでは、直接的な関数を使わずにinertiaを算出してみる。Jupyter notebookのコードはGithubで公開。

github.com

サンプル

下記記事の内容を利用。

qiita.com

f:id:upura:20171107113421p:plain

上記のようにクラスター分けされた集合でのinertiaを算出する。関数を用いると、以下の値が出る。

print ('Distortion: %.2f'% km.inertia_)
Distortion: 72.48

定義から計算

定義の通り、各クラスターごとの中心点との二乗誤差を足し上げる。関数を用いた結果と、ほぼほぼ一致した。

SSE = 0
for cluster in range(3):
    SSE += sum((km.cluster_centers_[cluster,0] - X[y_km==cluster,0])**2 + (km.cluster_centers_[cluster,1] - X[y_km==cluster,1])**2)
print(SSE)
72.47601671

【論文メモ】乗換案内データを用いた未来の混雑予測の研究

論文名

坪内孝太, 下坂正倫, 小西達也, 丸山三喜也, 山下達雄: 乗換案内データを用いた未来の混雑予測の研究, The 31st Annual Conference of the Japanese Society for Artificial Intelligence, 2017.
https://kaigi.org/jsai/webprogram/2017/paper-1107.html

どんなもの?

本研究はユーザの路線検索結果に着目することでユーザの予定情報を考慮しつつ、異常時の人口予測を可能にする手法を構築した.大規模なイベントであれば 1 週間前の時点からでも異常を予測できることを実験により確認した。

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

位置履歴データを用いて人口異常を検知する既存研究は多いが、数日前の時点から人口異常を「予測」する研究はなされていない。

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

Yahoo! JAPAN 経路検索のログデータを用いて、ユーザの予定情報を考慮した人口予測モデリングを実施。異常度を「乖離率」で判断する。

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

  • イベントの有無によらず人口予測が可能であることを実験的に検証した.
  • 次に,SP と定常人口 DP とを比較することで,今まで為し得なかった 1 週間前の時点での異常予測が可能であることを示した.

議論はある?

  • 本研究では非常に簡単な式で「乖離率」を定義することで定量的な評価を行ったが,この判定基準をさらに洗練することで粒度の異なる異常予測が可能になると期待され,将来課題として考えられる.
  • また,大規模な異常混雑につながるようなイベントでは高い精度で検出できるが,異常の度合いが中規模(平常時の 5 倍程度)のイベントになると急に精度が低くなることも確認した.このようなケースにも対応できる工夫も将来課題の 1 つといえる.

次に読むべき論文は?

なし

【論文メモ】経済テキストデータを用いた極性概念辞書構築とその応用

論文名

伊藤友貴,坪内孝太,山下達雄,和泉潔: 経済テキストデータを用いた極性概念辞書構築とその応用, SIG-FIN-018, 2017.

どんなもの?

本研究では,極性概念辞書の構築手法を提案すると共にその有用性を検証した.まず,ヤフーファイナンス掲示板のテキスト情報,専門家によって与えられた約100単語の極性値,及び構造化されたニューラルネットワークモデルを用いて意味的にクラス分けされた極性概念辞書を作成した.その後,極性概念辞書を用いて経済動向の分析を試みた.

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

現状,単語単位での極性辞書自動構築に関する既存研究はあるものの,似たような意味の単語がひとまとまりになった形での極性辞書,極性概念辞書の構築に関する研究はほとんどされていない.

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

構造化されたニューラルネットワークモデルを用いた極性概念辞書の構築手法

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

人工データを用いた単語へのポジネガ付与に関する実験
→ 極性伝播条件の妥当性を検証
→ 提案手法の性質を理論的に解析

実データを用いた極性伝搬の検証
→ 提案手法が市場動向分析において他の既存手法に比べ有用であることを実験的に示した

議論はある?

  • フレーズ単位での極性情報抽出手法の考案
  • 極性辞書の情報が少ない場合や少数のラベルつきデータしか手に入れられない状況でも安定的で高い予測精度を出すための改良法の開発
  • マルチタイプ極性概念辞書を用いた複種類のテキストデータの分析方法の開発

次に読むべき論文は?

なし

【論文メモ】Neural Attention Modelを用いた観点付き評判分析

論文名

柳瀬利彦, 柳井孝介, 佐藤美沙, 三好利昇, 丹羽芳樹: Neural Attention Modelを用いた観点付き評判分析, The 30th Annual Conference of the Japanese Society for Artificial Intelligence, 2016.

どんなもの?

  • Neural Network の一種である Neural Attention Model [Luong 15] を用いた観点付き評判分析の方法を提案
    • [Luong 15] Luong, T., Pham, H., and Manning, C. D.: Effective Approaches to Attention-based Neural Machine Translation, in Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing, pp. 1412–1421, Lisbon, Portugal (2015), Association for Computational Linguistics
  • 通常の評判分析と異なり本タスクでは,観点に対応する文中の表現を特定することが必要

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

  • 辞書などの人手で作成した言語資源が不要なRNN や CNN を用いた手法が主流
  • 特に、注目箇所の特定を自動的に行う方法として,機械翻訳ではNeural Attention Model が用いられる
    • Attention層が文脈に合わせて各トークンの重要度を計算することで,文脈にあわせた判断ができる.

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

Neural Network の一種である Neural Attention Modelを、観点付き評判分析に応用

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

ABSA2015 データセットを用いた評価で従来の最も高い精度を実現したチームと同等かそれ以上の精度を実現した.

議論はある?

今後の課題として,日本語を含めた多言語への応用を考えている.

次に読むべき論文は?

[Luong 15] Luong, T., Pham, H., and Manning, C. D.: Effective Approaches to Attention-based Neural Machine Translation, in Proceedings of the 2015 Conference on Empirical Methods in Natural Language Processing, pp. 1412–1421, Lisbon, Portugal (2015), Association for Computational Linguistics