2016-10-14 15 views
1

Я пытаюсь найти нужное количество кластеров, k, в соответствии с оценками силуэта, используя sklearn.cluster.MiniBatchKMeans.MiniBatchKMeans OverflowError: невозможно преобразовать бесконечность float в integer?

from sklearn.cluster import MiniBatchKMeans 
from sklearn.feature_extraction.text import HashingVectorizer 

docs = ['hello monkey goodbye thank you', 'goodbye thank you hello', 'i am going home goodbye thanks', 'thank you very much sir', 'good golly i am going home finally'] 

vectorizer = HashingVectorizer() 

X = vectorizer.fit_transform(docs) 

for k in range(5): 
    model = MiniBatchKMeans(n_clusters = k) 
    model.fit(X) 

И я получаю эту ошибку:

Warning (from warnings module): 
    File "C:\Python34\lib\site-packages\sklearn\cluster\k_means_.py", line 1279 
    0, n_samples - 1, init_size) 
DeprecationWarning: This function is deprecated. Please call randint(0, 4 + 1) instead 
Traceback (most recent call last): 
    File "<pyshell#85>", line 3, in <module> 
    model.fit(X) 
    File "C:\Python34\lib\site-packages\sklearn\cluster\k_means_.py", line 1300, in fit 
    init_size=init_size) 
    File "C:\Python34\lib\site-packages\sklearn\cluster\k_means_.py", line 640, in _init_centroids 
    x_squared_norms=x_squared_norms) 
    File "C:\Python34\lib\site-packages\sklearn\cluster\k_means_.py", line 88, in _k_init 
    n_local_trials = 2 + int(np.log(n_clusters)) 
OverflowError: cannot convert float infinity to integer 

Я знаю, что type(k) является int, так что я не знаю, где эта проблема исходит от. Я могу запустить следующий раз хорошо, но я не могу перебирать целых в списке, даже если type(2) равно k = 2; type(k)

model = MiniBatchKMeans(n_clusters = 2) 
model.fit(X) 

Даже работает с различными model работ:

>>> model = KMeans(n_clusters = 2) 
>>> model.fit(X) 
KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=2, n_init=10, 
    n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001, 
    verbose=0) 

ответ

1

Давайте анализировать код:

  • for k in range(5) возвращает следующую последовательность:
    • 0, 1, 2, 3, 4
  • model = MiniBatchKMeans(n_clusters = k) inits модели с n_clusters=k
  • Давайте посмотрим на первой итерации:
    • n_clusters=0 используется
    • В оптимизации кода (смотрите на выходе):
    • int(np.log(n_clusters))
    • = int(np.log(0))
    • = int(-inf)
    • ОШИБКА: определение бесконечности для целых чисел!
    • -> литье с плавающей запятой значение -inf to int невозможно!

n_clusters=0 Установка не имеет смысла!

+2

Замечательные объяснения. Спасибо, что провела меня всю дорогу через трассу. – blacksite

 Смежные вопросы

  • Нет связанных вопросов^_^