2014-10-22 3 views
1

Я пытаюсь найти кластеры подобных объектов. Я вычислить значение для каждого сравнения объекта-к-объекта и создал матрицу вида:Кластеризация из матрицы Affinity в Python

header = [1, 2, 3, 4, 5] 
matrix = [[0, 100, 0, 0, 0] 
      [100, 0, 0, 0, 0] 
      [0, 0, 0, 0, 0] 
      [0, 0, 0, 0, 0] 
      [0, 0, 0, 0, 0]] 

я передать матрицу в модуль sklearn Сродство Размножение:

matrix = np.array(matrix) 
cluster = AffinityPropagation(preference="precomputed") 
cls = cluster.fit_predict(matrix) 

В приведенном примере , Я ожидал бы, что 1 и 2 будут сгруппированы, так как 1-2/2-1 равно 100, а все остальные значения равны нулю. Но массив ЦБС не отражает это:

cls = [0 0 0 0 1] 

Что означает, что 1, 2, 3 и 4 являются один кластер, и 5 представляет собой отдельный кластер.

Я попытался передать верхнюю правую треугольную матрицу, изменяя величину величины (то есть 0-1 vice 0-100) и т. Д., И она не группируется, как ожидалось.

Мысли о том, чего я не хватает?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ 10/24/2014:

Я выполняю попарное сравнение моих объектов, и от этого я произвожу число, которое указывает, насколько хорошо каждый объект относится с любой другой. Многие из этих объектов вообще не связаны, поэтому они приводят к значению «0».

Это создает разреженную n-на-n матрицу, где n находится в порядке от 10 до 100 единиц.

Визуально, для меня тривиально «кластеризовать» эти объекты для дальнейшего анализа. В нижеследующем случае 1 относится к 2, а 2 относится к 3, но 1 и 3 НЕ ПРЯМО СВЯЗИ. Я продолжал бы обрабатывать 1, 2 и 3 и игнорировать 4 и 5. (В моих фактических данных у меня, вероятно, будет несколько допустимых кластеров в пределах одной матрицы).

header = [1, 2, 3, 4, 5] 
matrix = [[0, 100, 0, 0, 0] 
      [100, 0, 96, 0, 0] 
      [0, 96, 0, 0, 0] 
      [0, 0, 0, 0, 0] 
      [0, 0, 0, 0, 0]] 

Мои исследования показывают, что Affinity Размножается хорошо на поиск кластеров в разреженных матрицах, а также и мое попарное сравнение эффективно генерировать «предварительно вычисленную» сродство матрицы.

Хотя визуально эти кластеры легко найти, я бы хотел автоматизировать его, чтобы интегрировать его с кодом, который приходит до и после. Однако, как указывает исходное сообщение, я не создаю значимых кластеров.

Вопрос:

Является ли какое-то обработка требуется, чтобы генерировать значимые кластеры, начиная с такой матрицей я описал?

Я пренебрегаю шагом или иным образом вношу ошибку в алгоритм, чтобы он не смог найти мои кластеры?

Должен ли я использовать другой метод кластеризации (DBSCAN, k-средства и т. Д.) Для такого рода данных?

ответ

1

0 не является волшебным значением «не связывать».

Поскольку сродство объектов 3 и 4 относится к таким же к 1, 2 или 5, не имеет значения, где они предназначены; все они примерно одинакового качества.

Более сильное сцепление 1 и 2 может сделать предпочтительным назначение 3 и 4; и желание производить не один раз кластер может привести к тому, что 5 останутся раздельными. Но это также может быть просто случайным, объект 3 и 4 присваивается первому образцу наилучшего сродства (из кластера 1,2); и объект 5 просто сохраняется отдельно, чтобы иметь по меньшей мере два компонента.

Используйте настоящие данные, а не связанные с руками аффиниты.

+0

Должно быть значение, которое представляет «не ссылаться». (действительно, «ссылка очень слабая».) Человек, смотрящий на эти данные, с готовностью найдет кластер из 1-2 и кластер из 3-4-5. Что алгоритм пропустил, это означает, что я использую его неправильно. – codeMonkey

+0

Возможно, вам следует дать 3-4-5 более высокое сродство, чем 0. –

+0

Я попытался заменить нули: 0,1, 10 и 90. Все три попытки произвели cls = [0 0 0 0 1]. Мои (базовые) исследования указали мне на метод распространения Аффинити, потому что у меня небольшая матрица (во многих случаях, когда связь отсутствует), и AP эффективна для такой матрицы. – codeMonkey

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