エンジニアのひとりごと

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

会社員になって一年がたとうとしている

久しぶりにブログを更新する。

エンジニアとして社会人デビューしてもう一年がたとうとしているので、一年で得た学び、感想などを記そうかと思った次第です。

会社について

過去の記事を見ればわかるように、量子コンピュータとか機械学習に興味があった大学院生だったわけですが

入った会社はWeb系の会社(その他にもいろいろやってるが、Webアプリの受託が多いイメージ)

当時内定は他に2社あって、金融系の情報ベンダーと、科学技術系のソフトウェアを開発するようなところがありましたが

給料と、技術的に成長できそうなところはここかなーというところで、今の会社に決めました。

入社後

nヶ月の研修で最低限のビジネスマナー、GitHubの使い方、アンドロイドアプリ作成のチュートリアル機械学習チュートリアル、サーバー/フロントのチュートリアルで何かwebアプリを作る

... etc といったことをしました。

研修中に触った言語はKotlin, C++, Python, JavaScript, ... とたくさんの言語にさわれて楽しかったです。

研修後に自分が配属されたのは、Webアプリの受託開発をメインに行う部署でした。

要件定義がされているくらいのタイミングでプロジェクトに参入し、メンターの元、API設計や実装、バグ改修など主にサーバーサイドの開発をやりました。

なかなか大変な印象でしたが、技術的なことはもちろんチームとしてのプロジェクトの進め方など、学ぶことは多かったです。

プロジェクトではAWS を使いました。AWSを触るのもはじめてだったので、最近のクラウドサービスはすごいなと感心しました。

そんなこんなで、一年がたとうとしています。

社会人一年目は右も左もわからず、先輩に言われた仕事をこなしていましたが、二年目はプロジェクトの進行フローの改善とか生産性向上のためのアイデアとか、一歩メタ的なところに気付けるようになりたいなと思ってます。

あと、同期に謎に博士号持ちが多いんだけど、博士行った人優秀なんだよな。やっぱり博士で疑問を持つこととか考えることの訓練を三年くらい多くやってるのは違うんだなと思う今日この頃。

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),,,,[西]加藤敬二,前田晋二,

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

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