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?
clustering
scikit-learn
text-mining
dbscan
filamentos
fonte
fonte
Respostas:
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.
fonte
sklearn
implementaçã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.