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