我有一個用戶“首選項”表的數據集,該表的一個實例如下所示:print(user_normalized[1].reshape(1, -1).shape)print(user_normalized[1].reshape(1, -1))___________________________________________________________________(1, 20)[[0. 0.00239107 0.00131709 0. 0.00355872 0.00212352 0.00300639 0.00044287 0.001469 0.00358637 0.01520913 0. 0. 0. 0.00174978 0.00237691 0.0026616 0.00241604 0. 0. ]]這給了我第一個用戶的偏好向量。我有電影內容表的數據集:print(movie_content.shape)print(movie_content)___________________________________________________________________(27278, 20)[[1 0 0 ... 0 0 0] [1 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 1 ... 0 0 0] [1 0 0 ... 0 0 0]]我正在嘗試獲取用戶偏好向量和電影內容表的點積,以便找到最優惠的電影(余弦相似度):distances = np.dot(user_normalized[1], movie_content)但這給了我以下錯誤:ValueError: shapes (1,20) and (27278,20) not aligned: 20 (dim 1) != 27278 (dim 0)為了找到最優惠的電影,找到距離度量的正確方法是正確的嗎?如果是代碼有什么問題?
2 回答

偶然的你
TA貢獻1841條經驗 獲得超3個贊
使用user_normalized
(?user_normalized.T
) 的轉置將適用于更多維。
所以,簡短的回答是:使用
distances?=?np.dot(movie_content,?user_normalized.T)
更復雜的答案是,點積僅針對兩個矩陣定義X
,并且Y
如果第二個維度與X
第一個維度匹配Y
,即X
具有形狀(M, N)
和Y
形狀(N, D)
。點積的結果是一個維度為 的新矩陣(M, D)
。
在您的情況下,您有一個(27278, 20)
矩陣和一個(1, 20)
矩陣。轉置將(1, 20)
矩陣變成(20, 1)
矩陣,從而滿足點積的條件。最終結果是一個(27278, 1)
矩陣,其中每個單元格包含第 N 部電影和第 D 個用戶的乘積。

DIEA
TA貢獻1820條經驗 獲得超2個贊
您需要將矢量重塑為(-1, 1)
.?如果要取兩個形狀數組的點積(m, k)
,(t, n)
則k
必須等于t
.?由于在 numpy 中沒有向量的概念,你基本上有一個形狀數組(27278, 20)
(movie_content) 和另一個形狀數組(1, 20)
(user_normalized)。為了能夠獲取點積,您必須重塑 user_normalized 數組的形狀,(20, 1)
使 movie_content 和 user_normalized 數組“對齊”(numpy 喜歡這樣稱呼它)作為dot
產品。
因此,您的代碼看起來像
import?numpy?as?np distances?=?np.dot(movie_content,?user_normalized[1].reshape(-1,?1))
添加回答
舉報
0/150
提交
取消