DBSCAN с пользовательской метрикой

У меня есть следующее:

  • набор данных в диапазоне тысяч

  • способ вычисления подобия, но сами данные я не могу построить их в евклидовом пространстве

Я знаю, что DBSCAN должен поддерживать пользовательскую метрику расстояния, но я не знаю, как ее использовать.

скажем, у меня есть функция

def similarity(x,y):
    return  similarity ... 

и у меня есть список данных, который можно передать попарно в функция, как указать это при использовании реализации DBSCAN scikit-learn ?

В идеале я хочу получить список кластеров, но я не могу понять, как начать работу в первую очередь.

существует много терминологии, которая все еще смущает меня:

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html

Как передать массив объектов и что это такое ? Как мне вписаться в это? реализация моих потребностей ? Как я смогу получить свои "подсписки" из этого алгоритма ?

2 ответов


"массив объектов" - это просто массив объектов точки данных в вашем наборе данных.

metric - Это параметр, который вы ищете. Это может быть строка (имя встроенной Метрики) или вызвать. Ваш similarity функция является отзывной. Это не очень хорошо описано в документации, но метрика должна сделать именно это, взять две функции в качестве параметров и вернуть число.

def similarity(x, y):
    return ...

reduced_dataset = sklearn.cluster.DBSCAN(metric: similarity).fit(dataset)

в случае, если кто-то ищет то же самое для строк с пользовательской метрики

    def metric(x, y):
        return yourDistFunc(string_seqs[int(x[0])],string_seqs[int(y[0])])
    def clusterPockets():          
        global string_seqs
        string_seqs = load_data() #["foo","bar"...]
        dat = np.arange(len(string_seqs)).reshape(-1, 1)
        clustered_dataset = DBSCAN(metric=metric)).fit(X=dat, y=dat)