2016-01-30 26 views
1

我的目標是使用scikit中的DBSCAN和預先計算的相似性矩陣執行聚類。 我有一個功能列表。我做成對生成列表的唯一對,並具有計算對之間相似性的函數。現在我想將它轉換爲可用作聚類算法輸入的對稱矩陣。 我認爲groupby可能會有幫助,但我不知道如何去做。以下是一個示例代碼,其中列出了具有距離度量的對。原始列表中的id字段是唯一的行標識符。從成對scikit的成對列表python中創建一個對稱矩陣,DBSCAN

def add_similarity(listdict): 
    random.seed(10) 
    newlistdist=[] 
    for tup_dict in listdict: 
     newdict={} 
     tup0=tup_dict[0] 
     tup1=tup_dict[1] 
     for key,value in tup0.items(): 
      newdict[key +"_1"]=value 
     for key,value in tup1.items(): 
      newdict[key+"_2"]=value 
     newdict["similarity"]=random.random()  
     newlistdist.append(newdict)     
    return newlistdist 


def generatesymm(): 
    listdict =[{'feature1': 4, 'feature2':2,"id": 100},{'feature1': 3, 'feature2': 2,"id":200},{'feature1': 4, 'feature2':2,"id": 300}] 
    pairs=list(itertools.combinations(listdict, 2)) 
    newlistdict=add_similarity(pairs) 

如果我運行這段代碼這給

[{'id_2': 200, 'feature1_2': 3, 'feature2_2': 2, 'feature2_1': 2, 'feature1_1': 4, 'similarity': 0.571, 'id_1': 100},  


{'id_2': 300, 'feature1_2': 4, 'feature2_2': 2, 'feature2_1': 2, 'feature1_1': 4, 'similarity': 0.42, 'id_1': 100}, 


{'id_2': 300, 'feature1_2': 4, 'feature2_2': 2, 'feature2_1': 2, 'feature1_1': 3, 'similarity': 0.578, 'id_1': 200}] 

輸出我需要

  100  200  300 


100  1   0.571  0.42 


200  0.571  1   0.578 


300  0.428  0.578  1 
+0

如何在'[X,Y使用'for'循環,並將該值存儲一次]'一旦在'[y,x]'? –

+0

@ Anony-Mousse 使用for循環執行此操作對於大型矩陣並不可行。您可能會遇到內存問題。 –

+0

@ColinAnthony內存問題與是否使用for循環無關。 *預計算*矩陣方法總是嚴重縮放,但這是他的要求。 –

回答

2

這是我不清楚哪裏id_3從何而來,但下面是使一種方式你的數據幀。訣竅是使用numpy來索引矩陣的上下三角部分。

In [679]: 
import numpy as np 
import pandas as pd 
similarities = [x["similarity"] for x in newlistdict] 
names = ['id_'+str(x) for x in range(1,4)] 
n = len(similarities) 
iuu = np.mask_indices(3, np.triu, 1) 
iul = np.mask_indices(3, np.tril, -1) 
mat = np.eye(n) 
mat[iuu] = similarities 
mat[iul] = similarities 
df = pd.DataFrame(mat,columns=names) 
df.index = names 
df 

Out[679]: 
     id_1  id_2  id_3 
id_1 1.000000 0.896082 0.897818 
id_2 0.896082 1.000000 0.186298 
id_3 0.897818 0.186298 1.000000 

(該值從你的問題不同,因爲我不知道你使用的隨機種子。)

+0

原始列表中的id字段(在成對之前)包含記錄的唯一標識。成對後,每行都由名稱id_1,id_2中的值唯一標識。最後[id_1] [id_3]對於值爲id = 1和id = 3的記錄應該具有相似性值。如果原始列表有5條記錄,則成對給出10個組合。矩陣是10 * 10,其中行和列名稱對應於原始ID字段的唯一值。 – AMisra