欧几里德距离

时间:2018-02-25 10:56:46

标签: python numpy scikit-learn

我是Python的新手,我正在努力创建两个浮点数组,并找到两个数组之间的最小欧几里德距离。我的注释代码到目前为止。输出似乎高达5.5856060906150971。会喜欢任何输入。我想我做错了很多事。

>>> import numpy as np
>>> import sklearn as sk
>>> from sklearn import preprocessing

//arrays
>>> data1 = []
>>> data2 = []
>>> for x in range(0,30):
...     data1.append(np.random.uniform(0.0,10.0))
...     data2.append(np.random.uniform(0.0,10.0))

//scale data 
//something wrong in here?
>>> scaledData1 = sk.preprocessing.scale(data1)
>>> scaledData2 = sk.preprocessing.scale(data2)

//calc distance
>>> distances = []
>>> for line in scaledData1:
...     distance = np.linalg.norm(line - scaledData2)
...     distances.append(distance)

//min distance
>>> np.min(distances)

1 个答案:

答案 0 :(得分:1)

Numpy数组而不是列表

您可以利用numpy有效地创建数组,而不是使用列表。您的代码的第一次修改将是:

import numpy as np
import sklearn as sk
from sklearn import preprocessing

data1 = np.random.uniform(0.0,10.0,30) # array size is the third parameter
data2 = np.random.uniform(0.0,10.0,30) # same thing here

缩放numpy数组应该比列表更好。您对“缩放”的呼吁没有任何问题

计算数组之间的最小距离

您可以按如下方式使用Scipy's distance matrix

首先从缩放的数组中创建1d向量:

scaledData1 = sk.preprocessing.scale(data1).reshape(-1,1)
scaledData2 = sk.preprocessing.scale(data2).reshape(-1,1)

计算距离矩阵并得到它的最小值:

from scipy.spatial import distance_matrix # you can put that at the beginning of your code



distMatrix = distance_matrix(scaledData1,scaledData2) #l2 distance by default

minimalDistance = distMatrix.min()

在我的测试中,我将5.4e-2作为最小距离,接近0,正如人们对均匀分布所期望的那样。