2014-09-18 438 views
4

我有一堆句子,我想用scikit-learn谱聚类来聚类。我已经运行了代码并获得了没有问题的结果。但是,每次运行它我都会得到不同的结果。我知道这是启动时的问题,但我不知道如何解决它。这是我的代码运行在句子上的一部分:每次在Python中运行后聚类结果的变化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) 

我感谢您的帮助。

回答

13

使用k-means时,您需要在KMeans(请参阅documentation)中设置random_state参数。将其设置为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均值不是确定性算法。它通常从一些随机初始化过程开始,这种随机性意味着不同的运行将在不同的点开始。播种伪随机数发生器可确保这种随机性对于相同的种子总是相同的。

虽然我不确定光谱聚类的例子。来自的random_state参数:“一个伪随机数发生器,用于初始化lobpcg特征向量时分解eigen_solver == 'amg'和K-Means初始化。” OP的代码似乎并未包含在这些情况下,但设置参数可能值得一试。

+0

感谢Kmean的提示。随机状态设置是否真的影响结果?例如,如果我设置了random_state = 2222,它会改变结果吗?我会试试看看。关于谱聚类,我在发布这个问题之前查看了文档,但对启动没有太多介绍。他们有一个随机的状态,虽然我会设置它像Kmean中的那个,看看它会如何改变。再次感谢。 – user3430235 2014-09-18 21:56:41

+0

@ user3430235我认为这一切都取决于您的数据。我没有广泛使用它,但我认为k-means实际上对初始值非常敏感。当然,这就是为什么开发k-means ++的原因之一,为了获得更加始终如一的良好初始值,但这仍然是一个值得考虑的问题。另一个常见策略是用不同的种子多次运行并挑选最好的一个。 – 2014-09-18 21:59:00

+0

默认情况下,实现实际运行K-Means 10次并使用最佳结果集群。所以是的,它确实影响了所有的产出,除了微不足道的情况。 – 2014-09-21 16:56:06

0

通常,当运行具有许多局部最小值的算法时,通常采用随机方法并使用不同的初始状态多次运行算法。这会给你多个结果,并且通常选择错误率最低的结果是最好的结果。

当我使用K-Means时,我总是运行几次并使用最佳结果。

1

正如其他人已经注意到的,k-means通常是用随机化的初始化实现的。这是故意,你可以得到不同的结果。

算法只是一种启发式算法。它可能会产生不理想的结果。多次运行可以让您更好地找到一个好结果。

在我看来,当运行结果差异很大时,这表明数据与k-means完全不匹配。在这种情况下,你的结果并不比随机好得多。 如果数据真的适合k-均值聚类,结果将相当稳定!如果它们有所不同,这些簇可能不具有相同的大小,或者可能没有很好地分离;和其他算法可能会产生更好的结果。

相关问题