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です.
入れ子になったリストを作る方法
目的
入れ子になったリストを作る
group = [[], [], [], ...., []]
このようなリストで, 且つ任意の数だけ入れ子にさせる
方法
group = [[] for i in range(n)] >> [[], [], [],..., []]
補足
入れ子はnestedとかネストした, とか呼ばれる. むしろ, 「入れ子のリストを作る」という言葉にたどり着かない可能性が高いですね.
インデキシングを狙って再掲, [[], [], [], ...]
これ
ファイルのサイズを確認後, 空を削除する
流れ
- API等でファイルを取得
- ファイルサイズを取得
- 空なら削除
ファイルサイズを取得
os.path.getsize(path)
pathでファイル名も含めたPATHを与える
ファイルを削除する
os.remove(path)
ファイル名を含めたPATHを与える
sklearn.manifold.tsneのメモリリークを回避するために(Anacondaのみ)
現象
大規模データでscikit-learnのmanifold.tsneを使うとメモリエラーを起こします。Pythonでメモリエラーか。
原因
mklのバグ、、、らしい。以前にscikit-learnにイシューが立っていたようだ。バージョンが上がった現在でも改善はされていない。このイシューはPython2系時点だった。今回はPython3系なのでやはりバージョンも関係ない。
Python crashes when calculating large t-SNE · Issue #4619 · scikit-learn/scikit-learn · GitHub
対策(翻訳)
Anacondaのみだが
conda install nomkl
これで解決できる。これでintel-mkl ライブラリを使わないためメモリリークを起こさないようだ。
非Anacondaの場合はラッパーを利用することになる。
GitHub - danielfrg/tsne: A python wrapper for Barnes-Hut tsne
自分はAnacondaだったのでこっちは試していない。念の為。