読者です 読者をやめる 読者になる 読者になる

PRMLを眺めた

パターン認識と機械学習 上

パターン認識と機械学習 上

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

読んだというのもおこがましい雑な読み方をしたので「眺めた」。数式も全く追ってません(キリッ)。
言い訳としては、長年積ん読書として降臨していたのでいい加減片付けたかった。

感想としては、この本手を広げすぎじゃないかというのと、文章が無用に難解じゃないかなあという感じ。知っていることの解説は雑で、知らないことの説明はこれじゃわかんねぇよ…って思った。全体を俯瞰するための教科書だとまえがきで言っているので個々の分野についてはそれぞれの専門書を当たったほうがよいと思う。あと10年前の本です。

CNN, SVMの話をしてたかと思ったらOrnstein-Uhlenbeck過程とかARMAとかMCMCとかカルマンフィルターとかviterbi復号法とか言い始めるのなんなん…

はい僕の理解力が低いだけですすいません。

でもPRMLに限らない話として、俯瞰的な用途の教科書をやたら精読する風潮はどうかなあと思う。

(自分の見解に自信がない時はフォローしてる中から評判とかtwitter検索かけるようにしてるのですが大体見解自体は正しそう)

"Learning scikit-learn: Machine Learning in Python" を読んだ

"Python for Data Analysis"を読んだ

Python for Data Analysis

Python for Data Analysis

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

タイトルだけ見るとnumpyの本なのかと思うが、作者はpandasの中の人で、ほぼほぼpandasの本。

最近ぼちぼちpandasを使ったブツを開発しているのだが、自分が全然numpyもpandasも理解していないまま使っていたという事がわかった…

pandasユーザー必読。それだけでなく、多分pandasとか使えると普通にありとあらゆるタスクに役立つはずなのでみんな読んだほうがいいっす。

「深層学習 (機械学習プロフェッショナルシリーズ)」を読んだ

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

長年よく分かってないまま、なんとなくA君やT君の話にウンウンなるほど〜〜〜とか言ってたのを大いに恥じています。

"High-Frequency Trading" by Irene Aldridgeを読んだ

High-Frequency Trading: A Practical Guide to Algorithmic Strategies and Trading Systems (Wiley Trading)

High-Frequency Trading: A Practical Guide to Algorithmic Strategies and Trading Systems (Wiley Trading)

さすがに全編ちゃんとは読めてないです…
1冊で全てをカバーするという訳ではないけれども参考文献がものすごい数しっかりと明示されているし、ここをきっかけにいろいろ調べるとっかかりがつかめて良い本だと思う。なんか米Amazonのレビューだと酷評されてるけど…
ただ如何せん読みやすい本ではないというか早足なので、個々の分野についてはそれ専門の本をしっかり読んだほうがよさそう。

「データサイエンティスト養成読本 機械学習入門編」を読んだ

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

ツールの具体例が多く挙げられており、またコードを交えた実例が多いのが良かった。

よくわかるKMP

vector<int> Build(const string& s) {
  vector<int> fail(s.size() + 1);

  int j = -1;
  fail[0] = -1;
  for (int i = 0; i < s.size(); ++i) {
    while (j >= 0 && s[i] != s[j]) j = fail[j];
    ++j;
    fail[i + 1] = j;
  }
  return fail;
}

void Match(const string& needle,
           const string& haystack,
           vector<int> *matches) {
  const vector<int> fail = Build(needle);
  matches->clear();

  int j_needle = 0;
  for (int i_haystack = 0; i_haystack < haystack.size(); ++i_haystack) {
    while (j_needle >= 0 && needle[j_needle] != haystack[i_haystack])
      j_needle = fail[j_needle];
    ++j_needle;
    if (j_needle >= needle.size()) {
      matches->push_back(i_haystack - j_needle + 1);
      j_needle = fail[j_needle];
    }
  }
}

fail配列というのを作るのがミソ。
fail配列というのは、その時点までで入力された文字列(のsuffix)と、needleのprefixが何文字一致するかというオートマトン(pattern matching automaton)を配列の形で表現したものである。

つまり1. two pointersっぽいアルゴリズムでfail配列を構築するBuildと、と 2. それを使って効率的にneedleのポインタを移動させつつhaystackとのマッチングを行うMatchからKMPのアルゴリズムは成る。

1.のBuildについてはneedleの任意地点についてneedle自身の先頭とのマッチングを線形に取っているという風にも見ることができる。したがって、例えば文字列の周期をneedle.size() - fail.back()で取るなどの用途にも使える(例: needle = "abcabc" => needle.size() - fail.back() = 3 なぜならば"abc" x 2)。

空間計算量と構築はO(|needle|)分だけ食うが検索がO(|haystack| + |needle|)になる。