2016-09-29 2 views
2

Я пытаюсь выполнить некоторый анализ кластеризации с использованием трех разных алгоритмов кластеризации. Я погрузка в данных из стандартного ввода следующегоsklean fit_predict не принимает 2-мерный массив numpy

import sklearn.cluster as cluster 

X = [] 
for line in sys.stdin: 
    x1, x2 = line.strip().split() 
    X.append([float(x1), float(x2)]) 
X = numpy.array(X) 

и затем хранить свои параметры кластеризации и тип в массиве в качестве такого

clustering_configs = [ 
    ### K-Means 
    ['KMeans', {'n_clusters' : 5}], 
    ### Ward 
    ['AgglomerativeClustering', { 
       'n_clusters' : 5, 
       'linkage' : 'ward' 
       }], 
    ### DBSCAN 
    ['DBSCAN', {'eps' : 0.15}] 
] 

И я пытаюсь вызвать их в циклю

for alg_name, alg_params in clustering_configs: 

    class_ = getattr(cluster, alg_name) 
    instance_ = class_(alg_params) 

    instance_.fit_predict(X) 

Все работает правильно, за исключением функции instance_.fit_prefict(X). Я возвращаю ошибку

Traceback (most recent call last): 
    File "meta_cluster.py", line 47, in <module> 
    instance_.fit_predict(X) 
    File "/usr/local/lib/python2.7/dist-packages/scikit_learn-0.17.1-py2.7-linux-x86_64.egg/sklearn/cluster/k_means_.py", line 830, in fit_predict 
    return self.fit(X).labels_ 
    File "/usr/local/lib/python2.7/dist-packages/scikit_learn-0.17.1-py2.7-linux-x86_64.egg/sklearn/cluster/k_means_.py", line 812, in fit 
    X = self._check_fit_data(X) 
    File "/usr/local/lib/python2.7/dist-packages/scikit_learn-0.17.1-py2.7-linux-x86_64.egg/sklearn/cluster/k_means_.py", line 789, in _check_fit_data 
    X.shape[0], self.n_clusters)) 
TypeError: %d format: a number is required, not dict 

У кого-нибудь есть ключ, где я могу ошибиться? Я прочитал документы sklearn here, и он утверждает, что вам просто нужен array-like or sparse matrix, shape=(n_samples, n_features), который, я считаю, у меня есть.

Любые предложения? Благодаря!

ответ

2
class sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')[source] 

Они, как вы назвали бы класс KMeans есть

KMeans(n_clusters=5) 

С текущего кода вы звоните

KMeans({'n_clusters': 5}) 

, которая вызывает alg_params быть передан как Dict вместо параметра класса. То же самое касается других алгоритмов.

+0

Есть ли простой способ вывести эти значения из словаря и в нужный формат? – wKavey

+2

@wKavey: 'KMeans (** {'n_clusters': 5})' –

+0

Так что в моем случае 'instance_ = class _ (** alg_params)'? – wKavey

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