【问题标题】:Calculating euclidean distance from a dataframe with several column features从具有多个列特征的数据帧计算欧几里得距离
【发布时间】:2021-01-28 17:45:56
【问题描述】:

我有一个如下所示的数据框,我需要计算欧几里得距离。

a,b,c,d,e
10,11,13,14,9
11,12,14,15,10
12,13,15,16,11
13,14,16,17,12
14,15,17,18,13
15,16,18,19,14
16,17,19,20,15
17,18,20,21,16
18,19,21,22,17
19,20,22,23,18
20,21,23,24,19
21,22,24,25,20
22,23,25,26,21
23,24,26,27,22
24,25,27,28,23

我想只有 ab 这两个列特征,我可以轻松做到:

def euclidean_distance(a, b):
    return np.sqrt(np.sum((a - b)**2))

如何计算具有多个列特征(如 abcd, e 上面?

【问题讨论】:

  • “几列”是什么意思,欧几里得距离是两点之间的距离。你的意思是每一列对每一列?
  • 您可以简单地将 scikits euclidean_distances 应用于您的数据帧,因为它处理数组

标签: python pandas numpy dataframe euclidean-distance


【解决方案1】:

您的数据有(15 个维度,5 个点),如果我没记错的话,您想要每个点之间的欧几里得距离。

import numpy as np
import pandas as pd

# copied and pasted your data to a text file
df = pd.read_table("euclidean.txt", sep=',') 

> df.shape 
(15, 5)

(15,5) 距离矩阵将为5x5。初始化这个矩阵,使用for循环计算这5个点之间的欧几里得距离,并将它们填充到距离矩阵中。

n = df.shape[1] # this number is 5 for the dataset you provided
dm = np.zeros((n,n)) # initialize the distance matrix to zero

for i in range(n):
    for j in range(n):
        dm[i,j] = np.sqrt(np.sum((df.iloc[:,i] - df.iloc[:,j])**2))

dm 输出则为:

> dm
array([[ 0.        ,  3.87298335, 11.61895004, 15.49193338,  3.87298335],
       [ 3.87298335,  0.        ,  7.74596669, 11.61895004,  7.74596669],
       [11.61895004,  7.74596669,  0.        ,  3.87298335, 15.49193338],
       [15.49193338, 11.61895004,  3.87298335,  0.        , 19.36491673],
       [ 3.87298335,  7.74596669, 15.49193338, 19.36491673,  0.        ]])

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,您想为所有行创建一个距离矩阵吗?

    from scipy.spatial.distance import pdist, squareform
    df = pd.DataFrame([{'a':1,'b':2,'c':3}, {'a':4,'b':5,'c':6}])
    distances = squareform(pdist(df.values, metric='euclidean'))
    

    产生一个包含

    的矩阵
    array([[0.        , 5.19615242],
       [5.19615242, 0.        ]])
    

    【讨论】:

      【解决方案3】:

      cdist怎么样:

      from scipy.spatial.distance import cdist
      arr = df[['a','b','c','d']].values
      dist_mat = cdist(arr,arr)
      

      如果你不喜欢外包装,距离矩阵是:

      dist_mat = ((arr[None,:,:] - arr[:,None,:])**2).sum(-1)**.5
      

      【讨论】:

        猜你喜欢
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2020-11-11
        • 2020-11-29
        • 2018-02-14
        • 2020-06-19
        • 2014-10-27
        相关资源
        最近更新 更多