【问题标题】:matlab rescale matrix data to -1 to 1 [duplicate]matlab将矩阵数据重新缩放为-1到1 [重复]
【发布时间】:2011-08-04 05:11:31
【问题描述】:

可能重复:
MATLAB: how to normalize/denormalize a vector to range [-1;1]

您好,刚开始使用 Matlab,我想知道如何重新调整矩阵中的数据。 我有一个 N 行乘 M 列的矩阵,并希望将列中的数据重新缩放到 -1 和 1 之间。

每列包含的值范围从 0 - 10,000 到介于 0 和 1 之间的一些值,我想标准化为 -1 和 1 之间的原因,因为这些值将在神经网络中用作输入值对于基于正弦的变换函数。

【问题讨论】:

  • *2-1 应用于所有矩阵条目? ;-)

标签: matlab matrix normalize


【解决方案1】:
[m, n] = size(normalizedMatrix)
normalizedMatrix*2-ones(m,n)

【讨论】:

  • 感谢您的快速响应,我的列的值范围从 0 到 300,000。这些列是不同的“特征”,当应用您的公式时,它们对某些列仅从之前略微重新调整,较高值的列不会发生太大变化。我认为每列都需要计算并应用其平均值和标准偏差,但由于对所有这些都是新手,我不立即知道如何执行此操作。
  • 我应该提一下,每一列都有不同的值范围,所以有些范围是 0 到 0.5,有些是 0 到 5,有些是 0 到 700000
【解决方案2】:

前面的答案都不正确。这是你需要做的:

[rows,~]=size(A);%# A is your matrix
colMax=max(abs(A),[],1);%# take max absolute value to account for negative numbers
normalizedA=A./repmat(colMax,rows,1);

矩阵normalizedA 的值介于-11 之间。

示例:

A=randn(4)

A =

   -1.0689    0.3252   -0.1022   -0.8649
   -0.8095   -0.7549   -0.2414   -0.0301
   -2.9443    1.3703    0.3192   -0.1649
    1.4384   -1.7115    0.3129    0.6277

normalizedA = 

   -0.3630    0.1900   -0.3203   -1.0000
   -0.2749   -0.4411   -0.7564   -0.0347
   -1.0000    0.8006    1.0000   -0.1906
    0.4885   -1.0000    0.9801    0.7258

【讨论】:

  • 感谢代码,我刚试了一下,它归一化为 0 到 1,而不是 -1 到 1,不确定为什么没有负值。
  • 啊,我明白了。您想将元素缩放到-1,1。您应该查看 Jonas 在上面的 cmets 中发布的链接。这回答了你的问题。
【解决方案3】:

一个简单的解决方案将使用简单的逻辑。假设您要独立缩放每个列,请执行以下操作:

  1. 减去每列的最小值。
  2. 将列最大值缩放为 2。
  3. 减去 1。

显然,这将导致每列的最小值为 -1,最大值为 1。这样做的代码很简单。

A = randn(5,4)   % some random example data
A =
    0.70127      0.20378       0.4085      0.83125
    0.64984     -0.90414      0.67386       1.2022
     1.6843      -1.6584     -0.31735      -1.8981
    -1.3898     -0.89092     -0.23122      -1.2075
    0.72904    -0.095776      0.67517      0.28613

现在,对A​​执行上述步骤。

A = bsxfun(@minus,A,min(A,[],1));
A = bsxfun(@times,A,2./max(A,[],1));
A = A - 1

A =
    0.36043            1      0.46264      0.76071
    0.32697     -0.18989      0.99735            1
          1           -1           -1           -1
         -1      -0.1757     -0.82646     -0.55446
     0.3785      0.67828            1      0.40905

【讨论】:

  • 感谢大家的建议,我也会尝试上述方法,我在 matlab 论坛link 上发帖,有人给了我这个公式,它似乎对每一列都做了我想要的:norm_data = bsxfun( @rdivide,data,max(data)/2)-1;
  • 实际上,这只会强制最小值或最大值为 -1 或 1。它不会按照您的要求执行,除非列中的最大值与最小值完全相同价值。但也许你不想做你所要求的。事实上,如果你的数据中确实有负数,这会给你带来非常意想不到的结果。
  • >> data = [-10;0;2];bsxfun(@rdivide,data,max(data)/2)-1 ans = -11 -1 1
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2023-01-17
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2013-03-06
相关资源
最近更新 更多