Как определить диапазон значений для параметра eps sklearn.cluster.DBSCAN? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу использовать DBSCAN с метрикой sklearn.metrics.pairwise.cosine_simility для кластеризации точек, косинусное сходство которых близко к 1 (т. Е. Чьи векторы (из "источника") параллельны или почти параллельны).

Проблема:

eps - это максимальное расстояние между двумя выборками для них, которое DBSCAN рассматривает как находящееся в одном и том же районе, что означает, что если расстояние между двумя точками равно ниже или равный eps, эти точки считаются соседями;

, но

sklearn.metrics.pairwise.cosine_simility выплевывает значения от -1 до 1, и я хочу, чтобы DBSCAN учелдве точки, чтобы быть соседями, если расстояние между ними, скажем, между 0,75 и 1, то есть больше или равно 0,75.

Я вижу два возможных решения:

  1. передать диапазон значений параметру eps DBSCAN, например eps = [0.75,1]

  2. Передать значение eps = -0.75 в DBSCAN, но (каким-то образом) заставить насe отрицательная матрица косинусных сходств, которую выплевывает sklearn.metrics.pairwise.cosine_simility

Я не знаю, как реализовать ни один из них.

Anyруководство будет оценено!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

A) проверьте обобщенный DBSCAN, который также хорошо работает со сходствами.С косинусом, sklearn предположительно будет медленным в любом случае.

B) вы можете использовать тривиально: косинусное расстояние = 1 - сходство косинусов.Но это может привести к тому, что реализация sklearn будет работать в O (n²).

C) вы, вероятно, даже можете передать -cosinesimilarity в качестве предварительно вычисленной матрицы расстояний и использовать -0,75 в качестве eps.

d) просто создайте двоичную матрицу расстояний (в памяти O (n²), хотя и очень медленно), где расстояние = 0 подобия косинуса больше, чем ваш порог, и 0 в противном случае.Затем используйте DBSCAN с eps = 0.5.тривиально показать это расстояние .

0 голосов
/ 15 февраля 2019

DBSCAN имеет аргумент ключевого слова metric.Docstring:

metric: string или callable Метрика, используемая при расчете расстояния между экземплярами в массиве объектов.Если метрика является строкой или вызываемой, это должна быть одна из опций, разрешенных metrics.pairwise.calculate_distance для ее параметра метрики.Если метрика «предварительно вычислена», предполагается, что X является матрицей расстояний и должно быть квадратным.X может быть разреженной матрицей, и в этом случае только «ненулевые» элементы могут считаться соседями для DBSCAN.

Так что, вероятно, проще всего сделать предварительный расчет матрицы расстояний, используя косинусное подобие в качестве расстоянияметрика, предварительно обработайте матрицу расстояний так, чтобы она соответствовала вашему индивидуальному критерию расстояния (вероятно, что-то вроде D = np.abs(np.abs(CD) -1), где CD - ваша матрица расстояний косинуса), а затем установите metric в precomputed и передайте предварительно вычисленную матрицу расстояний D в течение X, то есть данные.

Например:

#!/usr/bin/env python

import numpy as np

from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import DBSCAN

total_samples = 1000
dimensionality = 3
points = np.random.rand(total_samples, dimensionality)

cosine_distance = cosine_similarity(points)

# option 1) vectors are close to each other if they are parallel
bespoke_distance = np.abs(np.abs(cosine_distance) -1)

# option 2) vectors are close to each other if they point in the same direction
bespoke_distance = np.abs(cosine_distance - 1)

results = DBSCAN(metric='precomputed', eps=0.25).fit(bespoke_distance)
...