LoginSignup
30
34

More than 5 years have passed since last update.

scikit-learn によるクラスタリング (1)

Last updated at Posted at 2014-02-27

クラスタリングの概要

実装根拠は以下を参照してください。
K-means++
K-means
英語ですけど日本語のページより情報量が多くまた厳密性があると思います。

scikit-learn の概要

Python で機械学習のあれこれをできる超便利なライブラリです。この辺を読んでください。

scikit-learn
scikit-learn の紹介

前提

入力ファイルとして文字列ごとに改行で区切られたテキストファイルを想定します。
使い方としては python clustering.py input.txt output.txt のように引数に入出力ファイルを指定します。
途中 print() で途中結果を表示しています。
出力ファイルにクラスタリング後のデータが出力されます。
ぜひ適当なテキストファイルを用意して実際に動かしてみてください。

実装

コード全体は以下の通りです。

clustering.py

クラスタを生成するメソッドのみを引用します。

clustering.py

def make_cluster(self):
    """ クラスタを生成して返す
    """

    # 処理対象の文字列によるリストを生成する
    texts = self._read_from_file()
    print("texts are %(texts)s" %locals() )

    # TF-IDF ベクトルを生成する
    vectorizer = TfidfVectorizer(
        max_df=self.max_df,
        max_features=self.max_features,
        stop_words='english'
        )
    X = vectorizer.fit_transform(texts)
    print("X values are %(X)s" %locals() )

    # KMeans インスタンスを生成しクラスタリングする
    # パラメータはデータの量や特性に応じて適切なものを与えるようにする
    km = MiniBatchKMeans(
        n_clusters=self.num_clusters,
        init='k-means++', batch_size=1000,
        n_init=10, max_no_improvement=10,
        verbose=True
        )
    km.fit(X)
    labels = km.labels_

    # 属するクラスタとその距離を計算する
    transformed = km.transform(X)
    dists = np.zeros(labels.shape)
    for i in range(len(labels)):
        dists[i] = transformed[i, labels[i]]

    clusters = []
    for i in range(self.num_clusters):
        cluster = []
        ii = np.where(labels==i)[0]
        dd = dists[ii]
        di = np.vstack([dd,ii]).transpose().tolist()
        di.sort()
        for d, j in di:
            cluster.append(texts[int(j)])
        clusters.append(cluster)

    # 生成したクラスタを返す
    return clusters

考察

scikit-learn を利用することにより、きわめて簡素なコードでクラスタリングができることがわかりますね。
多種多様なパラメータが随所で利用されます。
実アプリケーションの利用ではデータの特性にあわせてこれらをチューニングしていくことが求められます。

30
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
34