luggage baggage

Machine learning, data analysis, web technologies and things around me.

PDB ファイルを読み込みコンタクトマップをミリ秒で計算する

タンパク質の構造解析をする際、各アミノ酸残基が近接しているかどうかを記述するコンタクトマップが役立つ場合があります。通例、コンタクトマップは各アミノ酸の Cα の三次元座標を用いて、互いの距離が一定以下(8Åとすることが多い)であれば近接していると判断し作成されます。

基本的には全残基の組み合わせ(N^2 オーダー)だけ距離計算をする必要があり、下手に実装すると相応の時間がかかってしまいます。今回は、このコンタクトマップ計算を numpy ベースで高速に実行するコードをメモ程度に残します。

続きを読む

Albumentations で TypeError: __init__() got an unexpected keyword argument 'keypoint_params' が出る場合の対処

深層学習で画像認識系のタスクを解くとき、画像データセットに対する augmentation が重要となる場合が多いです。ランダムクロップ、フリップ、リサイズ、回転、ブラーリング等々。このような定型的な処理をする際、私は Albumentations をよく使います。

GitHub - albu/albumentations: fast image augmentation library and easy to use wrapper around other libraries
Arxiv: https://arxiv.org/pdf/1809.06839.pdf


最近 keypoint detection 系のモデルを学習させる際に使おうとしたのですが、TypeError: __init__() got an unexpected keyword argument 'keypoint_params' が出てしまいちょっと困りました。この原因は、おそらく conda 経由でのインストールをしていたことのようです。確認してみると、

In [1]: import albumentations

In [2]: albumentations.__version__
Out[2]: '0.1.8'

ということで、記事執筆時点の最新版と比べてかなり古いものでした(keypoint 対応されたのが 0.2.0)。そこでこちらを remove して改めて pip install したところ、バージョンは 0.3.0 となり問題は解消しました。

pandas.Series を使うときには index に注意しよう

Python でデータ分析をする際、pandas.DataFrame を基本的な道具として使うことは多いと思います。また、DataFrame の各カラムは pandas.Series で自然に表現されており、新しいカラムを Series として書いた上で、DataFrame に追加することもあるでしょう(DataFrame の適当なカラムに対して rolling 関数を適用して移動平均を計算した際に返ってくる Series を追加する、とか)。この時、意図した順にデータを追加するためには、index に注意しておく必要があります。

続きを読む

重複あり名前リストから、スコア順に上位N人を取得しランキングを作成する(numpy.unique)

重複を含む配列があり、各々の要素に対してスコアが付随している時、スコアの大きい順に最大 N 個のユニークな要素を取得してランキングを作成する、というのを numpy.unique を使ってやる小ネタです。

続きを読む

cv::Mat を protocol buffer に格納する (C++ で OpenCV & protobuf)

この記事では、C++ で OpenCV を使いつつ、cv::Mat に格納されたバイナリデータを protocol buffer に格納しシリアライズする方法を書いていきます。画像認識系のアルゴリズムを作る際、カメラデバイス上では C++ を使ってフレームを取得し、サーバ上の Python 機械学習アルゴリズムに対して gRPC 通信でデータを送る、みたいなシチュエーションで使った方法となります。

続きを読む

メモ:行列式の補題(matrix determinant lemma)

論文を読んでいて matrix determinant lemma の証明が思い浮かばなかったのでメモ(情けない。。)。

内容としては、適当な次元の単位行列  I と、それと同じ次元のベクトル  u, v に対して
\begin{equation}
\det(I+uv^T) = 1 + v^Tu
\end{equation}が成り立つ、というシンプルなものですが、結論、英語版 wikipedia*1 に1行の証明が書いてあり、次の恒等式に対して単に行列式をとれば終了です。

\begin{equation}
\left(\begin{array}{cc} I & 0 \\ v^T & 1 \\ \end{array} \right) \left(\begin{array}{cc} I+uv^T & u \\ 0 & 1 \\ \end{array} \right) \left(\begin{array}{cc} I & 0 \\ -v^T & 1 \\ \end{array} \right) = \left(\begin{array}{cc} I & u \\ 0 & 1+v^Tu \\ \end{array} \right)
\end{equation}左辺の1つ目と3つ目の行列は三角行列で、対角要素が全て1のため行列式を取ると消えるのですね。

PRML でも式自体は書かれているものの、著者にとっては自明なのか証明が書いてなかったり、そもそも matrix determinant lemma という名称がテクニカルタームだということにも当初気が付かず、調べるのに時間を要したので、こちらで共有しておきます。

なお、PRML 上巻の (C.14) 式は、上の式で  u A,  v B と形式的に置き換えるだけで全く同様に成り立つことが示せます。

Mac のターミナル上で docker コンテナにて作業をすると勝手に折り返されたり表示がおかしくなる現象の対処

Mac で iTerm などを使ってターミナルを開き、(SSH 経由でサーバ上の)docker コンテナをおもむろに立ち上げた際、

  • 設定されているはずの列数よりもかなり少ないところで表示が折り返されてしまい、画面上で長めのコマンドを打つのが難しくなる
  • Python コンソールを立ち上げると、本来表示されるべき行が表示されない一方で入力の受け付けはしているので、適切に作業できない

という現象を度々経験していました。

後者の例としては、こんな感じの表示がされてしまっていました。
f:id:yoshidabenjiro:20181113222913p:plain
見ると分かる通り、本来は表示されるはずの行番号や入力済みの文字が見えていません(キャプチャが適当になってしまいましたが、NameError の後には何の行も出力されていない状態です)。一方で入力自体はされており、困惑します。

とは言うものの対処は簡単にできて、画面を一度全画面化してから全画面化を解除する、もしくはその逆、と操作するだけで解消します。
f:id:yoshidabenjiro:20181113223210p:plain
これは上の画像の状態から、全画面化解除 → 通常サイズ → 再度全画面化、としたものですが、次の行を表す [2] がちゃんと表示されていますね。