アクサンの場合

Python3初心者が段々上達するログ

mongodb で空のドキュメントを含むレコードを見つけるクエリ

MongoDB v3.4.5であるキーの中身が空のリストになっているレコードを見つけたい

{ _id: xxxxxxx,
  Nakami: [1,2,3],
}

{ _id: xxxxxx1,
  Nakami: []
}

こういった具合。ちなみにNakamiにはindexをふっていない前提。

さていくつか方法があるのでみていきたい。 実行時間が速い順に並んでいる。

TEMP.find( { Nakami: { $size: 0} } )
TEMP.find( { Nakami: []} )
TEM.find( { $where : "thie.Nakami.length == 0" } )

最後の $whereを使うのはだいぶ効率が悪い。今は $sizeを使うのがいいだろう。

参考ページ

mongodb - Query for documents where array size is greater than 1 - Stack Overflow

Find MongoDB records where array field is not empty (using Mongoose) - Stack Overflow

サーバーのディレクトリをマウントする

鯖のとあるディレクトリをマウントしたい(しかも手軽に)

NASとかそういうの別にいいので,さっさと読み出し権限だけでいいから欲しい.

という場合.

主に以下にあるわけですが,簡単に書くと, 別サーバのフォルダをマウントする|名古屋で働くエンジニアの覚書

mount -t nfs [IP address]:[マウントしたいディレクトリ] [マウントする手元のディレクトリ]

となって,つまり

mount -t nfs 192.168.0.XXX:/nas1/mydata /mnt/nas1/mydata

といったところだ. マウント先のディレクトリは作っておかないと上手くいかないので注意.

サーバーのディレクトリをマウントする

鯖のとあるディレクトリをマウントしたい(しかも手軽に)

NASとかそういうの別にいいので,さっさと読み出し権限だけでいいから欲しい.

という場合.

主に以下にあるわけですが,簡単に書くと, 別サーバのフォルダをマウントする|名古屋で働くエンジニアの覚書

mount -t nfs [IP address]:[マウントしたいディレクトリ] [マウントする手元のディレクトリ]

となって,つまり

mount -t nfs 192.168.0.XXX:/nas1/mydata /mnt/nas1/mydata

といったところだ. マウント先のディレクトリは作っておかないと上手くいかないので注意.

Python3 リストの中の要素を要素ごとにカウントする

問題

離散データが含まれているリストが与えられたとき, 最頻値を出してよ, とかヒストグラムもいいけど各年齢でどれくらいいるのか教えてよとか言われたりする.

そのとき, カウンティング関数を実装する?しない?面倒だな, 何か使えないか.

解答

Python標準ライブラリに含まれるcollectionsを使う

In [1]: import collections
In [2]: collections.Counter([14, 44, 32, 13, 24, 53, 14, 53, 66, 24])
Out[2]:  Counter({13: 1, 14: 2, 24: 2, 32: 1, 44: 1, 53: 2, 66: 1})

このようになる.カウントはできたが, じゃあこの情報にどうアクセスするのかが重要(あまりにも基礎なことだからか,記載されているブログは少ない).

こいつは,公式にはこのように書かれている.

Counter はハッシュ可能なオブジェクトをカウントする dict のサブクラスです。これは、要素を辞書のキーとして保存し、そのカウントを辞書の値として保存する、順序付けされていないコレクションです。カウントは、0 や負のカウントを含む整数値をとれます。 Counter クラスは、他の言語のバッグや多重集合のようなものです。

ふむ, つまり mydict[ハッシュ値]でアクセスできるということだ.

上記の例だと,

In [4]: mydict[66]
Out[4]: 1

In [5]: mydict[14]
Out[5]: 2

とやればカウント回数をとれる.

次に, カウント回数が最大・最小のキーは何かとか知りたい場合にどうするかを知りたい.

In [16]: max(mydict)
Out[16]: 66

In [17]: min(mydict)
Out[17]: 13

これでは,キーの最大値最小値しかとれていないからNG.

公式に,most_common()なるものがあった.

最も多い n 要素を、カウントが多いものから少ないものまで順に並べたリストを返します。 n が省略されるか None であれば、 most_common() はカウンタの すべての 要素を返します。等しいカウントの要素は任意に並べられます:

なるほど,わからん.試してみると,

