久々にC++を触ってみたら自明なクラスしか書けない
自明なクラス作成
抽象化 = オブジェクト化。
外部からの入力が自明かどうかを判定します。
// 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; }
Pythonでデータ分析:機械学習の自動化
導入
何か問題を解決するにあたって機械学習を活用する場合、膨大なアルゴリズム、そのアルゴリズムに付随する多くのハイパーパラメータが存在します。分析の要件が「とにかく精度、中身は問わない」だった場合、何とかして効率的にモデルとパラメータを知りたい、という状況が起こりえます*1。
そのような要件をサポートしてくれるPythonのライブラリに、auto-sklearnというものがあります。
github.com
これは、大雑把にいうと、与えられたデータを見て、scikit-learnの中から
- 良さそうな前処理の選定
- 良さそうなアルゴリズムの選定
- 良さそうなハイパーパラメータの選定
を行い、これらのアンサンブルを取る、といったことをします。
まず、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のページにコード例があります。これをJupyter notebookか何かにコピーして動かしてみると良いかと思います*2。
What is auto-sklearn? — AutoSklearn 0.0.2 documentation
注意
やんちゃに動かすと大量のログを吐きながら膨大な計算をします*3。少ないデータ量でも2〜3時間はかかります。オプションでモデル探索の時間などをいじれるので、すぐに結果を見たいならオプションの指定を適切に行ったほうが良いでしょう。
APIs — AutoSklearn 0.0.2 documentation
所感
ローカルPCで動かすには、やっていることと処理時間の両方の観点でオーバースペック気味かなという感想です。使いどころとしては、ハイスペックな分析環境があり、かつどうしても精度がほしいといった場合かなと思います。