Biopython - Phân tích cụm
Nói chung, phân tích cụm là nhóm một tập hợp các đối tượng trong cùng một nhóm. Khái niệm này chủ yếu được sử dụng trong khai thác dữ liệu, phân tích dữ liệu thống kê, học máy, nhận dạng mẫu, phân tích hình ảnh, tin sinh học, v.v. Nó có thể đạt được bằng các thuật toán khác nhau để hiểu cách cụm được sử dụng rộng rãi trong các phân tích khác nhau.
Theo Bioinformatics, phân tích cụm chủ yếu được sử dụng trong phân tích dữ liệu biểu hiện gen để tìm các nhóm gen có biểu hiện gen tương tự.
Trong chương này, chúng ta sẽ kiểm tra các thuật toán quan trọng trong Biopython để hiểu các nguyên tắc cơ bản của việc phân cụm trên một tập dữ liệu thực.
Biopython sử dụng mô-đun Bio.Cluster để triển khai tất cả các thuật toán. Nó hỗ trợ các thuật toán sau:
- Phân cụm phân cấp
- K - Phân cụm
- Bản đồ tự tổ chức
- Phân tích thành phần chính
Hãy để chúng tôi giới thiệu ngắn gọn về các thuật toán trên.
Phân cụm phân cấp
Phân cụm phân cấp được sử dụng để liên kết mỗi nút bằng thước đo khoảng cách với hàng xóm gần nhất của nó và tạo một cụm. Nút Bio.Cluster có ba thuộc tính: trái, phải và khoảng cách. Hãy để chúng tôi tạo một cụm đơn giản như hình dưới đây -
>>> from Bio.Cluster import Node
>>> n = Node(1,10)
>>> n.left = 11
>>> n.right = 0
>>> n.distance = 1
>>> print(n)
(11, 0): 1
Nếu bạn muốn xây dựng phân cụm dựa trên cây, hãy sử dụng lệnh dưới đây:
>>> 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
Hãy để chúng tôi thực hiện phân nhóm phân cấp bằng mô-đun Bio.Cluster.
Coi khoảng cách được xác định trong một mảng.
>>> import numpy as np
>>> distance = array([[1,2,3],[4,5,6],[3,5,7]])
Bây giờ thêm mảng khoảng cách trong cụm cây.
>>> from Bio.Cluster import treecluster
>>> cluster = treecluster(distance)
>>> print(cluster)
(2, 1): 0.666667
(-1, 0): 9.66667
Hàm trên trả về một đối tượng cụm cây. Đối tượng này chứa các nút trong đó số lượng mục được nhóm lại dưới dạng hàng hoặc cột.
K - Phân cụm
Nó là một loại thuật toán phân vùng và được phân loại thành phân cụm k - phương tiện, trung bình và trung gian. Hãy để chúng tôi hiểu ngắn gọn từng cụm.
K-có nghĩa là phân cụm
Cách tiếp cận này phổ biến trong khai thác dữ liệu. Mục tiêu của thuật toán này là tìm các nhóm trong dữ liệu, với số lượng nhóm được đại diện bởi biến K.
Thuật toán hoạt động lặp đi lặp lại để gán mỗi điểm dữ liệu cho một trong K nhóm dựa trên các tính năng được cung cấp. Các điểm dữ liệu được phân nhóm dựa trên sự giống nhau về tính năng.
>>> 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
K-medians Clustering
Nó là một loại thuật toán phân cụm khác tính toán giá trị trung bình cho mỗi cụm để xác định trọng tâm của nó.
K-medoids Clustering
Cách tiếp cận này dựa trên một tập hợp các mục nhất định, sử dụng ma trận khoảng cách và số lượng cụm được người dùng chuyển qua.
Hãy xem xét ma trận khoảng cách như được định nghĩa dưới đây:
>>> distance = array([[1,2,3],[4,5,6],[3,5,7]])
Chúng ta có thể tính toán cụm k-medoids bằng lệnh dưới đây:
>>> from Bio.Cluster import kmedoids
>>> clusterid, error, found = kmedoids(distance)
Chúng ta hãy xem xét một ví dụ.
Hàm kcluster lấy ma trận dữ liệu làm đầu vào chứ không phải các thể hiện Seq. Bạn cần chuyển đổi các chuỗi của mình thành ma trận và cung cấp điều đó cho hàm kcluster.
Một cách để chuyển đổi dữ liệu thành ma trận chỉ chứa các phần tử số là sử dụng numpy.fromstringchức năng. Về cơ bản, nó dịch từng chữ cái theo một trình tự sang bản sao ASCII của nó.
Điều này tạo ra một mảng 2D gồm các chuỗi được mã hóa mà hàm kcluster nhận ra và sử dụng để phân cụm các chuỗi của bạn.
>>> 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]
Bản đồ tự tổ chức
Cách tiếp cận này là một kiểu mạng nơ-ron nhân tạo. Nó được phát triển bởi Kohonen và thường được gọi là bản đồ Kohonen. Nó tổ chức các mục thành các cụm dựa trên cấu trúc liên kết hình chữ nhật.
Hãy để chúng tôi tạo một cụm đơn giản bằng cách sử dụng cùng một khoảng cách mảng như hình dưới đây:
>>> 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]]
Đây, clusterid là một mảng có hai cột, trong đó số hàng bằng số lượng mục được nhóm lại và data là một mảng có kích thước là hàng hoặc cột.
Phân tích thành phần chính
Phân tích thành phần chính rất hữu ích để trực quan hóa dữ liệu chiều cao. Nó là một phương pháp sử dụng các phép toán ma trận đơn giản từ đại số tuyến tính và thống kê để tính toán một phép chiếu của dữ liệu gốc vào cùng một số hoặc ít kích thước hơn.
Phân tích thành phần chính trả về một tuple cột, tọa độ, thành phần và giá trị riêng. Chúng ta hãy xem xét những điều cơ bản của khái niệm này.
>>> 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.]
Hãy để chúng tôi áp dụng cùng một dữ liệu ma trận hình chữ nhật cho mô-đun Bio.Cluster như được định nghĩa bên dưới:
>>> 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.]