我的目標是使用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
如何在'[X,Y使用'for'循環,並將該值存儲一次]'一旦在'[y,x]'? –
@ Anony-Mousse 使用for循環執行此操作對於大型矩陣並不可行。您可能會遇到內存問題。 –
@ColinAnthony內存問題與是否使用for循環無關。 *預計算*矩陣方法總是嚴重縮放,但這是他的要求。 –