我想通过使用方法和标准偏差来进行特性缩放,我的代码在下面;但是显然它不是一个统一的代码,因为它似乎只适用于一个数据集。因此,我想知道我的代码有什么问题,任何帮助都将不胜感激!谢谢!
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;发布于 2019-03-05 10:24:50
感谢您澄清您认为代码应该在注释中做些什么。
我的答案将有效地回答为什么你认为正在发生的不是正在发生的事情。
首先,让我们讨论一下mean和std函数。当它们的输入是向量(无论是垂直对齐的还是水平对齐的)时,这将返回一个数字,这分别是该向量的平均值或标准差,正如您可能预期的那样。
但是,当输入是一个矩阵时,您需要知道它所做的工作是不同的。除非指定计算means / std的方向(维度),否则它将计算沿行的均值,即为每一列返回一个数字。因此,这个操作的最终结果将是一个水平向量.
因此,mu和sigma都是代码中的水平向量。
现在让我们继续讨论“矩阵乘法”运算符(即*)。
当使用矩阵乘法运算符时,如果将水平向量与垂直向量(即通常的矩阵乘法运算)相乘,则输出为单个数字(即标量)。然而,如果你反转方向,就像在,你把一个垂直向量乘以一个水平向量,你实际上就会计算一个'Kronecker乘积‘。由于*操作的输出完全由第一个输入的行和第二个输入的列定义,所以无论您是得到矩阵乘法还是kronecker积都是隐式的,完全依赖于输入的方向。
因此,在您的例子中,直线mu_matrix = ones(m, 1) * mu;实际上并没有像您所说的那样附加一个向量。实际上,它在垂直向量和水平向量(即mu )之间执行kronecker积,有效地创建了m行垂直重复的m-by-n矩阵。
因此,在操作结束时,正如变量命名所暗示的那样,mu_matrix实际上是一个矩阵(与sigma_matrix相同),其大小与X相同。
最后一步是X- mu_sigma,它在每个元素上给出x和mu在该元素上的区别。然后你用西格玛矩阵“除法”。
这就是我问您是否应该使用./而不是/的原因。
/是矩阵除法算子。由于D/S在数学上等价于D* inv(S),所以使用/可以有效地用逆矩阵进行矩阵乘法。在我看来,您应该使用./,只需将每个元素除以该列的标准差(这就是为什么您必须在sigma_matrix中的m行上重复水平向量,以便您可以将其用于“元素除法”),因为您要做的是将特定列的每一行(即观察)规范化为该列特有的标准偏差(即特性)。
https://stackoverflow.com/questions/54984606
复制相似问题