我使用剪影_得分来寻找最优的k值。因此,我正在运行一个for循环,其中包含一系列可能的k值。我在下面添加了我的代码。这个程序需要很长时间才能运行。你能为更有效的运行时间提出一些改进吗?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from sklearn.cluster import KMeans
from sklearn import metrics
data=np.load(filename)
coeffs=[]
for i in range(2,8):
clusters=KMeans(n_clusters=i)
clusters.fit(data)
labels = clusters.labels_
sil_coeff = metrics.silhouette_score(data, labels,metric='euclidean')
coeffs.append(sil_coeff)
coeffs=np.array(coeffs)
k=np.argmax(coeffs)+2发布于 2018-07-27 06:03:45
做一些测量来识别瓶颈。
在这里,我建议不要使用剪影。因为它比k-均值慢得多。轮廓需要O(n平方)距离计算每次跑!
显而易见的是,要加快速度,这就是计算和存储一个距离矩阵一次。这将无助于k-的意思,但它将使多个轮廓运行得更快一点(它仍然是O(n平方),但只是数组查找而不是现在的距离计算)。然而,这将不能扩展到大数据。
更好的方法是使用更便宜的启发式来猜测k的“最佳”值。无论如何,没有一个这样的度量是完美的。
发布于 2018-07-10 12:47:55
从算法上讲,您的代码很好。关于代码运行缓慢的原因,我的主要猜测是,您有许多实例。你到底有多少个实例?
有一些方法可以提高KMeans的速度,以下是几个方法:
GridSearchCV您要做的是进行超参数调优。Sklearn已经有了一种内置的方式来使用GridSearchCV来实现这一点。这将优化某些过程。
n_jobs参数这将有助于并行化一些进程。
MiniBatchKMeans代替MiniBatchKMeans在每一步都只使用部分数据,因此,计算距离将更便宜。
正如其他人所提到的,没有必要计算每个K的所有实例之间的距离,因为您的实例不会改变。计算这些距离一次,并以X的形式传递距离矩阵,并根据文档设置metric="precomputed"
https://datascience.stackexchange.com/questions/34187
复制相似问题