Biopython - Análise de Cluster

Em geral, a análise de cluster agrupa um conjunto de objetos no mesmo grupo. Este conceito é usado principalmente em mineração de dados, análise estatística de dados, aprendizado de máquina, reconhecimento de padrões, análise de imagens, bioinformática, etc. Ele pode ser alcançado por vários algoritmos para entender como o cluster é amplamente utilizado em diferentes análises.

De acordo com a Bioinformática, a análise de agrupamento é usada principalmente na análise de dados de expressão gênica para encontrar grupos de genes com expressão gênica semelhante.

Neste capítulo, verificaremos algoritmos importantes no Biopython para entender os fundamentos do agrupamento em um conjunto de dados real.

Biopython usa o módulo Bio.Cluster para implementar todos os algoritmos. Ele suporta os seguintes algoritmos -

  • Agrupamento hierárquico
  • K - Clustering
  • Mapas auto-organizáveis
  • Análise do componente principal

Vamos fazer uma breve introdução sobre os algoritmos acima.

Agrupamento hierárquico

O clustering hierárquico é usado para ligar cada nó por uma medida de distância ao seu vizinho mais próximo e criar um cluster. O nó Bio.Cluster possui três atributos: esquerda, direita e distância. Vamos criar um cluster simples como mostrado abaixo -

>>> from Bio.Cluster import Node 
>>> n = Node(1,10) 
>>> n.left = 11 
>>> n.right = 0 
>>> n.distance = 1 
>>> print(n) 
(11, 0): 1

Se você quiser construir um cluster baseado em árvore, use o comando abaixo -

>>> n1 = [Node(1, 2, 0.2), Node(0, -1, 0.5)] >>> n1_tree = Tree(n1) 
>>> print(n1_tree) 
(1, 2): 0.2 
(0, -1): 0.5 
>>> print(n1_tree[0]) 
(1, 2): 0.2

Vamos realizar o clustering hierárquico usando o módulo Bio.Cluster.

Considere que a distância é definida em uma matriz.

>>> import numpy as np 
>>> distance = array([[1,2,3],[4,5,6],[3,5,7]])

Agora adicione a matriz de distância no cluster de árvore.

>>> from Bio.Cluster import treecluster 
>>> cluster = treecluster(distance) 
>>> print(cluster) 
(2, 1): 0.666667 
(-1, 0): 9.66667

A função acima retorna um objeto Tree cluster. Este objeto contém nós onde o número de itens são agrupados como linhas ou colunas.

K - Clustering

É um tipo de algoritmo de particionamento e classificado em k - médias, medianas e agrupamento de medoides. Vamos entender cada um dos agrupamentos resumidamente.

Clustering K-means

Essa abordagem é popular na mineração de dados. O objetivo deste algoritmo é encontrar grupos nos dados, com o número de grupos representado pela variável K.

O algoritmo funciona iterativamente para atribuir cada ponto de dados a um dos K ​​grupos com base nos recursos fornecidos. Os pontos de dados são agrupados com base na similaridade de recursos.

>>> from Bio.Cluster import kcluster 
>>> from numpy import array 
>>> data = array([[1, 2], [3, 4], [5, 6]]) 
>>> clusterid, error,found = kcluster(data) 
>>> print(clusterid) [0 0 1] 
>>> print(found) 
1

Agrupamento de K-medianas

É outro tipo de algoritmo de agrupamento que calcula a média de cada agrupamento para determinar seu centróide.

Agrupamento de K-medoides

Essa abordagem é baseada em um determinado conjunto de itens, utilizando a matriz de distância e o número de clusters passados ​​pelo usuário.

Considere a matriz de distância conforme definido abaixo -

>>> distance = array([[1,2,3],[4,5,6],[3,5,7]])

Podemos calcular o agrupamento de k-medoides usando o comando abaixo -

>>> from Bio.Cluster import kmedoids 
>>> clusterid, error, found = kmedoids(distance)

