您可以使用 sklearns Standardscaler。它将您的数据缩放为方差为 1,均值为 0。0 的均值等于 0 的总和。
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import numpy as np
rand_numbers = StandardScaler().fit_transform(np.random.rand(100,1, ))
如果你不想用sklearn你可以手动标准化,公式很简单:
rand_numbers = np.random.rand(1000,1, )
rand_numbers = (rand_numbers - np.mean(rand_numbers)) / np.std(rand_numbers)
这里的问题是 1 的方差,它导致数字大于 1 或小于 -1。因此,您可以通过其最大绝对值来划分数组。
rand_numbers = rand_numbers*(1/max(abs(rand_numbers)))
现在您有了一个值介于 -1 和 1 之间且总和非常接近于零的数组。
print(sum(rand_numbers))
print(min(rand_numbers))
print(max(rand_numbers))
输出:
[-1.51822999e-14]
[-0.99356294]
[1.]
使用此解决方案,您的数据始终是一个 1 或一个 -1。如果您想避免这种情况,您可以通过最大 abs 为除法添加一个正随机因子。 rand_numbers*(1/(max(abs(rand_numbers))+randomfactor))
编辑
正如@KarlKnechtel 提到的,除以标准偏差与除以最大绝对值是多余的。
以上可以通过以下方式简单完成:
rand_numbers = np.random.rand(100000,1, )
rand_numbers = rand_numbers - np.mean(rand_numbers)
rand_numbers = rand_numbers / max(abs(rand_numbers))