整数矩阵到随机矩阵归一化

Integer matrix to stochastic matrix normalization

假设我有一个包含整数值的矩阵。我想让它成为随机矩阵(即矩阵中每一行的总和等于 1)

我创建随机矩阵,计算每行的总和并将行中的每个元素相除以获得行总和。

dt = pd.DataFrame(np.random.randint(0,10000,size=10000).reshape(100,100))
dt['sum_row'] = dt.sum(axis=1)
for col_n in dt.columns[:-1]:
    dt[col_n] = dt[col_n] / dt['sum_row']

经过这个之后每一行的总和应该等于1。但事实并非如此。

(dt.sum_row_normalized == 1).value_counts()
> False    75
> True     25
> Name: sum_row_normalized, dtype: int64

我知道有些值不完全是 1,但非常接近它。然而,我怎样才能正确地归一化矩阵?

您不能保证浮点数完全一致,但您可以使用 np.around.

仔细检查任意精度

这可能 easier/faster 没有遍历 pandas 列。

X = np.random.randint(0,10000,size=10000).reshape(100,100)
X_float = X.astype(float)
Y = X_float/X_float.sum(axis=1)[:,np.newaxis]

sum(np.around(Y.sum(axis=1),decimals=10)==1) # is 100

(您不需要 python 3.x 中的 .astype(float) 步骤)