大学院生のひとりごと

趣味は機械学習とスマホゲームと競馬

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で作っていきたいと思う.

gslで特異値分解してみた

特異値分解を使うことになったからとりあえずライブラリで特異値分解を実行してみた.

 

gslには特異値分解を行う

 int gsl_linalg_SV_decomp (gsl_matrix * A, gsl_matrix * V, gsl_vector * S, gsl_vector * work)

 

という関数が用意されている.

この関数は

A=USV^Tと分解する関数で,引数で与えられるAは計算で得られるUで置き換えられるようにできているみたい

とりあえず特異値分解するソースコードはこんな感じ

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_linalg.h>

void my_gsl_matrix_print(const gsl_matrix *matrix, int n, int m);//行列を行列の形で出力

int main (void)
{
  //int n ;
  double a_data[4][3] = { {1.00, 1.00, 0.00},
              {1.00, 1.00, 1.00},
              {0.00, 1.00, 1.00},
              {0.00, 1.00, 1.00}} ;
  int n=4,m=3;
  int i,j;
  double vec[n*m];
  for(i=0;i<n;i++){
    for(j=0;j<m;j++){
      vec[i*m+j]=a_data[i][j];
    }
  }
  gsl_matrix_view A = gsl_matrix_view_array (vec, n, m);
  printf("\n") ;
  gsl_matrix *V = gsl_matrix_alloc (m,m);
  gsl_vector *S = gsl_vector_alloc (m);
  gsl_vector *work = gsl_vector_alloc (m);
  gsl_matrix *S_matrix = gsl_matrix_alloc(m,m);
  gsl_matrix *temp = gsl_matrix_alloc(n,m);
  gsl_matrix *ans = gsl_matrix_alloc(n,m);
  printf("A is\n");
  my_gsl_matrix_print(&A.matrix,n,m);
  
  //  int gsl_linalg_SV_decomp (gsl_matrix * A, gsl_matrix * V, gsl_vector * S, gsl_vector * work)
  gsl_linalg_SV_decomp (&A.matrix, V, S, work) ;//特異値分解
  
  for(i=0;i<m;i++){
    gsl_matrix_set(S_matrix,i,i,gsl_vector_get(S,i));//ベクトルSを行列S_matrixに
  }
  
  printf("U is\n");
  my_gsl_matrix_print(&A.matrix,n,m);
  printf("S is\n");
  my_gsl_matrix_print(S_matrix,m,m);
  printf("V is\n") ;
  my_gsl_matrix_print(V,m,m);
  printf("\n") ;
  
  gsl_matrix_transpose(V);//Vを転置
  
  /*分解したものをかけて確認*/
  gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, &A.matrix, S_matrix, 0.0, temp);
  gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, temp,V, 0.0, ans);
  my_gsl_matrix_print(ans,n,m);
  return 0;
}

void my_gsl_matrix_print(const gsl_matrix *matrix, int n, int m){
  int i,j;
  for(i=0;i<n;i++){
    for(j=0;j<m;j++){
      printf("%15g",gsl_matrix_get(matrix,i,j));
    }
    printf("\n");
  }
}

実行結果はこんな感じ

 A is
          1              1              0
          1              1              1
          0              1              1
          0              1              1 
 U is
  -0.403846       0.725356      -0.557464
  -0.615815       0.235084       0.752002
  -0.478373       -0.45749      -0.248723
  -0.478373       -0.45749      -0.248723
 S is
    2.72375              0              0
          0        1.17761              0
          0              0       0.440905
 V is
  -0.374359       0.815583       0.441225
  -0.725619      0.0386051      -0.687013
   -0.57735       -0.57735        0.57735

          1              1   -8.88178e-16
          1              1              1
-5.41234e-16              1              1
-4.44089e-16              1              1

まあ,とりあえず特異値分解できてるっぽい

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

PythonによるWebスクレイピング」でスクレイピングを勉強中である.

とりあえず本通りにコード書いて実行して見たらこんなwarningがでてきた,

 

 

__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or

in a different virtual environment, it may use a different parser and behave differently. 

 

まあ読んでみると

parserが指定されてないからとりあえず"lxml"にしといたよ.だいたい問題はないけど違う環境で動かしたら振る舞いが変わるかもよ

みたいなことが書いてあった.

まずparserだかlxmlってなんだ?

調べて見た.

parserとは構文解析するやつらしい.なるほど.

構文解析ツールがいくつかあってそれをbs4では指定できるけどしてねえぞ

って怒られてたわけですね. 

 それでlxmlはその一つというわけですか.

ということで

bsObj = BeautifulSoup(html.read(),"lxml")

赤文字部分を追加したらwarningは出なくなりました. 

 

#調べた後で気づいたけど,本の注意書きのところにちゃんと書いてあった

機械学習で競馬予想したい

僕は大学院で機械学習周りを勉強したり研究したりしている.

 

ふと思った,機械学習で競馬予想して見たいと.

 

思ったのは結構前だけど,そろそろ取り組み始めようと思う.

 

決意表明しないといつまでもやらなさそうなので,ここで決意表明しておこう.

 

文献調査してどの手法が良さそうか検討して,スクレイピングでwebからデータ取ってきて,実際に機械学習で予測.

 

まずは文献調査と,スクレイピングとかやったことないのでスクレイピングの勉強も同時進行でやっていこうと思ふ.