2014-10-29 93 views
-1

描述: 下面的代码接收n维的两个点的坐标。它计算论文的manhanttan距离的两个点 的代码:python中的两个代码应该给出相同的结果,但它们不包含

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

(NB:您的代码片断混合制表符和空格,它不应该) – user3666197 2014-10-29 16:31:46

+0

因为它们实现两个不同的东西.... 考虑P1 = [-2,2] P2 = [0,0] – igon 2014-10-29 16:32:39

+0

丝毫什么输入你得到不同的结果? – Kasramvd 2014-10-29 16:33:48

回答

0

你的第二个功能是计算两个矢量之间的曼哈顿距离,即每个单独维度有多远。第一个函数将每个向量减少为一个数字,然后才会产生差异;假设所有的坐标都是正值,这意味着需要从原点到每个矢量的曼哈顿距离,然后取这些差值。这是一个非常不同的功能!

考虑这对2D向量:

y 
5 a 
4 
3 
2   b 
1 
0 o 
    0 1 2 3 4 5 x 

在这里,我们具有在(0,0)ORIGO,一个在(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°旋转的正方形)。

+0

哦,我明白了。这帮助了我很多。谢谢。我没有看到那个错误 – Victor 2014-10-29 17:03:11

3

你为什么认为他们应该是一样的吗?

考虑仅加数字的单一序列:

a = [1, -1, 1, -1, 1, -1] 

如果你总取绝对值,那么你实际上是在总结顺序:

a = [1, 1, 1, 1, 1, 1] 

这将导致总共被报告为6。但是,如果您等到最后,取绝对值,您将得到总和a0)并取绝对值仍然为0

*注意 - 仅仅因为每个列表中的所有值都是正数并不意味着它们的差异是。例如
ponto1[x] - ponto2[x]仍可能是

+0

所有值均为正值。我忘了提及 – Victor 2014-10-29 16:34:01

+0

@ user3624195看到我的补充说明。 – mgilson 2014-10-29 16:34:37

+0

但是,如果我 ' A = [1,2,3,4,5,6] B = [3,4,5,6,7,8] 总量a == 21 共计b == 33 总量a - totalB == 12 ' 如果我为每个值做同样的结果 – Victor 2014-10-29 16:36:26

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函数,它完全符合您的想法。