matlab - 向量化特征归一化的适当零方差处理?

标签 matlab statistics octave vectorization

问题:在 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。目前我正在使用以下 kludge:

dataset_size = length(sigma);

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

注意事项:

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

最佳答案

为什么不只是这个?

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

关于matlab - 向量化特征归一化的适当零方差处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26593803/

相关文章:

matlab - 如何为 SVM 结果绘制 3D 超平面?

c++ - 从 engOpen(..) 启动 matlab,被通知引擎被关闭

python - 为什么数据清洗会降低准确性?

python - 使用 For 循环重写 numpy.random.binomial

database - 我可以使用 Octave 访问 sqlite3 吗?

performance - 为什么reshape这么快? (剧透 : Copy-on-Write)

matlab - 有没有办法将子图保存到 MATLAB 中的变量中?

Python interp1d 与 UnivariateSpline

database-design - 有什么好的方法可以将性能统计信息存储在数据库中以供以后查询?

excel - Octave:无法将可选参数传递给 VBA 函数(通过 COM 服务器添加 excel 表时)