如何手动将数据缩放到正态分布

How to manually scale data to a normal distribution

我将数据归一化为:

X = ( X - X.mean(axis=0) ) / X.std(axis=0)

但是 X 的某些特征的方差为 0。它给了我 Runtime error for ZeroDivision.

我知道我们可以使用 sklearn 中的“StandardScalar”class 进行标准化。但是 如果 std=0 我如何自己从头规范化数据?

如果特定特征的标准偏差为 0,则其所有值都相同。在这种情况下 X = X - X.mean(axis=0) 就足够了。这会给你 0 个平均值和 0 个标准偏差。

StandardScaler引用sklearn文档:

Per feature relative scaling of the data to achieve zero mean and unit variance. Generally this is calculated using np.sqrt(var_). If a variance is zero, we can’t achieve unit variance, and the data is left as-is, giving a scaling factor of 1.

因此,就像其他答案所说的那样,您可以省略标准差项并在标准差为 0 时只执行 X - X.mean(axis=0)。但是,这仅在整个 X 为 0 时才有效标准偏差。

要在混合使用某些标准偏差值和不使用标准偏差值的情况下使用此方法,请改用以下方法:

std = X.std(axis=0)
std = np.where(std == 0, 1, std)
X = ( X - X.mean(axis=0) ) / std

此代码检查轴 0 中每行值的标准偏差是否为零,如果为真,则用 1 替换它们。