Vamos considerar um exemplo.

A função kcluster recebe uma matriz de dados como entrada e não instâncias Seq. Você precisa converter suas sequências em uma matriz e fornecer isso para a função kcluster.

Uma maneira de converter os dados em uma matriz contendo apenas elementos numéricos é usando o numpy.fromstringfunção. Basicamente, ele traduz cada letra em uma sequência para sua contraparte ASCII.

Isso cria uma matriz 2D de sequências codificadas que a função kcluster reconheceu e usa para agrupar suas sequências.

>>> from Bio.Cluster import kcluster 
>>> import numpy as np 
>>> sequence = [ 'AGCT','CGTA','AAGT','TCCG'] 
>>> matrix = np.asarray([np.fromstring(s, dtype=np.uint8) for s in sequence]) 
>>> clusterid,error,found = kcluster(matrix) 
>>> print(clusterid) [1 0 0 1]

Mapas auto-organizáveis

Essa abordagem é um tipo de rede neural artificial. Ele é desenvolvido por Kohonen e frequentemente chamado de mapa de Kohonen. Ele organiza itens em clusters com base na topologia retangular.

Vamos criar um cluster simples usando a mesma distância de matriz mostrada abaixo -

>>> from Bio.Cluster import somcluster 
>>> from numpy import array 
>>> data = array([[1, 2], [3, 4], [5, 6]]) 
>>> clusterid,map = somcluster(data) 

>>> print(map) 
[[[-1.36032469 0.38667395]] 
   [[-0.41170578 1.35295911]]] 

>>> print(clusterid) 
[[1 0]
   [1 0]
   [1 0]]

Aqui, clusterid é uma matriz com duas colunas, onde o número de linhas é igual ao número de itens que foram agrupados, e data é uma matriz com dimensões tanto linhas quanto colunas.

Análise do componente principal

A Análise de Componentes Principais é útil para visualizar dados de alta dimensão. É um método que usa operações de matriz simples de álgebra linear e estatísticas para calcular uma projeção dos dados originais no mesmo número ou menos dimensões.

Análise de componente principal retorna uma média de coluna de tupla, coordenadas, componentes e valores próprios. Vejamos os fundamentos desse conceito.

>>> from numpy import array 
>>> from numpy import mean 
>>> from numpy import cov 
>>> from numpy.linalg import eig 

# define a matrix 
>>> A = array([[1, 2], [3, 4], [5, 6]]) 

>>> print(A) 
[[1 2]
   [3 4]
   [5 6]] 
 
# calculate the mean of each column 
>>> M = mean(A.T, axis = 1) 
>>> print(M) 
[ 3. 4.] 

# center columns by subtracting column means 
>>> C = A - M

>>> print(C) 
[[-2. -2.]
   [ 0. 0.]
   [ 2. 2.]] 

# calculate covariance matrix of centered matrix 
>>> V = cov(C.T) 

>>> print(V) 
[[ 4. 4.]
   [ 4. 4.]] 
 
# eigendecomposition of covariance matrix 
>>> values, vectors = eig(V) 

>>> print(vectors) 
[[ 0.70710678 -0.70710678]
   [ 0.70710678 0.70710678]] 
 
>>> print(values) 
[ 8. 0.]

Vamos aplicar os mesmos dados de matriz retangular ao módulo Bio.Cluster conforme definido abaixo -

>>> from Bio.Cluster import pca 
>>> from numpy import array 
>>> data = array([[1, 2], [3, 4], [5, 6]]) 
>>> columnmean, coordinates, components, eigenvalues = pca(data) 
>>> print(columnmean) 
[ 3. 4.] 
>>> print(coordinates) 
[[-2.82842712 0. ]
   [ 0.         0. ]
   [ 2.82842712 0. ]] 
>>> print(components) 
[[ 0.70710678 0.70710678]
   [ 0.70710678 -0.70710678]] 
>>> print(eigenvalues) 
[ 4. 0.]