我无法完全理解k-means ++算法.我很感兴趣的是如何挑选出第一个k质心(剩下的就像在原始的k-means中).
我将欣赏一步一步的解释和一个例子.维基百科中的那个还不够清楚.一个评论很好的源代码也会有所帮助.如果您使用的是6个阵列,那么请告诉我们哪个阵列是为了什么.
language-agnostic algorithm cluster-analysis machine-learning k-means
我有一堆句子,我想用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)
Run Code Online (Sandbox Code Playgroud)
数据是句子列表.每次代码运行时,我的聚类结果都不同.如何使用光谱聚类获得一致的结果.我对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)
Run Code Online (Sandbox Code Playgroud)
我感谢你的帮助.
我想了解 sklearn.cluster.KMeans 类中的参数max_iter。
根据文档:
max_iter : int, default: 300
Maximum number of iterations of the k-means algorithm for a single run.
Run Code Online (Sandbox Code Playgroud)
但在我看来,如果我有 100 个对象,代码必须运行 100 次,如果我有 10.000 个对象,代码必须运行 10.000 次才能对每个对象进行分类。另一方面,在所有对象上运行多次是没有意义的。
我的误解是什么,我该如何解释这个参数?
因此,我可以sklearn kmeans按以下方式运行:
kmeans = KMeans(n_clusters=3,init='random',n_init=10,max_iter=500)
Run Code Online (Sandbox Code Playgroud)
但是我对参数的含义有些困惑
所以n_init说:
k均值算法将在不同质心种子下运行的次数。就惯性而言,最终结果将是n_init个连续运行的最佳输出。
并max_iter说:
单次运行的k均值算法的最大迭代次数。
但是我不完全理解那是什么意思。n_init给定初始形心集,形心向点平均移动的次数是多少?
并且是max_iter的次数整个算法与新的初始重心运行?
因此,例如,使用max_iter=2,时n_init=15,kmeans将选择初始质心,然后将这些质心移动15次并得出聚类结果。然后kmeans将再次选择初始质心,将这些质心移动15次,然后停止。然后,它将从两次运行中挑选出最佳的选择吗?
谢谢您的帮助!
[编辑] 还是我在这里的完全相反...?