2013-04-12 4 views
2

1000 개의 동질적인 단백질 시퀀스에 대한 거리 매트릭스 인 데이터 집합이 있습니다.sklearn.AffinityPropagation을 사용하는 출력 레이블

나는 이것을위한 친화 행렬을 계산할 수 있었다. (쉬운 계산 : 1 - 거리, 나의 경우에는).

기본적으로 Excel에서 데이터를 본 경우 머리글 행이없고 첫 번째 열은 시퀀스 이름이며 다음 1000 열은 거리 값입니다.

sklearn의 Affinity Propagation 사이트에 제공된 코드를 수정했습니다. 이것은 지금 모습입니다 :

print __doc__ 

import numpy as np 
from sklearn.cluster import AffinityPropagation 
from sklearn import metrics 
from sklearn.datasets.samples_generator import make_blobs 
import csv 

############################################################################## 
f = open('ha-sequences-sample-distmat2.csv', 'rU') 
csvreader = csv.reader(f) 

sequence_names = [] 
distance_matrix = [] 
full_data = [] 

for row in csvreader: 
# print row 

    sequence_names.append(row[0]) 
    distance_matrix.append(row[1:]) 
    full_data.append(row) 

f.close() 

distmat = np.array([row for row in distance_matrix]).astype(np.float) 

# print distmat 

affinity_matrix = np.array([1 - row for row in distmat]).astype(np.float) 

full_matrix = zip(sequence_names, affinity_matrix) 

# print affinity_matrix, sequence_names 




############################################################################## 
# Compute Affinity Propagation 
af = AffinityPropagation(affinity='precomputed').fit(affinity_matrix) 
cluster_centers_indices = af.cluster_centers_indices_ 
labels = af.labels_ 

n_clusters_ = len(cluster_centers_indices) 

print 'Estimated number of clusters: %d' % n_clusters_ 
print "Homogeneity: %0.3f" % metrics.homogeneity_score(sequence_names, labels) 
print "Completeness: %0.3f" % metrics.completeness_score(sequence_names, labels) 
print "V-measure: %0.3f" % metrics.v_measure_score(sequence_names, labels) 
print "Adjusted Rand Index: %0.3f" % \ 
    metrics.adjusted_rand_score(sequence_names, labels) 
print("Adjusted Mutual Information: %0.3f" % 
     metrics.adjusted_mutual_info_score(sequence_names, labels)) 
print("Silhouette Coefficient: %0.3f" % 
     metrics.silhouette_score(affinity_matrix, labels, metric='sqeuclidean')) 

############################################################################## 
# Plot result 
import pylab as pl 
from itertools import cycle 

pl.close('all') 
pl.figure(1) 
pl.clf() 

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk') 
for k, col in zip(range(n_clusters_), colors): 
    class_members = labels == k 
    cluster_center = affinity_matrix[cluster_centers_indices[k]] 
    pl.plot(affinity_matrix[class_members, 0], affinity_matrix[class_members, 1], col + '.') 
    pl.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col, 
      markeredgecolor='k', markersize=14) 
    for x in affinity_matrix[class_members]: 
     pl.plot([cluster_center[0], x[0]], [cluster_center[1], x[1]], col) 

pl.title('Estimated number of clusters: %d' % n_clusters_) 
pl.show() 

제가하는 데 문제는 이것이다 : 나는 각 클러스터에 해당하는 방법을 출력 시퀀스 이름을 알아낼 수 없습니다. 셸에 함께 클러스터 된 시퀀스를 출력하여 플롯에 클러스터 번호를 표시 할 수 있다면 좋겠지 만 플롯에 표시하지 않더라도 멋지 네요.

아무에게도이를 수행하는 방법을 알고 있습니까?

+1

생물학을 묻는 것이 좋습니다 : http://www.biostars.org/ – Pierre

+1

완전히 그것에 대해 알지 못했습니다. 피에르 감사합니다. – ericmjl

+0

@ 피에르 : 관심 밖 (나는 sklearn 개발자 중 한 명이지만 생물 학자는 아니지만), 해당 사이트에서 사용자가 scikit-learn 사용자를 볼 수 있습니까? –

답변

5

시퀀스 이름 목록 (sequence_names)과 클러스터 레이블 배열 (af.labels_)이 있습니다. 따라서 클러스터 레이블 배열을 반복하고 클러스터 레이블 목록에서 시퀀스 이름 목록을 유지할 수 있습니다. 예를 들어,

#for a simple example, assume the names and cluster labels are predefined 
sequence_names = ["a", "b", "c", "d"] 
labels = [0,1,1,0] 

from collections import defaultdict 
clusternames = defaultdict(list) 

for i, label in enumerate(labels): 
    clusternames[label].append(sequence_names[i]) 

#clusternames now holds a map from cluster label to list of sequence names 
#Print out the label with the list 
for k, v in clusternames.items(): 
    print k, v 
+0

아름답게 작동합니다! 고마워, 안도! – ericmjl

관련 문제