In [18]: mydict.most_common()
Out[18]: [(14, 2), (24, 2), (53, 2), (44, 1), (32, 1), (13, 1), (66, 1)]

ここから最大カウントされているキーを取得することができるだろうか. カウントの最大は,

In [25]: max(mydict.values())
Out[25]: 2

で取得できる.じゃあキーはどうなのかは

Python の辞書に含まれる最大値のKeyを求めるクールな実装 - secretbase.log

を参考に以下のように書ける.

In [26]: max(mydict.most_common(), key=itemgetter(1))[0]
Out[26]: 14

うーん,最大値が複数ある場合はキーの最小値が返されるようだ.これではアカン...と思いつつも脱稿.

sklearn 0.18.1 でのKL-Divergence of two GMMs

KLダイバージェンスを2つのGMMで求めたいとき

過去に,

python - KL-Divergence of two GMMs - Stack Overflow

があった. そこから引用すると,

def gmm_kl(gmm_p, gmm_q, n_samples=10**5):
    X = gmm_p.sample(n_samples)
    log_p_X, _ = gmm_p.score_samples(X)
    log_q_X, _ = gmm_q.score_samples(X)
    return log_p_X.mean() - log_q_X.mean()

となる. しかしこれは古いsklearnの書き方.今は違う.

0.18.1でのKLダイバージェンス of two GMMs

def gmm_kl(gmm_p, gmm_q, n_samples=10**5):
    X, _ = gmm_p.sample(n_samples)
    log_p_X = gmm_p.score_samples(X)
    log_q_X = gmm_q.score_samples(X)
    return log_p_X.mean() - log_q_X.mean()

というのも,

GMM.sample(n_samples)はX(値)とy(混合ラベル)を返すように変わった. そして, GMM.score_samples(X)は2つ目の引数(今はlog probだけ)を返さなくなった.

ドキュメントはこちら

sklearn.mixture.GaussianMixture — scikit-learn 0.18.1 documentation

Python3で素因数分解する

素因数分解をライブラリで行う

from sympy.ntheory import factorint

これが正体. 詳細は,

Number Theory — SymPy 1.0 documentation

動作例

In [1]: from sympy.ntheory import factorint

In [2]: factorint(100)
Out[2]: {2: 2, 5: 2}

はい簡単.

実行時間について

In [7]: %time factorint(131)
CPU times: user 55 µs, sys: 4 µs, total: 59 µs
Wall time: 65.8 µs
Out[7]: {131: 1}

適当にキーボードを叩いてみて.

In [8]: %time factorint(127128574306)
CPU times: user 581 µs, sys: 0 ns, total: 581 µs
Wall time: 565 µs
Out[8]: {2: 1, 63564287153: 1}

まだいける.

In [9]: %time factorint(475646893209485734869943817574386974835048976415)
CPU times: user 5min 4s, sys: 204 ms, total: 5min 4s
Wall time: 5min 4s
Out[9]: 
{5: 1,
 151: 1,
 479: 1,
 1024775561: 1,
 1555754843799829: 1,
 824958834555644183: 1}

時間かかる. もうやめておこう.

しっかりと素因数分解してくれるので使えるやつですね.

Kerasで学習したモデルを保存する OR モデルを再利用する

Keras @TF backendで構築したモデルを再利用したい

ドキュメントにすべて書いてありますので堅い字面でも読める人は以下参照のこと. FAQ - Keras Documentation

モデルの保存

(略)
model.fit((略))
model.save('AAAA.h5')

これでモデルがAAAA.h5という名前で保存された.引用すると,ここで保存されているのは

  • モデル構造
  • 学習したモデルの重み

である.モデル構造だけ, モデルの重みだけ保存したい場合の方法もあるのでそういうニッチな希望はドキュメントを参考にしてください.

モデルの読み出し

from keras.models import load_model
model = load_model('AAAA.h5')

これで読みだしている.ただしエラーが出てしまう人は,そもそもファイルが存在しないh5pyをインストールしていないに注意してください.

h5pyがないと, 先ほど保存したAAAA.h5ファイルが読み出せません. HDF5形式なので,やや特殊なファイル形式です. pip install h5pyでインストールしましょう.

読み出したモデルが本当に読み出せているか確認したい

そういうときは, model.summary()でモデルの構造を見ることができます. 出力を見て, 構築したものと同じであればOKです.