2014-10-29 94 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函數,它完全符合您的想法。