データサイエンティスト(仮)

元素粒子論博士。今はデータサイエンティスト(仮)。

久々にC++を触ってみたら自明なクラスしか書けない

動機

自明な言葉を発する営みを若干抽象化したい。
tekenuko.hatenablog.com

自明なクラス作成

抽象化 = オブジェクト化。
外部からの入力が自明かどうかを判定します。

// trivialclass.cpp

# include <iostream>
# include <string>

using namespace std;

// クラス
class trivial{
// 変数と関数
private:
  string str;
public:
  void judgetrivial(string str);
};

// 入力に対して自明かどうか判定する関数
void trivial::judgetrivial(string str){
  if(str == "Hello world!"){
    cout << "自明ですね" << endl;
  }
  else{
    cout << "Highly nontrivial!" << endl;
  }
}

int main(){

  trivial tv;
  string str;
  cout << "自明な言葉はなーんだ?" << endl; // 自明なクイズ
  getline(cin, str); // 外部入力
  tv.judgetrivial(str); // 関数を実行

  return 0;
}

自明な実行

trivialclassという実行ファイルを作って実行します。自明なクイズが始まるので、自明な入力をすると...

$ g++ -o trivialclass trivialclass.cpp 
$ ./trivialclass

# 出力
自明な言葉はなーんだ?  // 自明なクイズが始まる
Hello world! // コマンドラインで自明に入力する
自明ですね // 自明だったらしいです

非自明なことを言うと…

$ g++ -o trivialclass trivialclass.cpp 
$ ./trivialclass

# 出力
自明な言葉はなーんだ?  // 自明なクイズが始まる
ケーラー多様体 // コマンドラインで自明に入力する
Highly nontrivial! // 非自明だったらしいです

とりあえず自明に動きました。

所感

これだけだと関数を定義したのと大差ないですね。継承とか関数の抽象化したりするともう少し感覚が戻ってくるのかもしれません。

久々にC++を触ってみたら自明なファイルしか読めない

動機

自明な言葉を発する営みを若干非自明にしたい。
tekenuko.hatenablog.com

自明なファイルを読むコード

非自明にする方法の一つとして、あらかじめ自明な言葉を保存したファイルを用意して、それを読み込む、というものがありえます。C++でファイルを開くときはfstreamヘッダをインクルードする必要があり、この中のifstream(インプットストリーム)を使用します。自明なコード例は以下です。

// trivialfile.cpp

# include <iostream>
# include <string>
# include <fstream> // ファイルを開くときに必要

using namespace std;

int main(){

  // 読み込み
  ifstream ifs("trivial.txt");
  // 読み込みできたかを判定
  if(ifs.fail()){
    cout << "自明な読み込みに失敗しました" << endl;
  }
  else{
    string str;
    // 一行読み込み
    getline(ifs, str);
    cout << str << endl;
  }
  ifs.close(); // 勝手に閉じるのでなくても問題ない
  return 0;

}

ifs.close()は明示的に書かなくても勝手に閉じます。

自明な実行

trivialfileという実行ファイルを作って実行します。あらかじめtrivial.txtというファイルに自明な言葉を保存しとくと…

$ g++ -o trivialfile trivialfile.cpp 
$ ./trivialfile 

# 出力
Hello world! // やっぱりファイルには自明な言葉が保存されていました

となり、ちょっとだけ非自明に自明な言葉を発してくれます。

自明な所感

リハビリとはいえ非常にしょうもないことしかやってません。とはいえ自分の備忘録的にやっているので気にせず進める。

久々にC++を触ってみたら自明な入力しかできないのはくやしい

自明な振り返り

自明な出力しかできませんでした。
tekenuko.hatenablog.com

動機

くやしいので非自明なことを言いたい。

自明(?)なコード

自明なことを入力すると自明だと言われます。

// trivial.cpp

# include <iostream>
# include <string>
using namespace std;

int main(){
  string str;
  cout << "自明な言葉はなーんだ?" << endl;

  // 空白があっても一つのカタマリと認識させるのに使用
  getline(cin, str);

  if(str == "Hello world!"){
    cout << "自明ですね" << endl;
  } else{
    cout << "自明じゃないですね" << endl;
  }

  return 0;
}

自明な実行

