避免循环,有没有办法围绕列(或行)的平均值对数据矩阵进行居中,按标准偏差(也是逐列或逐行)缩放每个条目?
在R中这很简单:scale(data, center = T, scale = T))
。
但我不知道如何在Ocatave或Matlab中实现相同的基本预处理。
答案 0 :(得分:4)
在Octave中,这个center()和zscore()有两个函数。中心只是减去均值,而zscore也除以sd(一种有时被称为标准化的操作)
center(x)
通过减去其平均值来居中数据。
如果x是向量,则减去其均值。如果x是矩阵,请对每个矩阵执行上述操作 柱。如果给出了可选参数dim,则按此操作 尺寸。
和
zscore(x,opt,dim)计算x
的Z得分如果x是向量,则减去其均值并除以其标准差。 如果标准偏差为零,则除以1。
可选参数opt确定要在何时使用的规范化 计算标准偏差并具有与之相同的定义 std。
的相应参数如果x是矩阵,则沿第一个非单一维度计算。 如果给出第三个可选参数dim,则按此操作 尺寸。
答案 1 :(得分:1)
单个函数没有执行此操作,但您可以使用dim
和std
的{{1}}参数来完成此操作。我们也可以使用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))
参数从1(列)切换到2(行)。