2016-02-05 150 views
1

我試圖瞭解numpy在嘗試調用兩個行向量的點積時是如何工作的。在Python中計算兩個numpy行數組(向量)的點積給出了一個形狀向量

我有這樣的代碼:

X = np.array([[1,2,3]]) 
THETA = np.array([[1,2,3]]) 
print X.dot(THETA) 

這給我的錯誤:

ValueError: shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

我認爲你可以採取兩種行向量的點積然而得到:

x1*theta1 + x2*theta2 + x3*theta3 

而且這也會轉移到點積的兩列向量。

怪異的一部分是,我不得不採取第二矩陣的轉置,以實際使用的點積:

print X.dot(THETA.T) 
array([[14]]) 

但是,我沒想到這會實際工作,以及爲什麼它將工作,而不是隻做點行操作。任何人都可以幫助我理解發生了什麼?線性代數中的某些規則是否早已忘記?

+0

你爲什麼代表矢量作爲二維數組?矢量是1D。取下額外的一組括號。 – Will

+1

@將它計算機器學習任務的感知器決策邊界的公式的一部分。我的猜測是我們必須有一個正確的形狀供以後計算。但是,我看到他使用代碼「X.dot(THETA.T)」來計算線性響應,並且我很難理解爲什麼他必須轉置它。 – Alex

回答

1

dot對於2D輸入是矩陣乘法,而不是點乘積。你所看到的只是矩陣乘法正常規則的結果。如果你想要一個向量的點積,最簡單的方法是使用一維向量,沒有多餘的第二個維度:

X = np.array([1, 2, 3]) 
THETA = np.array([1, 2, 3]) 
print X.dot(THETA) 

dot -ting兩個一維數組需要一個點積和產生一個標量的結果。

如果您想要使用行列向量,那麼通過矩陣乘法的標準規則,您需要將N乘1的數組(一個行向量)乘以一個N乘1的數組(一列向量)得到1乘1的結果,NumPy會給你一個1乘1的數組而不是標量。

0

您看到的對齊錯誤是因爲您試圖將一維矢量表示爲二維數組。

In [1]: import numpy as np 

In [2]: X = np.array([1,2,3]) 

In [3]: THETA = np.array([1,2,3]) 

In [4]: print X.dot(THETA) 
14 

In [5]: print X.dot(THETA.T) 
14 

和:

x1*theta1 + x2*theta2 + x3*theta3 = 
1*1 + 2*2 + 3*3 = 
14 
相關問題