【发布时间】:2016-09-19 13:51:05
【问题描述】:
避免循环,有没有办法将数据矩阵围绕列(或行)的平均值居中,按标准差(也按列或按行)缩放每个条目?
在 R 中这很简单:scale(data, center = T, scale = T))。
但我不知道如何在 Ocatave 或 Matlab 中实现相同的基本预处理。
【问题讨论】:
避免循环,有没有办法将数据矩阵围绕列(或行)的平均值居中,按标准差(也按列或按行)缩放每个条目?
在 R 中这很简单:scale(data, center = T, scale = T))。
但我不知道如何在 Ocatave 或 Matlab 中实现相同的基本预处理。
【问题讨论】:
没有一个函数可以做到这一点,但您可以使用dim 参数std 和mean 来完成此操作。我们也可以使用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,因为M 是1 x nCols 而A 是nRows x nCols。 bsxfun 会自动为我们播报操作。
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(行)。
【讨论】:
@ 是做什么的吗?
@divide 吗?还有,std(A,[],1)中的[]部分是什么意思或需要?
rdivide。另外[] 输入是因为第二个输入是权重,[] 确保使用默认值mathworks.com/help/matlab/ref/std.html#inputarg_w
在 Octave 中,您有两个函数分别用于 center() 和 zscore()。 center 只是减去平均值,而 zscore 也除以 sd(有时称为标准化的操作)
中心 (x)
通过减去平均值来居中数据。
如果 x 是一个向量,减去它的平均值。如果 x 是矩阵,则对每个执行上述操作 柱子。如果给出了可选参数 dim,则沿此操作 维度。
和
zscore(x, opt, dim) 计算 x 的 Z 值
如果 x 是一个向量,减去它的平均值并除以它的标准差。 如果标准差为零,则除以 1。
可选参数 opt 确定何时使用的规范化 计算标准差,定义与 标准的对应参数。
如果 x 是矩阵,则沿第一个非单维计算。 如果给出了第三个可选参数 dim,则沿此操作 维度。
【讨论】: