MemorError при расчете silhouette_score
Я запускаю алгоритм кластеризации KMeans на матрице с формой (190868,35). Я использую следующий код для того же:
for n_clusters in range(3,10):
kmeans = KMeans(init='k-means++',n_clusters=n_clusters,n_init=30)
kmeans.fit(matrix)
clusters = kmeans.predict(matrix)
silhouette_avg=silhouette_score(matrix,clusters)
print("For n_clusters =",n_clusters,"The avg silhouette_score is :",silhouette_avg)
и у меня появляется следующая ошибка
Traceback (most recent call last):
File "<ipython-input-6-be918e90030a>", line 5, in <module>
silhouette_avg=silhouette_score(matrix,clusters)
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\metrics\cluster\unsupervised.py", line 101, in silhouette_score
return np.mean(silhouette_samples(X, labels, metric=metric, **kwds))
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\metrics\cluster\unsupervised.py", line 169, in silhouette_samples
distances = pairwise_distances(X, metric=metric, **kwds)
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\metrics\pairwise.py", line 1247, in pairwise_distances
return _parallel_pairwise(X, Y, func, n_jobs, **kwds)
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\metrics\pairwise.py", line 1090, in _parallel_pairwise
return func(X, Y, **kwds)
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\metrics\pairwise.py", line 246, in euclidean_distances
distances = safe_sparse_dot(X, Y.T, dense_output=True)
File "C:\Users\arindam\Anaconda3\lib\site-packages\sklearn\utils\extmath.py", line 140, in safe_sparse_dot
return np.dot(a, b)
MemoryError
Если кто-нибудь знает какое-либо решение для этого, пожалуйста, предложите. Я попытался указать sample_size = 70000, код работает и использует всю память, и система зависает. У меня Lenovo Thinkpad с 16 ГБ оперативной памяти и процессором i7.
1 ответ
MemoryError
означает, что памяти недостаточно для размещения массива numpy во время выполнения silhouette_score
, Таким образом, решение состоит в том, чтобы использовать меньше памяти или увеличить объем памяти:
Решение 1. Выделите меньше памяти, установив sample_size в silhouette_score
Как найти максимально подходящий sample_size
?
def eval_silhouette_score(matrix, clusters, sample_size):
try:
silhouette_avg = metrics.silhouette_score(matrix, clusters, sample_size = sample_size)
return silhouette_avg
except MemoryError:
return None
div_factor = 1.
silhouette_avg = None
while silhouette_avg == None:
sample_size = int(len(clusters) / div_factor)
silhouette_avg = eval_silhouette_score(matrix, clusters, sample_size)
div_factor += 1.
Решение 2. Установите больше физических воспоминаний:)