use*_*737 2 python arrays numpy
我正在尝试在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.]]
Run Code Online (Sandbox Code Playgroud)
每行的最后一个元素指示类。因此,在计算欧几里得距离时,我显然不想包含最后一个元素。我以为我可以做到以下几点
for row in dataset:
distance = euclidean_distance(vector, row[:dataset.shape[1] - 1])
Run Code Online (Sandbox Code Playgroud)
但这仍然包括最后一个元素
print row
>>> [[ 0. 0. 4. ..., 1. 0. 1.]]
print row[:dataset.shape[1] - 1]
>>> [[ 0. 0. 4. ..., 1. 0. 1.]]
Run Code Online (Sandbox Code Playgroud)
如您所见,两者是相同的。
您可以使用numpy切片对数据进行子集化。如果发现自己遍历numpy数组,请停止并尝试找到一种利用numpy操作的矢量化性质的方法。
假设您的数组称为arr:
data_points = arr[:,:-1]
classes = arr[:,-1]
Run Code Online (Sandbox Code Playgroud)
要查找一维数组与二维数组所有行之间的距离,可以使用以下方法。假设1d数组为v,2d数组为arr。
dist = np.power(arr - v, 2).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)
dist 将是一维距离数组。
以下函数采用2d数字数组,并使用给定的Lx距离度量(欧几里得距离度量为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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10284 次 |
| 最近记录: |