trivialという実行ファイルを作って実行します。自明なクイズが始まるので、自明な入力をすると...

$ g++ -o trivial trivial.cpp 
$ ./trivial

# 出力
自明な言葉はなーんだ?  //自明なクイズが始まる
Hello world! // コマンドラインで自明に入力する
自明ですね //自明だったらしいです

非自明なことをいう

とりあえず非自明なことを言ってみます。

$ g++ -o trivial trivial.cpp 
$ ./trivial

# 出力
自明な言葉はなーんだ?  //自明なクイズが始まる
ほとんどいたるところ連続 // コマンドラインで入力する
自明じゃないですね //自明じゃなかったらしいです

非自明だったようです。よかったです。

久々にC++を触ってみたら自明なことしかできない

自明な背景

3年ぶりくらいにC++触ってみたら自明なことしかできなかったので、自明なことをしたメモをします。

自明なコード

実行すると自明な言葉を発します。

// helloworld.cpp

#include <iostream>
using namespace std;

int main(){
  cout << "Hello world!" << endl;
  return 0;
}

自明な実行

自分はコマンドライン上でコンパイルして実行するという自明なことしかできない。helloworidという実行ファイルを使って実行するという自明な営みをすると自明なことをします。

$ g++ -o helloworld helloworld.cpp 
$ ./helloworld 

# 出力
Hello world!

自明なNext Step

今の自分のC++力は自明なコードを書けるレベルとホモトピー同値です。
修行します。

Pythonでデータ分析:機械学習の自動化

導入

何か問題を解決するにあたって機械学習を活用する場合、膨大なアルゴリズム、そのアルゴリズムに付随する多くのハイパーパラメータが存在します。分析の要件が「とにかく精度、中身は問わない」だった場合、何とかして効率的にモデルとパラメータを知りたい、という状況が起こりえます*1

そのような要件をサポートしてくれるPythonのライブラリに、auto-sklearnというものがあります。
github.com

これは、大雑把にいうと、与えられたデータを見て、scikit-learnの中から

  • 良さそうな前処理の選定
  • 良さそうなアルゴリズムの選定
  • 良さそうなハイパーパラメータの選定

を行い、これらのアンサンブルを取る、といったことをします。

f:id:tekenuko:20161002143359p:plain
まず、Meta Learningという、データの数、種類などから、どの手法がどのデータに向いているかをモデル化し、ベイズ的最適化により最適な組み合わせを探る、そしてアンサンブルをとる、という流れです。より詳しくは、以下の論文をご参照ください。
What is auto-sklearn? — AutoSklearn 0.0.2 documentation

インストール

pip経由でインストールします。まずは、auto-sklearnを使うために必要なライブラリをインストール後、auto-sklearnをインストールします。

pip install -r https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt
pip install auto-sklearn

注意

auto-sklearnはUbuntuで開発されたらしく、Linuxでは動作するがMacやWindowでは動かないかもしれない、とのこと。実際、自分の環境(MacOS)で最初はうまくいきませんでした。自分の場合は、gccのバージョンが古い(4.8以前)ことが原因だったようで、バージョンを4.8以降にしたら導入できました。

コードを試したいときは

例えば、auto-sklearnのページにコード例があります。これをJupyter notebookか何かにコピーして動かしてみると良いかと思います*2
What is auto-sklearn? — AutoSklearn 0.0.2 documentation

注意

やんちゃに動かすと大量のログを吐きながら膨大な計算をします*3。少ないデータ量でも2〜3時間はかかります。オプションでモデル探索の時間などをいじれるので、すぐに結果を見たいならオプションの指定を適切に行ったほうが良いでしょう。
APIs — AutoSklearn 0.0.2 documentation

所感

ローカルPCで動かすには、やっていることと処理時間の両方の観点でオーバースペック気味かなという感想です。使いどころとしては、ハイスペックな分析環境があり、かつどうしても精度がほしいといった場合かなと思います。

*1:個人としてはこういった中身の理解が介在しないことはしたくないですが、そういう要件の場合もありますので仕方ない。

*2:何かデモを載せようかと思いましたが、注意に書いた状況のためやめにしました(汗)。

*3:今もPCがものすごいうなりながら計算してます(汗)。