大学院生のひとりごと

興味あること:機械学習,量子コンピュータ,たまに競馬

PythonでMySQLを操作

レース結果のデータを取るスクレイパーは完成して,10年分のデータ取ってみた
次はお馬さんのデータ(血統,性別,生年月日,など)を取ってこよう

netkeiba.comの馬のページのurlは http://db.netkeiba.com/horse/<馬固有の数字>/
になっていて,取ってきたデータのレース結果のテーブルのhorse_idカラムに馬固有の数字のデータがあるので
そのデータをMySQLから取ってくればurlはわかる

さて,MySQLにデータを入れるのはやったが,取り出すのはやったことがない.
まあ,やることは大して変わりがなくて以下の感じだ.

まずはレース結果のテーブルからhorse_idを取ってくる

conn = pymysql.connect(host='127.0.0.1', unix_socket='/tmp/mysql.sock',
                       user='root',passwd=????,db='mysql',charset='utf8')
try:
    with conn.cursor() as cur:
        cur.execute("USE keiba_db")
        sql = "SELECT horse_id from record" 
        cur.execute(sql)
        horse_id = cur.fetchall()
finally:
    conn.close()

するとhorse_idにタプルとして取得できる.

量子コンピュータ/イジングマシン周りの話

なんか最近,というか去年ごろからD-WAVEとかイジングモデルとかいう言葉が世間に出てきた

その辺のことは少し知っているので,ちょっと書いておこうかと思う

量子コンピュータは大きく分けて2種類に分けられる

最近話題になってるD-WAVEは量子アニーリング方式と呼ばれるものだ

量子アニーリング方式っていうのは量子アニーリング(QA:Quantum Annealing)というものを使って組合せ最適解を探すものである.
量子アニーリングっていうのは量子効果を使って局所最適解を脱してグローバルな最適解を見つける手法である.
ちなみにこの量子アニーリングを提案した人は東工大の西森先生らしい*1
実際にこれを使って量子コンピュータD-WAVEを作ったのはカナダの会社である.日本にも頑張ってほしいものだ.
量子コンピュータ界隈でいうと,東大の古澤先生もいるよね,彼は光を使った量子コンピュータの原理を研究しているのだっけか? 古澤先生もカナダでベンチャー起こして量子コンピュータ作ってるとか聞いたような聞かないような

-閑話休題-

古典の世界で似たような手法として,シミュレーテッドアニーリング(SA:Simulated Annealing)なる手法がある.
SAは日本語だと焼きなまし法とか言われる.SAは熱揺らぎを使って局所最適解を脱して最適解を見つける手法である.
とてもざっくりとした説明だが,アニーリングの説明をしたいわけではないのでこの辺で.

で,D-WAVEなどで最適解を見つけようとするわけだがコスト関数はイジングモデルで定式化される必要がある
イジングモデルっていうのは以下の式だと思ってくれればok

\mathcal{H}=-\sum_{\langle i,j\rangle}J_{ij}\sigma_i\sigma_j-\sum_{i}h_i\sigma_i
D-WAVEとかを使いたかったら,解きたい問題をこのイジングモデルで表現する必要があるわけですね.
それがまた問題で組合せ最適化問題はだいたいイジングモデルで表現できるそうなのだが,一般的な方法は知られていなく (というかおそらく一般的な方法はない?)ので,問題ごとにイジングモデルでの表現を考える必要がある.

巡回セールスマン問題やSATなど,すでにイジングモデルでの表現が与えられているものも存在するが,与えられていないものも数多く存在する.
その辺りが応用的にはやるべき仕事な訳です.
と言いつつも,現状ではD-WAVEも2000程度しかqubitないわけで,しかも,実際には2000qubit全て使えるわけではないし
実用的に使えるの?と聞かれるとまだまだかなぁという感想
まだまだ発展途上のものだからこれからに期待しつつ,それとは別にゲート方式の動向も気になるなぁ

