Shogunプログラミング

概要
Shogun は C++ で実装された機械学習ライブラリ.
参考
RoboticsText:Shogun
目次

補助プログラム Supplementary programs

ファイルからのデータの読み込み Load data from a file

下記プログラムを用いると便利 (filedataloader1.1.h):

#include <fstream>
#include <list>
#include <sstream>
#include <cassert>
#include <shogun/lib/DataType.h>

static void load_data_from_file(const char filename[], std::list<std::list<double> > &scaned, int max_sample)
{
  using namespace std;
  ifstream ifs(filename);
  string line;
  int r(0);
  double value;
  while(getline(ifs,line,'\n'))
  {
    if(line=="") continue;
    scaned.push_back(std::list<double>());
    stringstream ss(line);
    while(ss>>value)
      scaned.back().push_back(value);
    ++r;
    if(max_sample>0 && r>=max_sample)  break;
  }
}

// load matrix from file
shogun::SGMatrix<float64_t> LoadMatFromFile(const char filename[], int &num, int &dim, int max_sample=-1)
{
  using namespace std;
  list<list<double> > scaned;
  load_data_from_file(filename, scaned, max_sample);
  num= scaned.size();
  dim= scaned.front().size();

  shogun::SGMatrix<float64_t> data(dim,num);
  int r= 0;
  for (list<list<double> >::const_iterator itr(scaned.begin()),last(scaned.end()); itr!=last; ++itr,++r)
  {
    int c(0);
    for (list<double>::const_iterator ditr(itr->begin()),dlast(itr->end()); ditr!=dlast; ++ditr,++c)
      data[r*dim+c]= *ditr;
  }
  return data;
}

// load vector from file (col-th column is loaded)
shogun::SGVector<float64_t> LoadVecFromFile(const char filename[], int &num, int &dim, int col=0, int max_sample=-1)
{
  using namespace std;
  list<list<double> > scaned;
  load_data_from_file(filename, scaned, max_sample);
  assert(col<(int)scaned.front().size());
  num= scaned.size();
  dim= 1;

  shogun::SGVector<float64_t> data(num);
  int r= 0;
  for (list<list<double> >::const_iterator itr(scaned.begin()),last(scaned.end()); itr!=last; ++itr,++r)
  {
    list<double>::const_iterator ditr(itr->begin());
    for (int c(0); c<col; ++c) ++ditr;
    data[r]= *ditr;
  }
  return data;
}

バージョンが0.9の場合は filedataloader.h を用いる.

dataloader1.1.h の使い方:

shogun::SGMatrix<float64_t> LoadMatFromFile(const char filename[], int &num, int &dim, int max_sample=-1)
shogun::SGVector<float64_t> LoadVecFromFile(const char filename[], int &num, int &dim, int col=0, int max_sample=-1)
  • filename : ファイル名. File name.
  • num : 読み込んだサンプル数が書き込まれる. Number of loaded samples is stored.
  • dim : 読み込んだサンプルの次元数が書き込まれる. Number of dimensions of each loaded sample is stored.
  • col : 特定の列を読み込む場合に指定する.
  • max_sample: 読み込む最大行数を指定.-1 だとすべて読み込む. Use this option to specify the maximum number of rows (samples). In order to load whole rows, specify -1.
  • 戻り値: 読み込んだベクトル・行列.

dataloader.h の使い方:

void LoadDataFromFile(const char filename[], double* (&data), int &num, int &dim, int col=-1, int max_sample=-1)
  • filename : ファイル名. File name.
  • data : 読み込んだデータが保存される.メモリは自動確保される. Loaded data is stored. Its memory is automatically allocated.
  • num : 読み込んだサンプル数が書き込まれる. Number of loaded samples is stored.
  • dim : 読み込んだサンプルの次元数が書き込まれる. Number of dimensions of each loaded sample is stored.
  • col : 特定の列を読み込む場合に指定する.-1 だとすべて読み込む. Use this option to load a specific column of the data. In order to load whole columns, specify -1.
  • max_sample: 読み込む最大行数を指定.-1 だとすべて読み込む. Use this option to specify the maximum number of rows (samples). In order to load whole rows, specify -1.

(A) 基礎編 Basic Level

(1) 回帰 Regression

回帰(1) Regression(1)

