在保持原始矩阵大小的同时对2D矩阵进行采样

时间:2020-05-14 16:24:45

标签: python python-3.x numpy

我正在研究概率矩阵分解。我想将评分矩阵分为训练和验证。我所看到的代码不是随机样本。

我一直在试图找出方法。

为简单起见,原始矩阵R为(10,10)。我正在寻找一个火车矩阵,它是(10,10),但是只能说70%随机采样了矩阵R的值,其他所有值均为0。验证矩阵也为(10,10),但是具有剩下30%的值,其余为0。

这里的关键是保持矩阵的大小相同。

有人知道该怎么做吗?

编辑: 仔细考虑:如果您进行逐元素加法,TrainingMatrix + ValidationMatrix = Matrix R

1 个答案:

答案 0 :(得分:0)

我的解决方案。让我知道是否有更简便/快速的方法。

import copy

#Figuring out Matrix Sampling
np.random.seed(3)
training_percent = .7

R = np.arange(100).reshape(10,10)
print("R:")
print(R)


#Get the indexes of the non-zero elements
non_zero_is,non_zero_js = np.nonzero(R)

#Randomly sample the indexes
sampled_indexes_of_non_zeros = np.random.choice(len(i), 
    int(np.floor(training_percent * len(i))), replace=False)

#Training Mask
training_mask = np.zeros(R.shape,dtype=bool)
for position in sampled_indexes_of_non_zeros:
    training_mask[non_zero_is[position],non_zero_js[position]] = True

#Training Matrix
training_matrix = R.copy()
training_matrix[~training_mask] = 0
print("\ntraining_martix:")
print(training_matrix)

#Validation Matrix
validation_matrix = R.copy()
validation_matrix[training_mask] = 0
print("\nvalidation_martix:")
print(validation_matrix)