gpt4 book ai didi

python - 排除零元素的最小最大尺度稀疏矩阵

转载 作者:行者123 更新时间:2023-12-01 09:12:09 25 4
gpt4 key购买 nike

我有一个矩阵,其中包含 [0, 5] 之间的数字。该矩阵非常稀疏,大部分元素为零。我想分别对每一行应用最小-最大缩放,以使所有元素都在 [-1, 1] 之间。但是,我只想考虑非零元素。例如,考虑以下矩阵:

[[0.5 3.  0.  2.  0. ]
[0. 4. 5. 0. 0. ]
[3. 0. 0. 2.5 4. ]]

转换后,它将如下所示:(如您所见,0 个元素未受影响)

[[-1.          1.          0.          0.2         0.        ]
[ 0. -1. 1. 0. 0. ]
[-0.33333333 0. 0. -1. 1. ]]

我可以使用以下代码在普通 numpy 数组上执行此操作:

max_arr = A.max(axis=1)
min_arr = np.where(A == 0, A.max(), A).min(axis=1)
row_idx, col_idx = A.nonzero()
A_scaled = np.zeros_like(A)
for row, col in zip(row_idx, col_idx):
element = A[row, col]
A_scaled[row, col] = 2 * ((element - min_arr[row]) / (max_arr[row] - min_arr[row])) - 1

这里有几个问题。首先,它很慢(可能是因为 for 循环?)。另一件事是我的矩阵是稀疏的,所以我想使用稀疏的 csr_matrix 格式。如果矩阵 Acsr_matrix,则此代码不起作用。它在第 2 行给出错误:ValueError:用序列设置数组元素。

我怎样才能以快速且高效的方式实现这一目标?我查看了 sklearn.preprocessing.MinMaxScaler,但它不支持通过排除零进行缩放。

最佳答案

这是一种用于 csr_matrix 矩阵的矢量化方法 -

def scale_sparse_matrix_rows(s, lowval=0, highval=1):
d = s.data

lens = s.getnnz(axis=1)
idx = np.r_[0,lens[:-1].cumsum()]

maxs = np.maximum.reduceat(d, idx)
mins = np.minimum.reduceat(d, idx)

minsr = np.repeat(mins, lens)
maxsr = np.repeat(maxs, lens)

D = highval - lowval
scaled_01_vals = (d - minsr)/(maxsr - minsr)
d[:] = scaled_01_vals*D + lowval

示例运行 -

1)设置输入csr_matrix:

In [153]: a
Out[153]:
array([[0.5, 3. , 0. , 2. , 0. ],
[0. , 4. , 5. , 0. , 0. ],
[3. , 0. , 0. , 2.5, 4. ]])

In [154]: from scipy.sparse import csr_matrix

In [155]: s = csr_matrix(a)

2)运行建议的方法并验证结果:

In [156]: scale_sparse_matrix_rows(s, lowval=-1, highval=1)

In [157]: s.toarray()
Out[157]:
array([[-1. , 1. , 0. , 0.2 , 0. ],
[ 0. , -1. , 1. , 0. , 0. ],
[-0.33333333, 0. , 0. , -1. , 1. ]])

关于python - 排除零元素的最小最大尺度稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com