Python иерархическая кластеризация новых элементов друг к другу и существующих кластеров, которые не изменяются - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть ситуация, когда у меня есть набор наблюдений, для которых я хочу выполнить кластеризацию. Я использую функции Python scipy.cluster.hierarchy "дендрограмма" и "связь". Наблюдения представляются матрицей расстояний, а не вводом самих наблюдений, поскольку исходные данные не являются числами c, поэтому я создал собственную меру расстояния. Это делается с помощью

linkage(y=dmat, metric="precomputed", method="average")

, где dmat - матрица расстояний, а «precomputed» указывает связыванию обрабатывать его как таковой, а не как входные данные.

Используемые мной данные имеют ярлыки, которые я пытаюсь использовать для соответствия. Визуализируя матрицу расстояний, отсортированную по меткам, я вижу очень хорошую отделимость по диагонали в четко определенных квадратах, таких как следующие (синий = 0, красный = 1, поэтому синий = низкое расстояние внутри), enter image description here

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

Я провел несколько экспериментов с дендрограммами и попытался выяснить, является ли отсечение расстояния, например, 0,5 (аргумент color_threshold ) заставляет кластеры соответствовать известным меткам, и это работает довольно хорошо. Любым наблюдениям, которые не были объединены с другим, назначается кластер размером 1 (который реалистичен c). В действительности, мы не будем знать, сколько классов меток существует в данном наборе данных (и они могут быть разных размеров), поэтому такой подход идеален (в отличие, скажем, от kmeans с фиксированным k).

Вот проблема. Мое настоящее приложение - назначать метки новым партиям данных, поступающим со временем. У меня есть данные, для которых были назначены метки ( и не должны быть изменены ). Каждое новое наблюдение должно быть присвоено существующей метке или ему должна быть присвоена новая метка. Таким образом, набор меток со временем будет увеличиваться.

Итак, что я действительно хочу сделать, так это организовать иерархическую кластеризацию новых пакетных данных, где существующие данные являются фиксированными кластерами, и новое наблюдение может быть объединен с другими новыми наблюдениями и / или назначен существующему кластеру из предыдущего набора данных. Таким образом, сходство кластеров в иерархической кластеризации (например, «среднее») для нового наблюдения следует рассчитывать по всем существующим кластерам / наблюдениям (то есть тем, которые были сформированы ранее и, возможно, добавлены). НО я не хочу выполнять слепую иерархическую кластеризацию для новых и предыдущих данных вместе, потому что предыдущие назначения кластера не должны изменяться (даже если мера подобия выбирает это). Таким образом, скажем, у меня есть новое наблюдение, которое не объединено с другим новым наблюдением, потому что расстояние выше предела. При первой настройке он будет создан как новый кластер (таким образом, метка будет расширена на единицу). Но возможно, что он будет добавлен к одному из предыдущих ярлыков (кластеров) в предыдущем наборе данных, который я бы не знал, если бы проигнорировал это.

Дело в том, что я не видел ничего в Интернете, что делает это. Я мог бы, очевидно, перетасовать новые наблюдения, расположить их по порядку и рассчитать их расстояние до существующих групп, а затем назначить их новым, если, скажем, ни одно из расстояний не ниже порога. Возможно, это можно повторить несколько раз со случайными порядками, чтобы увидеть, является ли решение стабильным. Тем не менее, я думаю, может возникнуть ситуация, когда, скажем, два новых наблюдения сначала объединяются, а затем присваиваются предыдущему кластеру. То есть при принятии решения я могу объединить сходство в новом пакете и сходство с существующими группами. Возможно, мне нужно было бы просто кластеризовать новые данные отдельно под порогом, затем вычислить среднее сходство с предыдущими кластерами и переназначить их этим группам, если расстояние также находится ниже порога.

Есть ли у кого-нибудь предложения относительно того, что является хорошим способом продолжить, или если есть существующий метод, чтобы сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...