質問: `sklearn`でKMeansを利用しようと考えています。 上記のサンプルを参考にしています。 上記サンプルのL58で`TfidfVectorizer.fit_transform()`で学習データをベクトル化し、L91で新しいクラスタリング対象のデータを`TfidfVectorizer.transform()`でベクトル化しています。 これは、必ず`fit_transform()`を呼び出してから`transform()`を呼びださなければならないのでしょうか。 もしそうなら、`fit_transform()`した状態を保存しておき新しい対象に対しては`fit_transform()`を省略することはできるでしょうか。
回答: 学習データのベクトル化と、新しいデータのベクトル化は独立した操作なので、必ずしもfit_transform()を呼び出してからtransform()を呼びなさないといけないわけではありません。fit_transform()で作られたベクトルをディスクに保存しておけば、後からロードすることができます。 `vectorized`の型は`scipy.sparse.csr.csr_matrix`なので`.toarray()`でnumpyの形式に変換してから保存すればいいと思います。復元はその逆の操作になります。 ``` import numpy import scipy.sparse.csr # vectorizedはgithubの例にあるようにvectorizer.fit_transform(...)で得られたもの # 保存 numpy.save('my_vector', vectorized.toarray()) # 復元 なぜかファイル名は拡張子をつけないとロードできない vectorized2 = scipy.sparse.csr.csr_matrix(numpy.load('my_vector.npy')) # 値の同一性の確認 print (vectorized.toarray() == vectorized2.toarray()).all() ```