我正在比較使用pdistDIY Jaccard 距離矩陣函式處理資料集時得到的Jaccard 距離矩陣。我在輸出距離矩陣中得到了不同的結果,我不知道為什么。
我認為是以下原因之一:
- 我的jaccard距離計算的實作是錯誤的
scipy.spatial.distance.pdist(metric = 'jaccard')并scipy.spatial.distance.jaccard以不同的方式計算 jaccard 距離(似乎不太可能,因為它們都在scipy.spatial.distance)squareform正在對我的資料做一些事情,可能是標準化
squareform 的檔案有點超出我的理解,所以某種形式的標準化可能是正在發生的事情。然而,平方距離矩陣在單元格之間沒有相同的相對距離幅度,這令人困惑(例如,我的 DIY 距離矩陣中的第 0 行是0, 0.571429, 1,并且pdist是0, 1, 1- 中間值是 的兩倍pdist)。
誰能解釋為什么在使用相同的度量分析時我得到不同的距離矩陣?
我的代碼:
import numpy as np
from scipy.spatial.distance import jaccard, squareform, pdist
def jaccard_dissimilarity(feature_list1, feature_list2, filler_val): #binary
#I don't care about every value in the array for my use case, so dont want to include them in my comparison
all_features = set([i for i in feature_list1 if i != filler_val])
all_features.update(set([i for i in feature_list2 if i != filler_val]))
counts_1 = [1 if feature in feature_list1 else 0 for feature in all_features]
counts_2 = [1 if feature in feature_list2 else 0 for feature in all_features]
return jaccard(counts_1, counts_2)
data_array = np.array([[1, 2, 3, 4, 5],
[3, 4, 5, 6, 7],
[8, 9, 10, 11, 12]])
# =============================================================================
# DIY distance matrix
# =============================================================================
#set filler val to None, so the arrays being compared are equivalent to pdist
dist_diy = np.array([[jaccard_dissimilarity(a,b, None) for a in data_array] for b in data_array])
# =============================================================================
# pdist distance matrix
# =============================================================================
dist_pdist = squareform(pdist(data_array, metric = 'jaccard'))
輸入陣列:
1 2 3 4 5
3 4 5 6 7
8 9 10 11 12
dist_diy:
0 0.571429 1
0.571429 0 1
1 1 0
dist_pdist:
0 1 1
1 0 1
1 1 0
uj5u.com熱心網友回復:
看起來pdist在比較陣列時考慮給定索引處的物件,而不僅僅是陣列本身中存在哪些物件 - 如果我更改data_array[1]為3, 4, 5, 4, 5那么距離矩陣會更改以反映以下事實data_array[0][3:5] == data_array[1][3:5]:
0 0.6 1
0.6 0 1
1 1 0
此處討論了行為,但基于上述測驗,陣列不必是布林值(如果將陣列視為布林值,則距離矩陣不會改變,因為所有數字都 > 1,因此是 == True)。
DIY 功能考慮的是存在的物件而不是找到這些物件的索引,因此存在差異!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403526.html
標籤:
