有一部分代码:
batch = getRandomBatch(batch_size)
users_ind = batch[0, :, 0]
items_ind = batch[0, :, 2]
for i in range(25):
sum_loss, err = computeLossFunction(batch)
users_mat[users_ind, :] += err*items_mat[items_ind, :]
它抛出一个 ValueError,'操作数无法与形状一起广播 (10000,( (10000,10( ' users_mat[users_ind, :] += err*items_mat[items_ind, :]
我不知道如何处理它。
为什么错误的形状是(10000,(而不是(10000,1(?
====
============================================================================users_mat = np.random.rand(len_users, latent_space_dimension)
items_mat = np.random.rand(len_items, latent_space_dimension)
def getRandomBatch(batch_size):
batch = np.random.choice(len_data_mat-1, size=(1, batch_size))
batch = data_mat[batch]
return batch
def computeLossFunction(data_mat):
items_ind = data_mat[0, :, 2]
rates = data_mat[0, :, 1]
users_ind = data_mat[0, :, 0]
vector_items = items_mat[items_ind, :]
vector_users = users_mat[users_ind, :]
dot_list = np.sum(vector_items*vector_users, axis=1)
err = rates-dot_list
piece = np.power(err, 2)+lambda_val*(np.sum(np.power(vector_users, 2), axis=1) + np.sum(np.power(vector_items, 2), axis=1))
sum_loss = np.mean(piece)
return sum_loss, err
data_mat是一个 10000 行和 3 列的 numpy 矩阵
尝试后,err = err.reshape(-1, 1( 可以解决这个问题,但我仍然不明白为什么 err 的形状是 (10000,( 而不是 (10000, 1(,所以我必须明确地重塑。
在(10000,)
数组上使用 .reshape(-1, 1)
,反之亦然。
从您的代码中也可以明显看出data_mat
是 2d,而不是 3d,这可能是您混淆的根源。 即:
data_mat = np.empty((10000, 3)); data_mat.ndim
Out[9]: 2
data_mat[0, :, 2]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-10-4b9c676abc55> in <module>()
----> 1 data_mat[0, :, 2]
IndexError: too many indices for array