【问题标题】:Appropriate zero variance handling for vectorised feature normalization?向量化特征归一化的适当零方差处理?
【发布时间】:2014-10-27 17:56:43
【问题描述】:

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

问题:在处理矢量化数据时,是否有一种很好的方法来处理 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。目前我正在使用以下组合:

dataset_size = length(sigma);

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

注意事项:

  • Broadcasting 在这里被使用了两次,在除法和减法运算中
  • 此示例基于 Octave,但该问题可能同样适用于 MATLAB。
  • 这个例子只是为了说明——“真实”使用会有更多、更大的数据集
  • 此示例将零方差数据与常规数据区别对待(务实不完美)
  • zscore 听起来很相关,但(顾名思义)更适合计算 z 分数...

【问题讨论】:

  • @Divakar 我 认为 Octave 将 X - mu 视为存在 bsxfun(这称为广播):bsxfun(@minus, X, mu)
  • @LuisMendo - 是的,这是两个广播操作之一。我同时又爱又怕那些东西……
  • 好吧,理想情况下,如果方差 = 0,您将从数据集中删除列,因为这意味着值都是相同的,因此变量对模型没有任何贡献。但是用零替换这些列(如下所示)也可以。
  • 哦,除了省略该列之外,您还会打印出一条消息“变量 的值都相同,因此省略此列”,因为知道哪些变量起作用可能会很有趣没有信息。
  • @Robert,在这种情况下,目标是标准化输入数据,因此低方差输入实际上非常(不切实际)好!我们需要设置非零条目以防止 div-zero 错误。你是对的 - 获取有关问题变量的信息会很有趣,但在这种情况下,该函数是为提高速度而设计的,因此在这里放置任何打印语句可能是不合适的......

标签: matlab statistics octave vectorization


【解决方案1】:

为什么不只是这个?

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 之类的值而不是零的应用程序中,这是一种更好的方法。

【讨论】:

  • 不错!我希望像sigma(sigma==0) = 1; 这样优雅的东西可能存在。不要指望 SO 上的任何人都能超过你的答案,所以我明天会测试这两种方法,然后标记为已解决。
  • @GnomeDePlume 我无法进行完整的测试,因为我没有 Octave,但如果我正确理解广播,它应该可以工作
  • 经过测试,效果很好。一个不成对的括号(我尝试编辑,但需要批准单个字符更改)否则完美。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 2013-02-20
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2010-10-17
  • 2023-03-26
相关资源
最近更新 更多