与えられた入出力データ(file入力-2次元連続値file出力-1次元連続値)を学習し,回帰モデルを作れ.作ったモデルを可視化し,どのようにモデルが学習されたか調べよ.

Create and train a regression model with the given I/O data (fileinput-2D,continuous values, fileoutput-1D,continuous values). Then, visualize the trained model to check how the model was trained.

[ 補足 Notes ]

  • 可視化には Gnuplot を利用するとよい.
    You can use Gnuplot for visualization.
  • 3次元プロットには splot コマンドを用いる.
    Use splot command to plot 3D data.
  • input1.dat と output1.dat をまとめてひとつのデータにし,プロットするには:
    To plot a data in which input1.dat and output1.dat are combined:
splot "< paste input1.dat output1.dat" , "./out-r1.dat" w l

以下のような結果が得られればOK.

ex1.1.png

この結果は,

set view 45,300,1,1.2
set ticslevel 0
splot "in.dat", "out.dat" w l

のようにしてプロットした.

回帰(2) Regression(2)

入力が2次元,出力が2次元のデータ(file入力-2次元連続値file出力-2次元連続値)に対して回帰モデルを作り,可視化して検証せよ.

Create and train a regression model of the 2-dimensional input and the 2-dimensional output (fileinput-2D,continuous values, fileoutput-2D,continuous values), and visualize it for the verification.

[ 補足 Notes ]

  • 可視化には Gnuplot を利用するとよい.
    You can use Gnuplot for visualization.

出力の1次元目をグラフ化する際には

splot "< paste input2.dat output2.dat" , ...

出力の2次元目をグラフ化する際には

splot "< paste input2.dat output2.dat" using 1:2:4, ...

といった感じに書く。

以下のような結果が得られればOK.

ex1.2-1.png
出力の1次元目.
ex1.2-2.png
出力の2次元目.

(2) 分類 Classification

分類(1) Classification(1)

与えられた入出力データ(file入力-2次元連続値file出力-1次元離散値{-1,1})を学習し,2クラス分類器を作れ.作った分類器を可視化し,どのようにモデルが学習されたか調べよ.

Create and train a two-class classifier with the given I/O data (fileinput-2D,continuous values, fileoutput-1D,discrete values{-1,1}). Then, visualize the trained classifier to check how the model was trained.

[ 補足 Notes ]

  • 可視化には Gnuplot を利用するとよい.
    You can use Gnuplot for visualization.

以下のような結果が得られればOK.

ex1.3.png

分類(2) Classification(2)

与えられたデータ(file入力-2次元連続値)を使って1クラス分類器を学習し,自分でテストデータを作成して学習したモデルを検証せよ.

Create and train a one-class classifier with the given data (fileinput-2D,continuous values), and verify the trained model by using a test data generated by yourself.

[ 補足 Notes ]

  • 可視化には Gnuplot を利用するとよい.
    You can use Gnuplot for visualization.

以下のような結果が得られればOK.

ex1.4.png

(3) クラスタリング Clustering

与えられたデータ(file入力-2次元連続値)をクラスタリングせよ.

Apply a clustering method to the given data (fileinput-2D,continuous values).

[ 補足 Notes ]

  • 可視化には Gnuplot を利用するとよい.
    You can use Gnuplot for visualization.

以下のような結果が得られればOK.

ex1.5.png

(B) 応用編 Advanced Level

(1) 色のクラスタリング Clustering the colors

適当な画像を読み込み,R,G,Bの輝度値を特徴ベクトルだとみなしてすべての画素をクラスタリングし,画像を減色せよ.

Load a image, clustering the whole points by assuming the R,G,B value as a feature vector, and subtract the number of the colors of the image.

レナの画像(Lenna_s.jpg)を8色に減色すると以下のような結果が得られる。

ex1.6.jpg

(2) ロボットアームの順運動学を学習 Learning forward kinematics of robot arm

ロボットアームRM3の順運動学を回帰モデルで学習せよ.手先位置の推定のみでよい.q1=0 に固定して q2, q3 のみを動かすバージョン(2自由度)と,q1, q2, q3 すべてを動かすバージョン(3自由度)を作成せよ.

Create a regression model of the forward kinematics of the Robot Arm RM3. Estimation of the position of the end effector is required. Implement two versions; one is the case of fixed q1=0 and arbitrarily moving q2 and q3 (i.e. 2-DoF), and the other is the case of arbitrarily moving all joints q1, q2 and q3 (i.e. 3-DoF).

