矢量化特征归一化的适当零方差处理?

时间:2014-10-27 17:56:43

标签: matlab statistics octave vectorization

问题:在Octave中进行特征归一化时,零方差输入会导致div-zero错误。

问题:使用矢量化数据时,是否有一种很好的(r)方法来处理div-zero?

示例: 输入是一个矩阵,包含列中的多个数据集:

X =  [1  3.5  7.5  9 ; 
      1  4    8    9 ; 
      1  4.5  8.5  9]

因此X包含三个系列:x_1 = [1,1,1]x_2 = [7.5, 8, 8.5]x_3 = [9,9,9]。为了使用矢量化来标准化每个集合,以下方法似乎是合理的:

mu = mean(X);
sigma = std(X);
X_norm = (1 ./ sigma) .* (X - mu);

但是,上述方法将失败,因为x_1x_3的方差均为零,因此会发生除零错误。

我首选的零差异数据处理是将sigma设置为1.目前我使用以下kludge:

dataset_size = length(sigma);

for index = 1:dataset_size
  if sigma(index) == 0
     sigma(index) = 1;
  endif
end

注意:

  • Broadcasting在此处使用两次,在除法和减法操作中
  • 此示例基于Octave,但问题可能同样适用于MATLAB。
  • 这个例子很容易说明 - '真实'用法会有更多更大的数据集
  • 此示例以不同于常规数据的方式处理零差异数据(务实不完善)
  • zscore听起来相关,但是(顾名思义)更适合计算z得分......

1 个答案:

答案 0 :(得分:4)

为什么不呢?

mu = mean(X);
sigma = std(X);
sigma(sigma==0) = 1; %// add this line to remove zeros
X_norm = (1 ./ sigma) .* (X - mu);

或者,为了节省一些操作:

mu = mean(X);
sigma = std(X);
ind = sigma~=0; %// detect zero values
X_norm = X - mu;
X_norm(:,ind) = X_norm(:,ind) ./ sigma(ind) ;

通常,最好使用

sigma(sigma<=tol) = 1; %// add this line to remove values close to zero

在第一种方法中,或

ind = sigma>tol; %// detect values close to zero

在第二个中,对于给定的容差tol(例如tol = 1e-10)。在有限精度误差可以产生1e-15而不是零的值的应用中,这是一种更好的方法。