我有一堆句子,我想用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)
我感谢您的帮助。
感谢Kmean的提示。随机状态设置是否真的影响结果?例如,如果我设置了random_state = 2222,它会改变结果吗?我会试试看看。关于谱聚类,我在发布这个问题之前查看了文档,但对启动没有太多介绍。他们有一个随机的状态,虽然我会设置它像Kmean中的那个,看看它会如何改变。再次感谢。 – user3430235 2014-09-18 21:56:41
@ user3430235我认为这一切都取决于您的数据。我没有广泛使用它,但我认为k-means实际上对初始值非常敏感。当然,这就是为什么开发k-means ++的原因之一,为了获得更加始终如一的良好初始值,但这仍然是一个值得考虑的问题。另一个常见策略是用不同的种子多次运行并挑选最好的一个。 – 2014-09-18 21:59:00
默认情况下,实现实际运行K-Means 10次并使用最佳结果集群。所以是的,它确实影响了所有的产出,除了微不足道的情况。 – 2014-09-21 16:56:06