【问题标题】:scale() R function equivalent in Octave/Matlab在 Octave/Matlab 中等效的 scale() R 函数
【发布时间】:2016-09-19 13:51:05
【问题描述】:

避免循环,有没有办法将数据矩阵围绕列(或行)的平均值居中,按标准差(也按列或按行)缩放每个条目?

在 R 中这很简单:scale(data, center = T, scale = T))

但我不知道如何在 Ocatave 或 Matlab 中实现相同的基本预处理。

【问题讨论】:

标签: r matlab octave


【解决方案1】:

没有一个函数可以做到这一点,但您可以使用dim 参数stdmean 来完成此操作。我们也可以使用bsxfun 将其全部封装成一行。

A = rand(5, 4);

% Column-wise
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))

% Row-wise  
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 2)), std(A, [], 2))

说明

使用dim 参数到mean,我们可以计算A 每一列的平均值。

M = mean(A, 1)

然后我们可以使用bsxfun 从每列中的每个值中减去平均值(@minus)。我们需要使用bsxfun,因为M1 x nColsAnRows x nColsbsxfun 会自动为我们播报操作。

B = bsxfun(@minus, A, M);

然后我们要计算每列的标准差,再次使用dim 参数(第三个输入)。

S = std(A, [], 1)

然后将每一列除以这个标准差

bsxfun(@rdivide, B, S);

所以把这一切放在一起,我们得到了

bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))

要执行逐行操作,我们需要做的就是将dim 参数从 1(列)切换到 2(行)。

【讨论】:

  • 在 Ocatve/Matlab 上是全新的......你能告诉我 @ 是做什么的吗?
  • @AntoniParellada 现在添加描述。
  • @AntoniParellada 你想把它除以标准差还是乘以标准差?
  • 我现在正要问……如果我们要进行PCA或梯度下降,应该分开;所以你只输入@divide 吗?还有,std(A,[],1)中的[]部分是什么意思或需要?
  • @AntoniParellada 我刚刚用除法更新了它。您想使用rdivide。另外[] 输入是因为第二个输入是权重,[] 确保使用默认值mathworks.com/help/matlab/ref/std.html#inputarg_w
【解决方案2】:

在 Octave 中,您有两个函数分别用于 center() 和 zscore()。 center 只是减去平均值,而 zscore 也除以 sd(有时称为标准化的操作)

中心 (x)

通过减去平均值来居中数据。

如果 x 是一个向量,减去它的平均值。如果 x 是矩阵,则对每个执行上述操作 柱子。如果给出了可选参数 dim,则沿此操作 维度。

zscore(x, opt, dim) 计算 x 的 Z 值

如果 x 是一个向量,减去它的平均值并除以它的标准差。 如果标准差为零,则除以 1。

可选参数 opt 确定何时使用的规范化 计算标准差,定义与 标准的对应参数。

如果 x 是矩阵,则沿第一个非单维计算。 如果给出了第三个可选参数 dim,则沿此操作 维度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多