首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >using使用silhouette_score

using使用silhouette_score
EN

Data Science用户
提问于 2018-07-09 10:09:39
回答 2查看 6.1K关注 0票数 5

我使用剪影_得分来寻找最优的k值。因此,我正在运行一个for循环,其中包含一系列可能的k值。我在下面添加了我的代码。这个程序需要很长时间才能运行。你能为更有效的运行时间提出一些改进吗?

代码语言:javascript
复制
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
EN

回答 2

Data Science用户

发布于 2018-07-27 06:03:45

做一些测量来识别瓶颈。

在这里,我建议不要使用剪影。因为它比k-均值慢得多。轮廓需要O(n平方)距离计算每次跑!

显而易见的是,要加快速度,这就是计算和存储一个距离矩阵一次。这将无助于k-的意思,但它将使多个轮廓运行得更快一点(它仍然是O(n平方),但只是数组查找而不是现在的距离计算)。然而,这将不能扩展到大数据。

更好的方法是使用更便宜的启发式来猜测k的“最佳”值。无论如何,没有一个这样的度量是完美的。

票数 3
EN

Data Science用户

发布于 2018-07-10 12:47:55

从算法上讲,您的代码很好。关于代码运行缓慢的原因,我的主要猜测是,您有许多实例。你到底有多少个实例?

有一些方法可以提高KMeans的速度,以下是几个方法:

  • 使用GridSearchCV

您要做的是进行超参数调优。Sklearn已经有了一种内置的方式来使用GridSearchCV来实现这一点。这将优化某些过程。

  • 使用n_jobs参数

这将有助于并行化一些进程。

  • 使用MiniBatchKMeans代替

MiniBatchKMeans在每一步都只使用部分数据,因此,计算距离将更便宜。

  • 使用预先计算的距离来计算您的剪影得分。

正如其他人所提到的,没有必要计算每个K的所有实例之间的距离,因为您的实例不会改变。计算这些距离一次,并以X的形式传递距离矩阵,并根据文档设置metric="precomputed"

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/34187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档