Я пытаюсь найти кластеры подобных объектов. Я вычислить значение для каждого сравнения объекта-к-объекта и создал матрицу вида:Кластеризация из матрицы 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-2 и кластер из 3-4-5. Что алгоритм пропустил, это означает, что я использую его неправильно. – codeMonkey
Возможно, вам следует дать 3-4-5 более высокое сродство, чем 0. –
Я попытался заменить нули: 0,1, 10 и 90. Все три попытки произвели cls = [0 0 0 0 1]. Мои (базовые) исследования указали мне на метод распространения Аффинити, потому что у меня небольшая матрица (во многих случаях, когда связь отсутствует), и AP эффективна для такой матрицы. – codeMonkey