ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2016/12/14

MLP1

Machine Learning Programming。
Pythonの機械学習の本を買ってみました。
一日1章くらいのペースで読めるといいな。


Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)
Sebastian Raschka
インプレス (2016-06-30)
売り上げランキング: 6,539



以下は(主に自分用の)メモ。

■三種類の機械学習
・教師あり学習
・教師なし学習
・強化学習

■教師あり学習
・トレーニングデータ
・クラスラベル
・分類
  離散値(クラスラベル)を予測する
  二値分類 - メールのスパム判定
  多クラス分類 - 手書き文字認識
・回帰
  連続値を予測する。回帰分析とも呼ばれる
  予測変数 応答変数 説明変数 結果変数

■強化学習
・教師あり学習に分類
・環境とのやりとりに基づいて性能を改善するシステム (=エージェント)
・報酬 - 行動の出来具合を数値化したもの
例) チェスエンジン - 報酬はゲームの「勝ち」「負け」として定義

■教師なし学習
・クラスタリング
・次元削減


■機械学習システムを構築するためのロードマップ
・前処理
  データ整形
    トレーニングデータセット
    テストデータセット
・学習
  トレーニングセットに適合する予測モデルの選択
    複数のアルゴリズムを比較するが、その指標をまず決定 => 正解率(正しく分類されてるインスタンスの割合)など
    モデルの汎化性能(未知のデータにも対応できる能力)の推定 => 交差検証
    ハイパーパラメータ(機械学習のアルゴリズムのパラメータのうち、学習前に値を決定しなければならないもの)最適化
・評価
  モデルの評価
    テストデータセットに適用し、汎化誤差(学習時に使用しなかったデータに対する予測値と正解の差)を評価
・予測
  モデルの性能に納得がいけば、そのモデルを適用することで未知のデータの予測


2016/05/06

機械学習入門

機械学習をちょっとお勉強し始めた。
囲碁プログラムのAlphaGoがトッププロに勝った、みたいな話もあったりで、
最近ディープラーニングとかホットですしね。
一応プログラマなので、多少なりとも知っておきたいと思い。

「ITエンジニアのための機械学習理論入門」
という本を手始めに読んだんですけど、
機械学習の基本の考え方やアルゴリズムが
わかりやすく噛み砕いて書かれていて、よかったです。

いやしかし、最近数式に触れてなかったせいでその辺の耐性がなく、
数式が並んでるところはあまり読解しないでサーッと流しちゃいました…。
まぁそんな感じで読んでも大枠言ってることはわかるし、
後でまたプログラムも含めてじっくり読もうかな、と思える本でしたー。


ITエンジニアのための機械学習理論入門
中井 悦司
技術評論社
売り上げランキング: 4,422

2011/05/30

vectorの要素数上限とか

作ってるゲームとは関係ないのだけど、
色情報と三次元座標情報を持つたくさんの点を管理する、
というプログラムが必要になったのです。

そこで最近C++のSTLを色々調べていたところなので、
その(個人的)ブームに乗ってSTLのvectorを使ってみたらどうかなーと思ってたところ…。

vectorは要素数が数万くらいになるとデータ構造がぶっ壊れる

みたいな話を聞いて、
うわーマジか数十万は点データ突っ込む予定なのに…と思いつつ
ちょっと本当なのか検証してみました。

以下はそのときのソースコードです。
新しく導入したSyntaxHighlighterを試す意味でも。
#include 
#include 
#include 

using namespace std;

// 点データ(RGBA, 三次元座標)
struct DATA {
 unsigned char r;
 unsigned char g;
 unsigned char b;
 unsigned char a;
 float x;
 float y;
 float z;

 DATA(unsigned char _r, unsigned char _g, unsigned char _b, unsigned char _a,
  float _x, float _y, float _z) 
  : r(_r), g(_g), b(_b), a(_a), x(_x), y(_y), z(_z)
 {}
};


// メイン
int main( int argc, char **argv ) {
 // リスト作成
 vector dataList;
 dataList.reserve(1000000);

 // 処理時間計測用
 LARGE_INTEGER nFreq, nBefore, nAfter;
 memset(&nFreq,   0x00, sizeof nFreq);
 memset(&nBefore, 0x00, sizeof nBefore);
 memset(&nAfter,  0x00, sizeof nAfter);
 DWORD dwTime = 0;

 float countF = 0.0f;
 int count = 0;

 QueryPerformanceFrequency(&nFreq);
 QueryPerformanceCounter(&nBefore);
 while (1) {
  try {
   DATA data(0, 0, 0, 0, countF, countF, countF);
   dataList.push_back(data);  // データ追加
   count++;
   countF++;
   if (count % (640 * 480) == 0) {
    QueryPerformanceCounter(&nAfter);
    dwTime = 
     (DWORD)((nAfter.QuadPart - nBefore.QuadPart) * 1000 / nFreq.QuadPart);
    // データの入ってる要素数とメモリ確保してる要素数
    cout << "dataList.size: " << dataList.size() 
     << "  dataList.capacity: " << dataList.capacity() << endl;
    // データ追加(640 * 480 コ)にかかった時間
    cout << dwTime << "ms.\n";
    char c[2];
    cin >> c;
    if (c[0] == 'z')
     break;
    QueryPerformanceCounter(&nBefore);
   }
  }
  catch (...) {
   cout << "error!\n";
   return -1;
  }
 }

 for (size_t i = 0; i < dataList.size(); i += 1000) {
  cout << (int)dataList[i].r << ", " << (int)dataList[i].g << ", " 
   << (int)dataList[i].b << ", " << (int)dataList[i].a << endl;
  cout << dataList[i].x << ", " << dataList[i].y << ", " << dataList[i].z << endl;
 }

 dataList.clear();
 cout << "dataList.size: " << dataList.size() 
  << "  dataList.capacity: " << dataList.capacity() << endl;
 
 int n;
 cin >> n;
 
 return 0;
}
環境はCPU: 2.27GHz, メモリ4GB, Windows7, VC++2008使用。
結局これで100万個程度要素を追加してみましたが、
データが壊れるということは起こっていないっぽい…。

要素数というよりは、データの大きさが関係しているのかもしれない。
ひとつの点データは1×4+4×3=16バイト。
それが100万個だと16MBか。
メモリは4GBあるので、それを思うとたいした量ではなさそう。


あと要素の追加にどれくらい時間がかかるのかと思って、計測してみました。
処理時間計測の仕方に関しては処理時間の取得方法の記事を参考にさせていただきました。

640×480個のデータ追加の10回平均が167ms。(Debugモードで)
最初にreserveしてなかったらもっとかかる。
メモリcapacityの拡大も一緒だと300msくらいだった。

ついでに同じことをvectorの代わりに配列を使ってやると約14msでやってくれた。
うむーやっぱり早さでは配列が勝るのか…。


結局わかったことは、

・要素数数万でvectorが壊れるということはなさそう(データの大きさによるとは思うが)
・要素数の上限がわかってるなら配列を使ったほうが良い。早い。

ですかなー。
ちなみにコンパイルをReleaseモードでやるとまたみちがえるほど早くなったのでござる。