二维矩阵中各个列的最小-最大归一化

puj*_*uja 3 matlab normalization

我有一个包含 4 列/属性和 150 行的数据集。我想使用最小-最大标准化来标准化这些数据。到目前为止,我的代码是:

minData=min(min(data1))
maxData=max(max(data1))
minmaxeddata=((data1-minData)./(maxData))
Run Code Online (Sandbox Code Playgroud)

此处,minDatamaxData返回全局最小值和最大值。因此,此代码实际上对 2D 矩阵中的所有值应用最小-最大归一化,以便全局最小值为 0,全局最大值为 1。

但是,我想对每一单独执行相同的操作。具体来说,二维矩阵的每一列都应该独立于其他列进行最小-最大归一化。

我尝试仅使用min(data1)and max(data1),但收到错误消息,指出矩阵尺寸必须一致

然而,通过使用全局最小值和最大值,我得到了范围内的值[0-1],并使用这个标准化数据集进行了实验。我想知道我的结果是否有问题?我的理解也有问题吗?任何指导将不胜感激。

ray*_*ica 6

如果我理解正确的话,您希望规范化 的每一列data1。此外,由于每一列都是一个独立的数据集,并且很可能具有不同的动态范围,因此可能不建议进行全局最小-最大操作。我建议您按照最初的想法单独规范化每一列。

根据您的错误,您不能减去 ,data1因为min(data1)是矩阵min(data1)时会产生行向量。data1您正在用向量减去矩阵,这就是您收到该错误的原因。

如果您想实现您所要求的目标,请使用bsxfun广播向量并重复它以获取尽可能多的行data1。所以:

mindata = min(data1);
maxdata = max(data1);
minmaxdata = bsxfun(@rdivide, bsxfun(@minus, data1, mindata), maxdata - mindata);
Run Code Online (Sandbox Code Playgroud)

在 MATLAB 的更高版本中,广播是内置于该语言中的,因此您可以简单地执行以下操作:

mindata = min(data1);
maxdata = max(data1);
minmaxdata = (data1 - mindata) ./ (maxdata - mindata);
Run Code Online (Sandbox Code Playgroud)

它更容易阅读并且仍然做同样的工作。


例子

>> data1 = [5 9 9 9 3 3; 3 10 2 1 10 1; 2 4 4 6 5 5]

data1 =

 5     9     9     9     3     3
 3    10     2     1    10     1
 2     4     4     6     5     5
Run Code Online (Sandbox Code Playgroud)

当我运行上面的标准化代码时,我得到:

minmaxdata =

    1.0000    0.8333    1.0000    1.0000         0    0.5000
    0.3333    1.0000         0         0    1.0000         0
         0         0    0.2857    0.6250    0.2857    1.0000
Run Code Online (Sandbox Code Playgroud)