使用 Octave 进行特征缩放

Feature Scaling with Octave

我想用均值和标准差做特征缩放数据集,我的代码如下;但显然它不是通用代码,因为它似乎只适用于一个数据集。因此,我想知道我的代码有什么问题,我们将不胜感激!谢谢!

X是我目前使用的数据集。

mu = mean(X);
sigma = std(X);
m = size(X, 1);
mu_matrix = ones(m, 1) * mu;
sigma_matrix = ones(m, 1) * sigma;
featureNormalize = (X-mu_matrix)/sigma;

感谢您在评论中阐明您认为代码应该做什么。

我的回答将有效地回答为什么你认为正在发生的事情不是正在发生的事情。

首先让我们谈谈meanstd函数。当他们的输入是 向量 (无论是垂直对齐还是水平对齐)时,这将 return 一个数字,分别是该向量的平均值或标准偏差,如你可能会期待。

但是,当输入是 矩阵 时,您需要知道它的不同之处。除非你指定你应该计算均值/标准的方向(维度),否则它将计算沿行的均值,即return为每一列计算一个数字.因此,此操作的最终结果将是一个水平向量。

因此,musigma 在您的代码中都是 水平向量

现在让我们继续讨论 'matrix multiplication' 运算符(即 *)。
使用矩阵乘法运算符时,如果将水平向量与垂直向量相乘(即通常的矩阵乘法运算),则输出是单个数字(即标量)。但是,如果您反转方向,例如,将垂直向量乘以水平向量,实际上您将计算 'Kronecker product'。由于 * 操作的输出完全由第一个输入的行和第二个输入的列定义,因此无论您得到的是矩阵乘法还是克罗内克积都是隐式的,并且完全取决于方向您的输入。

因此,在您的情况下,mu_matrix = ones(m, 1) * mu; 行实际上并没有像您所说的那样附加一个向量。它实际上是在一个垂直向量和 mu 的水平向量之间执行克罗内克乘积,有效地创建一个 m-by-n 矩阵,其中 mu 垂直重复 m 行。

因此,在此操作结束时,正如变量命名所暗示的那样,mu_matrix 实际上是一个矩阵(与 sigma_matrix 相同),具有与 [=21= 相同的大小].

您的最后一步是 X- mu_sigma,它为您提供每个元素处的 x 和 mu 在该元素处的差异。然后你 "divide" 与 sigma 矩阵。

这就是我问您是否确定应该使用 ./ 而不是 / 的原因。

/ 矩阵除法 运算符。使用 / 您实际上是通过逆矩阵执行矩阵乘法,因为 D / S 在数学上等同于 D * inv(S)。在我看来,您应该使用 ./ 来简单地将每个元素除以该列的标准差(这就是为什么您必须在 sigma_matrix 中的 m 行上重复水平向量,以便您可以将它用于 'elementwise division'),因为您要做的是通过特定于该列(即特征)的标准偏差对特定列的每一行(即观察)进行归一化。