我正在使用以下链接创建“欧几里德相似度矩阵”(我将其转换为 DataFrame)。 https://stats.stackexchange.com/questions/53068/euclidean-distance-score-and-similarity http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance .euclidean.html
我这样做的方式是一种有效的迭代方法,但当数据集很大时需要一段时间。 pandas pd.DataFrame.corr() 对于皮尔逊相关性来说非常快速且有用。
如何在不进行详尽迭代的情况下执行欧几里得相似性度量?
我的天真代码如下:
#Euclidean Similarity
#Create DataFrame
DF_var = pd.DataFrame.from_dict({"s1":[1.2,3.4,10.2],"s2":[1.4,3.1,10.7],"s3":[2.1,3.7,11.3],"s4":[1.5,3.2,10.9]}).T
DF_var.columns = ["g1","g2","g3"]
# g1 g2 g3
# s1 1.2 3.4 10.2
# s2 1.4 3.1 10.7
# s3 2.1 3.7 11.3
# s4 1.5 3.2 10.9
#Create empty matrix to fill
M_euclid = np.zeros((DF_var.shape[1],DF_var.shape[1]))
#Iterate through DataFrame columns to measure euclidean distance
for i in range(DF_var.shape[1]):
u = DF_var[DF_var.columns[i]]
for j in range(DF_var.shape[1]):
v = DF_var[DF_var.columns[j]]
#Euclidean distance -> Euclidean similarity
M_euclid[i,j] = (1/(1+sp.spatial.distance.euclidean(u,v)))
DF_euclid = pd.DataFrame(M_euclid,columns=DF_var.columns,index=DF_var.columns)
# g1 g2 g3
# g1 1.000000 0.215963 0.051408
# g2 0.215963 1.000000 0.063021
# g3 0.051408 0.063021 1.000000
原文由 O.rka 发布,翻译遵循 CC BY-SA 4.0 许可协议
scipy.spatial.distance
中有两个有用的函数,您可以为此使用:pdist
和squareform
。使用pdist
将为您提供观测值之间的成对距离作为一维数组,而squareform
将其转换为距离矩阵。一个问题是
pdist
默认使用距离度量,而不是相似度,因此您需要手动指定相似度函数。从代码中的注释输出来看,您的 DataFrame 也不在方向pdist
期望的方向,所以我撤消了您在代码中所做的转置。