2017-02-20 20 views
-1
def dot(x, y): 
    return sum([ x[i]*y[i] for i in range(1,10)]) 

def magnitude(x): 
    return math.sqrt(sum([x[i]*x[i] for i in range(1,10)])) 

def cosine_similarity(x, y): 
    x = dot(x, y)/(magnitude(x)*magnitude(y)) 
    print(x) 
    print(math.acos(x)) 
    return math.acos(x)/math.pi 

這是我的python代碼。我試圖找到兩個向量表示爲列表的角度。當我運行這段代碼,輸出爲:有效輸入python math.acos中的域錯誤

1.0 
Traceback (most recent call last): 
    File "problem5.py", line 64, in <module> 
    print(cosine_similarity(reservoir[0][0], reservoir[0][0])) 
    File "problem5.py", line 41, in cosine_similarity 
    print(math.acos(x)) 
ValueError: math domain error 

如果我在控制檯類型或文件 math.acos(1.0) 它準確地給了我0.1我已經做了類型檢查,等等,一切似乎查看。

+0

您正在覆蓋參數'x'。避免它 –

+0

運行該代碼不會顯示任何內容。請顯示調用您的'cosine_similarity()'函數的代碼(可能縮小爲小尺寸)並給出錯誤。參考[如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 –

+0

什麼版本的Python? –

回答

0

您遇到舍入問題。由於浮動四捨五入錯誤,x可能會採用類似1.0000000000000002的值,因此會觸發錯誤。您可以用numpy.acos替換math.acos以靜靜地觀察附加內容。