bag of visual wordsは多くの場面で出てくるのでさくっと使えるようにしておきたい。numpyとscipyをsklearnを使えば、とても簡単に使えるので流れをまとめておくことにします。
#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import scipy.cluster.vq as vq from sklearn.datasets import load_digits from sklearn.cross_validation import train_test_split def main(): digits = load_digits() print digits.data.shape # (1797, 64) # split digits data X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target) # computing the visual words K = int(np.sqrt(digits.data.shape[0]/2)) codebook, distortion = vq.kmeans(X_train, K) print codebook # computing the histogram of visual words code, dist = vq.vq(X_test, codebook) vw_hist, bin_edges = np.histogram(code, bins=codebook.shape[0], normed=True) print vw_hist if __name__ == '__main__': main()
といっても、やってることはscipyのvq.kmeansでcodebookを作成、作ったcodebookを元にvq.vqとnumpyのhistogramでbovwベクトルを作成するだけです。ほんとに簡単でした。