O algoritmo Birch não se agrupa conforme o esperado

10

Estou usando o algoritmo Birch do pacote Python scipy-learn para agrupar um conjunto de pontos em uma pequena cidade em conjuntos de 10.

Eu uso o seguinte código:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

Na minha ideia, eu sempre terminava com conjuntos de 10 pontos. No meu caso agora, tenho 650 pontos para agrupar e n_clusters é 65.

Mas, meu problema é que, com um limite muito baixo, eu acabo com 1 endereço por cluster, apenas um limite minúsculo maior - 40 endereços por cluster.

O que estou fazendo de errado aqui?

kaboom
fonte
Talvez seja CRS. Problema? Se você tentou com graus (como WGS 84), tente métrico. Há uma diferença bastante grande nas coordenadas e ambas podem exigir um valor limite diferente. Além disso, você pode tentar com diferentes bibliotecas python, eu recomendo fortemente o uso do scikit-learn.
dmh126
..erm, estou agrupando com base nas coordenadas GPS recebidas da API do Google, presumo que elas tenham formato padrão. Não?
Kaboom
Talvez cole aqui essas coordenadas, vou tentar descobrir isso.
precisa
dmh126 poderia estar certo: Goolge API está trabalhando com WGS84, este é um (World) Sistema Geodésico, não uma métrica
André

Respostas:

10

Eu fiz algumas pesquisas. Eu levei alguns pontos em dois sistemas de coordenadas não métricas (WGS84) e métricas (Polônia 1992).

Eu usei este código:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Então eu ajustei nosso modelo com dados métricos:

brc.fit(data90)

E plote os resultados, onde cruzamentos foram meus pontos e círculos foram meus subclusters:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Isto é o que eu tenho: insira a descrição da imagem aqui

Você pode ver que esse valor limite era muito pequeno, porque encontrou subcluster em cada ponto.

Definição do limiar:

O raio do sub-cluster obtido pela fusão de uma nova amostra e o sub-cluster mais próximo deve ser menor que o limite. Caso contrário, um novo sub-cluster é iniciado.

Portanto, neste caso, precisamos aumentar esse valor.

Para:

brc = Birch(threshold=5000)

foi muito melhor:

insira a descrição da imagem aqui

E o WGS84 aponta para o limite 0,5:

brc = Birch(threshold=0.5)
brc.fit(data84)

insira a descrição da imagem aqui

Apenas um subcluster, não é bom. Mas, neste caso, devemos diminuir o valor limite, portanto, para 0,05:

brc = Birch(threshold=0.05)
brc.fit(data84)

insira a descrição da imagem aqui

Temos bons resultados.

Conclusão:

O CRS é importante. Você precisa encontrar um valor limite adequado, depende dos sistemas de coordenadas dos dados e da distância entre os pontos. Se você tiver um CRS não métrico, o limite deverá ser relativamente menor que o do sistema métrico. Você precisa saber a diferença entre metros e graus, se a distância entre dois pontos for igual a 10000m, será menor que 1 grau no WGS84. Verifique o google para obter valores mais precisos.

Também há mais pontos que o valor n_clusters. Tudo bem, não existem centróides de clusters, mas sub-clusters. Se você tentar prever algo ou imprimir etiquetas, ele classificará seu ponto em uma das áreas n_clusters (ou pontos de impressão classificados em 0,1,2, ..., etiqueta n_clusters).

Se você não quiser experimentar parâmetros diferentes, sempre poderá usar outro algoritmo. Um algoritmo muito simples e comum para clustering é o algoritmo K-means.

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

Ele deve encontrar n clusters para seus dados sem se preocupar com limites etc.

dmh126
fonte