Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

クラスタリングの概要

実装根拠は以下を参照してください。
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 を利用することにより、きわめて簡素なコードでクラスタリングができることがわかりますね。
多種多様なパラメータが随所で利用されます。
実アプリケーションの利用ではデータの特性にあわせてこれらをチューニングしていくことが求められます。

dts
コンサルティングから設計、開発、HW/SWの選定、運用、保守までシステムをサポートする総合情報サービス企業です。
http://www.dts.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした