Por que a maioria dos meus pontos é classificada como ruído usando o DBSCAN?

7

Estou usando vários algoritmos de cluster do sklearn para agrupar alguns dados e não consigo descobrir o que está acontecendo com o DBSCAN. Meus dados são uma matriz de termos de documento do TfidfVectorizer, com algumas centenas de documentos pré-processados.

Código:

tfv = TfidfVectorizer(stop_words=STOP_WORDS, tokenizer=StemTokenizer())
data = tfv.fit_transform(dataset)

db = DBSCAN(eps=eps, min_samples=min_samples)
result = db.fit_predict(data)
svd = TruncatedSVD(n_components=2).fit_transform(data)
// Set the colour of noise pts to black
for i in range(0,len(result)):
        if result[i] == -1:
            result[i] = 7
colors = [LABELS[l] for l in result]
pl.scatter(svd[:,0], svd[:,1], c=colors, s=50, linewidths=0.5, alpha=0.7)

Aqui está o que eu recebo para eps = 0,5, min_samples = 5:

Basicamente, não consigo obter nenhum cluster, a menos que defina min_samples como 3, o que fornece:

Eu tentei várias combinações de valores eps / min_samples e obtive resultados semelhantes. Parece sempre agrupar áreas de baixa densidade primeiro. Por que ele está se agrupando assim? Talvez eu esteja usando TruncatedSVD incorretamente?

filamentos
fonte
Bem-vindo ao Cross Validated ! Reserve um momento para ver o nosso passeio .
Tavrock 29/03
Os gráficos de dispersão não mostram tendência, mas pode ser que a variação não seja constante.
Michael R. Chernick
11
@ MichaelChernick: Este comentário parece extraviado. O que você quer dizer com tendência e por que nos importamos com isso neste aplicativo de cluster? De qualquer forma, a dispersão das duas primeiras pontuações no PC mostra um agrupamento óbvio. Não DBSCAN não examinar dentro de variância cluster ou qualquer coisa assim ...
usεr11852
2
Observe que você provavelmente deve usar DBSCAN com distância de cosseno em vez de distância euclidiana aqui.
QuIT - Anony-Mousse, 02/04

Respostas:

5

O gráfico de dispersão das pontuações da projeção SVD dos dados originais do TFIDF sugere que, de fato, alguma estrutura de densidade deve ser detectada. No entanto, esses dados não são as entradas com as quais o DBSCAN é apresentado. Parece que você está usando como entrada os dados originais do TFIDF .

É muito plausível que o conjunto de dados TFIDF original seja escasso e de alta dimensão. Detectar clusters baseados em densidade nesse domínio seria muito exigente. A estimativa de alta densidade é um problema propriamente difícil ; é um cenário típico em que a maldição da dimensionalidade entra em ação. Estamos apenas vendo uma manifestação desse problema ("maldição"); o cluster resultante retornado pelo DBSCAN é bastante escasso e assume (provavelmente incorretamente) que os dados disponíveis estão repletos de discrepâncias.

Eu sugeriria que, pelo menos em primeira instância, o DBSCAN receba as pontuações de projeção usadas para criar o gráfico de dispersão mostrado como entradas. Essa abordagem seria efetivamente a Análise Semântica Latente (LSA). No LSA, usamos a decomposição SVD de uma matriz contendo contagens de palavras do corpus de texto analisado (ou uma matriz de termos-documentos normalizada como a retornada pelo TFIDF) para investigar as relações entre as unidades de texto do corpus em questão.

usεr11852
fonte
E como o @Tavrock disse bem-vindo à comunidade! : D
usεr11852
Sim, eu estava usando os dados originais do TFIDF. Os clusters do DBSCAN parecem razoáveis ​​ao tentar isso com os mesmos dados no R, então não esperava que fosse muito diferente com o sklearn. K-means (com sklearn) também funciona bem nos dados do TFIDF. Faz sentido que funcione com essas outras coisas, mas não para essa implementação específica do DBSCAN? Porém, obrigado pela informação sobre o LSA - eu não tinha certeza de quando era válido usar os valores SVD para ajustar os modelos vs. usar os dados TFIDF.
filamentos
Ótimo, estou feliz por poder ajudar. Se você acredita que este post responde à sua pergunta, considere aceitar a resposta.k-means (provavelmente) conseguiu encontrar um cluster porque não depende diretamente de um ϵfator semelhante ao DBSCAN para o raio de seu aglomerado; isso não significa que o agrupamento seja sensato. Eu não usei a sklearnimplementação do Python DBSCAN, portanto não posso comentar sobre sua qualidade. Observe, no entanto, que algumas implementações podem executar etapas padrão de pré-processamento e que podem afetar acidentalmente seu desempenho quando aplicadas.
usεr11852