エンジニアのひとりごと

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

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からデータ取ってきて,実際に機械学習で予測.

 

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