我想通过使用均值和标准差来做特征缩放数据集,我的代码如下;但显然它不是通用代码,因为它似乎只适用于一个数据集。因此我想知道我的代码有什么问题,任何帮助将不胜感激!谢谢!
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;
感谢您在评论中阐明您认为代码应该做什么。
我的回答将有效地回答为什么您认为正在发生的事情并不是正在发生的事情。
首先让我们谈谈mean
和std
功能。当他们的输入是一个向量(无论是垂直对齐还是水平对齐)时,这将返回一个单独的数字,它分别是该向量的均值或标准差,如您所料。
但是,当输入是matrix 时,您需要知道它的不同之处。除非您指定计算均值/标准差的方向(维度),否则它将沿行计算均值,即为每列返回一个数字。因此,此操作的最终结果将是一个水平向量。
因此,在您的代码中,mu
和sigma
都将是水平向量。
现在让我们继续讨论“矩阵乘法”运算符(即*
)。
使用矩阵乘法运算符时,如果将水平向量与垂直向量相乘(即通常的矩阵乘法运算),则输出是单个数字(即标量)。但是,如果您反转方向,例如将垂直向量乘以水平向量,实际上您将计算“克罗内克积”。由于*
操作的输出完全由第一个输入的行和第二个输入的列定义,因此无论您是获得矩阵乘法还是克罗内克积都是隐式的,并且完全取决于输入的方向。
因此,在您的情况下,该行mu_matrix = ones(m, 1) * mu;
实际上并没有像您说的那样附加一个向量。它实际上是在 1 的垂直向量和水平向量之间执行克罗内克积mu
,从而有效地创建了一个m-by-n
矩阵,其中 mu 垂直重复 m 行。
因此,在此操作结束时,正如变量命名所暗示的那样,mu_matrix
实际上是一个矩阵(与 相同sigma_matrix
),与具有相同的大小X
。
您的最后一步是X- mu_sigma
,它为您提供每个元素处的 x 和 mu 之间的差异。然后你用西格玛矩阵“划分”。
这是为什么我问如果你确定你应该使用./
的替代/
。
/
是矩阵除法运算符。With /
You 有效地通过逆矩阵执行矩阵乘法,因为 D / S 在数学上等同于 D * inv(S)。在我看来,您应该./
改用,简单地将每个元素除以该列的标准差(这就是为什么您必须在 m 行上重复水平向量的原因sigma_matrix
,以便您可以将其用于“按元素划分”) ,因为您要做的是通过特定于该列(即特征)的标准偏差对特定列的每一行(即观察)进行归一化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句