[ 補足 Notes ]

  • 適当な関節角軌道を与えてロボットを動かし,推定した位置にボックスを描画し,推定結果を検証せよ.
    Verify the estimation result by moving the robot with a joint-angle trajectory and drawing a box at the predicted position.
dReal sides[3]={0.3,0.3,0.3};
dVector3 pos;
pos[0]= ESTIMATED X
pos[1]= ESTIMATED Y
pos[2]= ESTIMATED Z
dMatrix3 rot={1,0,0,0, 0,1,0,0, 0,0,1,0};
dsSetColorAlpha (0.0, 0.0, 1.0, 0.5);  // arbitrary
dsDrawBox (pos, rot, sides);
  • ヒント:データを生成するプログラムと,学習し結果をテストするプログラムを分けるとよい.
    Hint: Better programming is to separate the program into a program to generate data for learning, and a program to learn the forward kinematics and test it.
  • ノート:一般的には学習するプログラムと結果をテストするプログラムを分けた方が使いやすいが,今回は学習時間が短いので同じプログラムでよい.
    Note: In general, it is useful to separate the learning program and the testing program. However, in this exercise, we can implement these functions in the same program since the learning time is short.
  • 学習に使うデータ(軌道やサンプル数)を変えてみて,学習結果がどう変化するか調べること.
    Investigate how the learning result changes if we change the data for training (a trajectory or a number of samples).

(3) ロボットアームの逆運動学を学習 Learning inverse kinematics of robot arm

ロボットアームRM3の逆運動学を回帰モデルで学習せよ.エンドエフェクタは手先位置のみ考慮すればよい.q1=0 に固定して q2, q3 のみを動かすバージョン(2自由度)と,q1, q2, q3 すべてを動かすバージョン(3自由度)を作成せよ.

Create a regression model of the inverse kinematics of the Robot Arm RM3. Consider only the position of the end effector. Implement two versions; one is the case of fixed q1=0 and arbitrarily moving q2 and q3 (i.e. 2-DoF), and the other is the case of arbitrarily moving all joints q1, q2 and q3 (i.e. 3-DoF).

[ 補足 Notes ]

(4) ロボットアームの逆運動学が可解かを学習 Learning solvability of inverse kinematics of robot arm

ロボットアームRM3の逆運動学が可解かどうかを判別できる1クラス分類器を作れ.つまり,手先位置を入力したとき,逆運動学の解が存在するか否かを返すプログラムを作成せよ.q1=0 に固定して q2, q3 のみを動かすバージョン(2自由度)と,q1, q2, q3 すべてを動かすバージョン(3自由度)を作成せよ.

Create a one-class classifier that can discriminate whether the inverse kinematics of the Robot Arm RM3 is solvable. That is, make a program that returns if a solution to the inverse kinematics exists for the specified end effector position. Implement two versions; one is the case of fixed q1=0 and arbitrarily moving q2 and q3 (i.e. 2-DoF), and the other is the case of arbitrarily moving all joints q1, q2 and q3 (i.e. 3-DoF).

[ 補足 Notes ]

  • キーボードで目標点を動かし,可解なら青,そうでないなら赤のボックスで目標点を可視化すると,学習結果が検証しやすい.
    In order to verify the learning result easily, move the target position by a keyboard, then draw a box at the position with blue or red color according to the solvability of the position.

(5) ロボットフィンガによる投球の学習 Learning throwing of robot finger

ロボットフィンガRF1の関節角軌道とボールの軌道の関係を回帰モデルで学習して,任意の位置にボールを投げられるプログラムを作れ.

Implement a program that enables the Robot Finger RF1 to throw a ball to an arbitrary position by learning the relation between its joint angle trajectory and the ball trajectory as a regression model.

[ 補足 Notes ]

  • 「X軸上の任意の位置」でも構わない.これなら,以下のようにすぐできる.
    This text is replaced by the Flash movie.

(6) ロボットフィンガによる投球の学習(実機) Learning throwing of robot finger (actual robot)

実機の Bioloid (1関節) の関節角軌道とボールの軌道の関係を回帰モデルで学習して,任意の位置にボールを投げられるプログラムを作れ.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-10-25 (日) 18:38:50 (996d)