1
resposta

scipy.cluster.hierarchy.linkage -> Length n of condensed distance matrix 'y' must be a binomial coefficient

Segui o método do professor para gerar um dendrograma sobre a relação de gêneros de filmes no conjunto de dados Y. Mas quando eu rodei o linkage, deu o seguinte erro:

ValueError: Length n of condensed distance matrix 'y' must be a binomial coefficient, i.e.there must be a k such that (k \choose 2)=n)!

Encontrei no stackoverflow a seguinte solução:

Replace this:

Z = linkage(Y)

with:

Z = linkage(np.reshape(Y, (len(Y), 1)))

Ou seja, os dados foram de

array([ 9, 28, 13, ..., 18,  6, 24])

para

array([[ 9],
       [28],
       [13],
       ...,
       [18],
       [ 6],
       [24]])

E meu cógido rodou, mas não entendi porque a alteração no formato funcionou de fato. Alguém saberia me explicar?

1 resposta

Oi Faiçal! Tudo bom com você?

Primeiro, desculpe pela demora em te responder.

O método linkage precisa de uma entrada em array bidimensional para que ele funcione corretamente. Isso se deve graças a forma como o cluster hierárquico funciona, pois o cálculo é baseado no mínimo de duas distâncias entre cada ponto a partir da matriz de distância. Um array bidimensional é um array formado por um conjunto de linhas e colunas, o que é diferente de um array unidimensional que é formado apenas por uma linha. Imagine uma base de dados definida por:

indexValor
0=[9]
1=[28]
2=[13]
3=[18]
4=[6]
5=[24]

A matriz de distância é a base do cálculo do cluster e é calculada pela distância Euclidiana da base de vetores. Essa distância é calculada seguindo a fórmula abaixo:

Distancia Euclidiana = sqrt( (x2 -x1)**2 + (y2-y1)**2 )

Onde x representa o primeiro e y o segundo elemento elemento da linha da matriz . Se existissem mais elementos nas linhas da matriz eles devem ser adicionados na equação.

Uma matriz de distância é caracterizada por ser simétrica e sua diagonal principal formada por zeros assim como mostrado abaixo

12345
10
20
30
40
50

Cada um desses espaços vazios é preenchido pelo resultado da distância euclidiana. Por exemplo, o ponto (2,2) da matriz de distância pode ser calculado utilizando a equação a distância euclidiana:

Distancia Euclidiana (2,2) = sqrt( (9 -28)**2 )
Distancia Euclidiana (2,2) = 19

Note que, por não existir mais elementos na lista, a segunda parte da equação da distância euclidiana é desconsiderada (y2-y1)**2 = 0. Seguindo a mesma lógica teremos uma matriz de distância dada por

12345
10
2190
34150
491050
53227120

Note que, para construir a matriz de distância, foi necessário que existisse uma matriz, afinal a lógica da equação de distância euclidiana deve ser seguida e o método linkage utiliza a mesma lógica de cálculo.

No caso do seu código inicial, você utilizou um array unidimensional como parâmetro ao método linkage, porém esse tipo de array não é um padrão suportado desse método já que não segue a lógica do cálculo de cluster hierárquico explicado acima. Quando você utilizou Z = linkage(np.reshape(Y, (len(Y), 1))), você alterou o array para se tornar uma array bidimensional em que cada elemento representou uma linha desse array, o que permitiu que o método conseguisse seguir a lógica correta.

Eu espero ter te ajudado! Se surgir outra dúvida estarei disposta a ajudar ;-)

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!