我试图使用以下代码
在python中居中和规范化数据集mean = np.mean(train, axis=0)
std = np.std(train, axis=0)
norm_train = (train - mean) / std
问题在于我通过零错误得到了一个错误。数据集中的两个值最终具有零标准。数据集的形状(3750,55)。我的统计技能不是很强,所以我不确定如何克服这一点。有什么建议吗?
答案 0 :(得分:5)
由于standard deviation是通过取平均平方偏差的总和来计算的,因此只有当变量的所有值相同时才能实现零标准偏差(都等于均值)。在这种情况下,这些变量没有判别力,因此可以从分析中删除它们。他们无法改进任何分类,聚类或回归任务。许多实现都会为您执行此操作或抛出有关矩阵计算的错误。
答案 1 :(得分:0)
您可以将该功能的0 std替换为1。这基本上意味着该特征的所有数据点的标定值将为零。这是有道理的,因为这意味着特征值甚至不会偏离均值(因为值是常数,所以常数就是均值)。
仅供参考-sklearn就是这样做的! https://github.com/scikit-learn/scikit-learn/blob/7389dbac82d362f296dc2746f10e43ffa1615660/sklearn/preprocessing/data.py#L70
答案 2 :(得分:0)
一种标准是包括防止被零除的epsilon变量。从理论上讲,这是不需要的,因为进行@ayhan指出的这种计算没有逻辑意义。实际上,机器只是计算器,被零除就是NaN或+/- Inf。
简而言之,如下定义函数:
def z_norm(arr, epsilon=1e-100):
return (arr-arr.mean())/(arr.std()+epsilon)
这假设一个1D数组,但是很容易将其更改为2D数组的按行或按列计算。
Epsilon是添加到计算中的故意错误,以防止生成NaN或Inf。对于Inf,您仍然会得到很大的数字,但是以后的计算将不会传播Inf,并且可能仍然保留某些含义。
1 /(1 x 10 ^ 100)的值非常小,不会对结果产生太大影响。如果需要,您可以降低到1e-300左右,但是在进一步计算之后,您可能会碰到最低精度值。请注意您使用的精度以及它可以处理的最小精度。我正在使用float64。
答案 3 :(得分:0)
回到它的定义,z_score 背后的想法是根据标准偏差给出元素与样本均值之间的距离。如果所有元素都相同,则意味着它们与均值的距离为 0,因此 zscore 是标准差的 0 倍,因为您的所有数据点均位于均值处。按标准划分的划分是一种将距离与数据的离散程度相关联的方法。视觉上很容易理解并得出这个结论:https://en.wikipedia.org/wiki/Standard_score#/media/File:The_Normal_Distribution.svg