Ввод вручную медиан как центроидов K-средних, в Python - PullRequest
1 голос
/ 27 марта 2019

У меня есть 2d np.array с 3 столбцами из 4 категорий регистраций. Я хочу реализовать K-средства в этом массиве np из 3 столбцов, чтобы проверить, можно ли автоматически кластеризовать его в 4 достаточно трехмерных кластера. Таким образом, я инициирую свои центроиды из медианы реальных категорий (3 медианы * 4 категории, которые я хочу сгруппировать), а не из средств, потому что все они происходят из непараметрического распределения. Я масштабировал свои данные и создал массив медиан (3 * 4), но получаю эту ошибку:

clean=[[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3]]

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

TypeError: объект builtin_function_or_method не может быть подписан

Я попытался изменить массив на массив np, стек и т. Д., Но, похоже, я не могу ввести 3 медианы на кластер. Я думаю, что K-means может кластеризоваться на трехмерных пространствах, верно?

Это сработало, когда я установил центроиды с 4-мя отдельными значениями, но это не то, что я хочу. Ошибка вызвана вводом массива в init =. Есть ли проблема в моей логике или K- означает знание или какая-то проблема синтаксиса?

Ответы [ 3 ]

1 голос
/ 27 марта 2019

ЧАСТЬ 1:

TypeError: объект builtin_function_or_method не может быть подписан

Это чисто ошибка numpy, и она появляетсяпотому что вы забыли использовать круглые скобки () для определения массива numpy.


ЧАСТЬ 2:

Прежде всего, в init_medians вы передаете 4 списка, но они не имеют одинаковые размеры.Последний список содержит 4 элемента (то есть [0.01, 0.02, 0.03, 0.04]) вместо 3 для представления медиан кластера.

Во-вторых, аргумент init KMeans ожидает в качестве входных данных массив данных формы (n_clusters,n_features).В вашем случае это должен быть (4, 3) массив пустышек, подобный следующему:

init_medians=np.array( [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]] )
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

ЧАСТЬ 3: Матрица данных X должна бытьnumpy массив не список списков.

Полный код:

clean=np.array([[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3],[0.1, 0.2, 0.3]])

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)
0 голосов
/ 27 марта 2019

Вам нужны скобки для определения массива.«Недопустимый» означает, что вы пытаетесь получить доступ к индексу команды массива.

init_medians=np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])
model = KMeans(n_clusters=4, max_iter=300, init=init_medians)
model.fit(clean)

Возможно, у вас есть вторая проблема, поскольку в последней строке массива есть 4 элемента, поэтомучто init_medians будет:

array([list([0.1, 0.2, 0.3]), list([0.4, 0.5, 0.6]),
       list([0.7, 0.8, 0.9]), list([0.01, 0.02, 0.03, 0.04])]

Скорее отличается от:

np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9], [0.01, 0.02, 0.03]])

Если вы удалите один элемент

0 голосов
/ 27 марта 2019

Разве вы не забыли поставить скобки вокруг np.array?

init_medians=np.array([...])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...