我正在尝试在Python中实现k近邻分类器,因此我想计算欧氏距离。我有一个数据集,我已经转换成一个大的numpy数组
[[ 0. 0. 4. ..., 1. 0. 1.]
[ 0. 0. 5. ..., 0. 0. 1.]
[ 0. 0. 14. ..., 16. 9. 1.]
...,
[ 0. 0. 3. ..., 2. 0. 3.]
[ 0. 1. 7. ..., 0. 0. 3.]
[ 0. 2. 10. ..., 0. 0. 3.]]
其中每行的最后一个元素表示该类。所以在计算欧氏距离时,我显然不想包含最后一个元素。我以为我可以做以下事情
for row in dataset:
distance = euclidean_distance(vector, row[:dataset.shape[1] - 1])
但仍然包含最后一个元素
print row
>>> [[ 0. 0. 4. ..., 1. 0. 1.]]
print row[:dataset.shape[1] - 1]
>>> [[ 0. 0. 4. ..., 1. 0. 1.]]
你可以看到两者都是一样的。
答案 0 :(得分:5)
您可以使用numpy切片对数据进行子集化。如果你发现自己在numpy数组上进行迭代,请停止并尝试找到一种利用numpy操作的矢量化特性的方法。
假设您的数组名为arr
:
data_points = arr[:,:-1]
classes = arr[:,-1]
要查找1d数组与2d数组的所有行之间的距离,您可以使用以下内容。假设1d数组为v
,而2d数组为arr
。
dist = np.power(arr - v, 2).sum(axis=1)
dist
将是一维距离数组。
以下函数采用2d数字数组,并使用给定的L-x距离测量返回成对距离的上对角矩阵(欧几里德距离度量是L = 2度量)。
def pairwise_distance(arr, L=2):
d = arr.shape[0]
out = np.zeros(d)
for f in range(1, d):
out[:-f].ravel()[f::d+1] = np.power(arr[:-f]-arr[f:], L).sum(axis=1)
return np.power(out, 1.0/L)