描述: 以下代码接收具有n维的两个点的坐标。它计算这两个点的manhanttan距离 代码:
def manhanttan( ponto1, ponto2 ):
totalp1 = 0
totalp2 = 0
for x in range( 0, len( ponto1 ) ):
totalp1 += ponto1[x]
totalp2 += ponto2[x]
return abs( totalp1 - totalp2 )
和
def manhanttan( ponto1, ponto2 ):
total = 0
for x in range( 0, len( ponto1 ) ):
total += abs( ponto1[x] - ponto2[x] )
return total
给出了不同的结果,我不知道为什么。有人可以帮帮我吗?
PS:列表中的所有值都是正数
PS2:第一个我的分类得到
K1: Expected Class: 6, Found Class: 0
K2: Expected Class: 6, Found Class: 0
K3: Expected Class: 6, Found Class: 0
K4: Expected Class: 6, Found Class: 0
K5: Expected Class: 6, Found Class: 0
和另一个我得到
K1: Expected Class: 6, Found Class: 6
K2: Expected Class: 6, Found Class: 6
K3: Expected Class: 6, Found Class: 6
K4: Expected Class: 6, Found Class: 6
K5: Expected Class: 6, Found Class: 6
答案 0 :(得分:3)
为什么你认为他们应该是一样的?
考虑只汇总一个数字序列:
a = [1, -1, 1, -1, 1, -1]
如果你把绝对值作为总和,那么你实际上是在对序列求和:
a = [1, 1, 1, 1, 1, 1]
将导致总数报告为6
。但是,如果你等到最后,要获取绝对值,你得到a
(0
)之和,并取绝对值0
。
*注意 - 仅仅因为每个列表中的所有值都是正数并不意味着它们的差异。例如
ponto1[x] - ponto2[x]
仍可能否定。
答案 1 :(得分:1)
它不应该提供保存结果。
考虑p1 = [0,1]
和p2 = [1,0]
。
然后abs(sum(p1)-sum(p2))
给出0,其中sum(abs(p1-p2))
给出2。
总和的分布属性为您提供abs(sum(p1)-sum(p2)) == abs(sum(p1-p2))
,因此一旦计算出总差异,您应该只取绝对值。
顺便说一下,sum
是一个内置的python函数,完全按照你的想法行事。
答案 2 :(得分:0)
你的第二个功能是计算两个向量之间的曼哈顿距离,即每个单独维度相隔多远的总和。第一个函数在取得差异之前将每个向量减少为单个数字;假设所有坐标都是正的,这意味着它需要从origo到每个向量的曼哈顿距离,然后取这些坐标的差异。这是一个非常不同的功能!
考虑这对2D矢量:
y
5 a
4
3
2 b
1
0 o
0 1 2 3 4 5 x
这里我们的原点是(0,0),a(1,5)和b(4,2)。要从a到b,我需要移动ba =(4-1,2-5)=(3,-3),总和为(map(abs,[3,-3]))= 6脚步。但是从o到a是6步,同样从o到b,所以减少第一种方法认为a和b相等,即使它们碰巧在相同的距离线上运行(6,0)和(0) ,6)(因为相当于一个圆的曼哈顿距离实际上是一个菱形,一个45°旋转的方形)。