不幸的是,示例二和三没有根据原始文件中出现的行数观察到正确的分布。
您可以从矩阵中随机删除计数,而不是从原始数据中删除元组。所以你必须生成随机索引并减少相应的计数。请务必避免减少零计数,而是生成新索引。执行此操作,直到将计数元组的总数减少到 30%。基本上这可能看起来像这样:
amount_to_decrease = 0.7 * overall_amount
decreased = 0
while decreased < amount_to_decrease:
x = random.randint(0, n)
y = random.randint(0, n)
if matrix[x][y] > 0:
matrix[x][y]-=1
decreased+=1
if x != y:
matrix[y][x]-=1
如果您的矩阵填充良好,这应该会很好。如果不是 您可能想从矩阵中重新创建一个元组列表,然后从中选择一个随机子集。在此之后从剩余的元组重新创建您的矩阵:
tuples = []
for y in range(n):
for x in range(y+1):
for _ in range(matrix[x][y])
tuples.append((x,y))
remaining = random.sample(tuples, int(overall_amount*0.7) )
或者,您可以进行组合,首先通过查找所有不为零的索引,然后对这些索引进行采样以减少计数:
valid_indices = []
for y in range(n):
for x in range(y+1):
valid_indices.append((x,y))
amount_to_decrease = 0.7 * overall_amount
decreased = 0
while decreased < amount_to_decrease:
x,y = random.choice(valid_indices)
matrix[x][y]-=1
if x != y:
matrix[y][x]-=1
if matrix[y][x] == 0:
valid_indices.remove((x,y))
还有另一种方法可以使用正确的可能性,但可能不会给你一个确切的减少。这个想法是设置保持行/计数的概率。如果您的目标是减少到 30%,这可能是 0.3。然后你可以检查矩阵并检查每个计数是否应该保留。
keep_chance = 0.3
for y in range(n):
for x in range(y+1):
for _ in range(matrix[x][y])
if random.random() > keep_chance:
matrix[x][y] -= 1
if x != y:
matrix[y][x]-=1