我有一个大数组,我需要聚类并计算轮廓分数,以便为我的数据学习最佳数量的聚类。
问题是,由于np.dot
限制,当我尝试运行MemoryError
silhouette_score(X, c_labels)
我阅读了silhouette_score的源代码,我发现它在另一个方法np.mean
的结果上调用了silhouette_samples
。所以,我想也许我应该分批发送数据并得到他们的意思。所以,我做了一个实验。我创建了一个10,000x 10,000个数字的二维数组。然后我运行了聚类器,然后我计算了他们的得分:
testX = np.random.random((N, N))
b = MiniBatchKMeans(n_clusters=2, random_state=10)
c_labels = b.fit_predict(testX)
s = silhouette_score(testX, c_labels)
和s = -0.0001115591406734728
然后我运行了批量版本:
ss = []
lastIndex = 0
ss.append(silhouette_score(testX[:batch], c_labels[:batch]))
lastIndex += batch
while lastIndex < len(testX):
ss.append(silhouette_score(testX[lastIndex:lastIndex+batch], c_labels[lastIndex:lastIndex+batch]))
lastIndex += batch
np.mean(ss)
我得到了-6.7414138934508567e-05,这与原始结果相差甚远。
所以,我的问题是:有没有办法做到这一点?