19

たくさんの文章があり、scikit-learn スペクトル クラスタリングを使用してそれらをクラスタリングしたいと考えています。コードを実行しましたが、問題なく結果が得られました。しかし、実行するたびに異なる結果が得られます。これがイニシエーションの問題であることはわかっていますが、修正方法がわかりません。これは、文で実行される私のコードの一部です:

vectorizer = TfidfVectorizer(norm='l2',sublinear_tf=True,tokenizer=tokenize,stop_words='english',charset_error="ignore",ngram_range=(1, 5),min_df=1)
X = vectorizer.fit_transform(data)
# connectivity matrix for structured Ward
connectivity = kneighbors_graph(X, n_neighbors=5)
# make connectivity symmetric
connectivity = 0.5 * (connectivity + connectivity.T)
distances = euclidean_distances(X)
spectral = cluster.SpectralClustering(n_clusters=number_of_k,eigen_solver='arpack',affinity="nearest_neighbors",assign_labels="discretize")
spectral.fit(X)

データは文のリストです。コードを実行するたびに、クラスタリングの結果が異なります。スペクトル クラスタリングを使用して一貫した結果を得るにはどうすればよいですか。Kmeanにも同じ問題があります。これはKmeanの私のコードです:

vectorizer = TfidfVectorizer(sublinear_tf=True,stop_words='english',charset_error="ignore")
X_data = vectorizer.fit_transform(data)
km = KMeans(n_clusters=number_of_k, init='k-means++', max_iter=100, n_init=1,verbose=0)
km.fit(X_data)

あなたの助けに感謝します。

4

4 に答える 4

31

k-means を使用する場合は、random_stateパラメーターを に設定します (ドキュメントKMeansを参照してください)。これを int またはインスタンスに設定します。RandomState

km = KMeans(n_clusters=number_of_k, init='k-means++', 
            max_iter=100, n_init=1, verbose=0, random_state=3425)
km.fit(X_data)

k-means は決定論的アルゴリズムではないため、これは重要です。通常、ランダム化された初期化手順で開始されます。このランダム性は、異なる実行が異なるポイントで開始されることを意味します。疑似乱数ジェネレーターをシードすると、このランダム性が同一のシードに対して常に同じになることが保証されます。

ただし、スペクトル クラスタリングの例についてはよくわかりません。パラメーターに関するドキュメントから:「 K-Means の初期化random_state時に、lobpcg 固有ベクトル分解の初期化に使用される疑似乱数ジェネレーター」。eigen_solver == 'amg'パラメータを設定することは一見の価値があるかもしれませんが、OPのコードはこれらのケースに含まれていないようです。

于 2014-09-18T20:30:51.400 に答える