*1:T. Kadowaki and H. Nishimori., “Quantum annealing in the transverse Ising model, ” Phys. Rev. E 58, 5355 (1998).

MySQL備忘録(カラムを変数で指定したい)

カラム名を変数で指定したいと思ったのでこんなことを書いてやってみた

cur.execute("UPDATE race SET %s=\"%s\", %s=\"%s\", %s=\"%s\" WHERE race_id=\"%s\"",(string[x]+str(i+1),data[x][3*i],string[x]+str(i+1)+"_pay",data[x][3*i+1],string[x]+str(i+1)+"_nin",data[x][3*i+2],race_id))

そしたら,エラーはいたので,調べたら先にsql文を生成してからやるとうまくいくらしい

sql="UPDATE race SET %s=\"%s\", %s=\"%s\", %s=\"%s\" WHERE race_id=\"%s\""%(string[x]+str(i+1),data[x][3*i],string[x]+str(i+1)+"_pay",data[x][3*i+1],string[x]+str(i+1)+"_nin",data[x][3*i+2],race_id)
cur.execute(sql)

これでできた

ちなみに,なんかいじってたらこんなのでもエラー吐かないでいけた

cur.execute("UPDATE race SET %s=\"%s\", %s=\"%s\", %s=\"%s\" WHERE race_id=\"%s\""%(string[x]+str(i+1),data[x][3*i],string[x]+str(i+1)+"_pay",data[x][3*i+1],string[x]+str(i+1)+"_nin",data[x][3*i+2],race_id))

Learning Active Learning from Data

Learning Active Learning from Data

・どんな論文
Active Learning(AL)に対してデータ・ドリブンな新しいアプローチを提案
クエリの選択を回帰問題として定式化した

・先行研究に比べて良いところ
以下の二つの先行研究の欠点を改善している.
 *既にある人の手で設計されたヒューリスティックな方法の組み合わせを超えることができないこと
 *ラベル付けされているデータの不足からくる自信のない分類の性能についての信頼できる調査が必要であること

・手法の肝
 回帰モデルで定式化するのだが,使う特徴量はシンプルなものなので,この論文では人工データに対して
実験したけど,他のデータ群に対しても流用できそうな感じ.

・今後の課題は?
 多クラス分類やbatch-mode ALの問題への取り組み.
 転移学習みたいなことをしたい
 強化学習の利用
 などが挙げられていた

・感想
Active Learningというものを初めて知った.
ざっくりいうと
ラベル付けされてないデータがあったときに
ラベル付けがないデータのどれをラベル付けしたら
効率よく精度よくクラスタリングできるのかということを考えて
効果的なデータにラベル付けをしよう
というようなものらしい

まあ,全てのデータにラベル付けされてるわけでないし,
ラベル付けのコストなかなかやばそうだし
ALみたいな発想はあって当然だなぁーと

ざっくりとabst,intro,related work,conclusionしか読んでないので
手法の細かいところは追えてないですが...今日のところはこの辺で

MySQL

MySQLのインストールから最初の起動,動作確認の覚え書き.(mac)

インストール

$ brew update
$ brew install mysql

でインストール終わり.

とりあえず動かしてみる.

$ mysql.server start
Starting MySQL
.. SUCCESS! 
$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.20 Homebrew

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

動いた!

抜ける時はexitで抜けられる.

スクレイピングお勉強日記3

ちょっと最近忙しくて,スクレイピング周りの勉強する暇がなかったのでしばらくぶりになってしまった.

netkeiba.comの一つのページから着順とかその他諸々の情報を引っ張ってきてcsv形式で書き出すものを作った

とりあえず2017年の宝塚記念のデータを引っ張ってみた.

このページ

db.netkeiba.com

の表からデータを引っ張るプログラム

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://db.netkeiba.com/race/201709030811/")
bsObj = BeautifulSoup(html,"lxml")

table = bsObj.findAll("table",{"class":"race_table_01 nk_tb_common"})[0]
rows = table.findAll("tr")

csvFile = open("../files/takarazuka2017.csv",'wt',newline='',encoding='utf-8')
writer = csv.writer(csvFile)
try:
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td','th']):
            csvRow.append(cell.get_text())
            
        #改行コードが入ってたから改行を消す
        for x in range(len(csvRow)):
            csvRow[x]=csvRow[x].replace('\n','')
            
        writer.writerow(csvRow)
finally:csvFile.close()

で結果がこちら

着順,枠番,馬番,馬名,性齢,斤量,騎手,タイム,着差,タイム指数,通過,上り,単勝,人気,馬体重,調教タイム,厩舎コメント,備考,調教師,馬主,賞金(万円)
1,8,11,サトノクラウン,牡5,58,M.デム,2:11.4,,**,7-6-6-6,35.4,9.0,3,488(+10),,,,[東]堀宣行,里見治,"15,231.0"
2,2,2,ゴールドアクター,牡6,58,横山典弘,2:11.5,3/4,**,6-6-6-9,35.4,12.7,5,488(-6),,,,[東]中川公成,居城寿与,"6,066.0"
3,7,8,ミッキークイーン,牝5,56,浜中俊,2:11.7,1.1/2,**,9-9-9-9,35.5,10.4,4,448(+8),,,,[西]池江泰寿,野田みづき,"3,833.0"
4,6,6,シャケトラ,牡4,58,ルメール,2:12.0,1.3/4,**,2-2-2-2,36.2,8.5,2,510(+2),,,,[西]角居勝彦,金子真人ホールディングス,"2,300.0"
5,6,7,レインボーライン,牡4,58,岩田康誠,2:12.3,1.3/4,**,10-9-10-6,36.3,23.8,7,444(+2),,,,[西]浅見秀一,三田昌宏,"1,500.0"
6,1,1,ミッキーロケット,牡4,58,和田竜二,2:12.3,アタマ,**,3-4-4-6,36.4,32.5,8,478(-2),,,,[西]音無秀孝,野田みづき,
7,3,3,スピリッツミノル,牡5,58,幸英明,2:12.6,1.3/4,**,7-6-6-5,36.7,110.5,9,506(+10),,,,[西]本田優,吉岡實,
8,5,5,シュヴァルグラン,牡5,58,福永祐一,2:12.6,ハナ,**,1-1-1-1,36.9,12.7,6,470(+2),,,,[西]友道康夫,佐々木主浩,
9,8,10,キタサンブラック,牡5,58,武豊,2:12.7,1/2,**,3-3-2-2,36.9,1.4,1,542(+6),,,,[西]清水久詞,大野商事,
10,4,4,クラリティシチー,牡6,58,松山弘平,2:12.9,1.1/4,**,3-4-4-2,37.1,188.5,11,492(-6),,,,[東]上原博之,友駿ホースクラブ,
11,7,9,ヒットザターゲット,牡9,58,川田将雅,2:13.2,1.3/4,**,10-11-11-11,36.4,167.1,10,518(+4),,,,[西]加藤敬二,前田晋二,

うん,ちゃんと抜き出せてるね.

とりあえず第一歩という感じですね.

スクレイピングお勉強日記2

これを使ってお勉強中なんだけど,本に書いてある通りに書いても正しく動かない!
p49のコードはリストの要素を区切る「カンマ」がないし,変数の名前に誤植あるし

という小言を言いながら3章まで終わって, あとはデータの格納の仕方を習得すればとりあえずのスクレイパーは作れるのかな

データを集めるまでが結構大変ですわ.

ちなみに「競馬 機械学習」で検索かけたらScalaスクレイパーgithubで公開されているのだけれど 今回は1から作りたいので,それは使わないで頑張ってPythonで作っていきたいと思う.