10

我需要标准化 N 个整数的向量,以便:

  • 每个值与其原始值成正比(值将在 0 和 1 之间)
  • 所有值的总和为=1

例如:

如果我有一个向量

V = [2,2,1,0]

归一化向量应该是:

V_norm = [0.4,0.4,0.2,0]  % 0.4+0.4+0.2 = 1

我尝试了在这个社区和网络上找到的许多解决方案,最后我用这段代码做到了:

part = norm(V);
if part > 0
  V_norm = V/part;
else % part = 0 --> avoid "divide by 0" 
  V_norm = part;
end

如果出现以下问题,则此问题有效:

  • 数组的所有元素都是“0”——>结果数组不会改变
  • 数组中只有一个元素 >0,所有其他元素 = 0 --> 结果数组:元素 >0 为 1,其他元素为 0

但如果我有不同的情况,虽然结果是成比例的,但总和不是 0。例如:

   V = [1,0,1]
   V_norm = [0.74,0,0.74]

   V = [1,1,1]
   V_norm = [0.54,0.54,0.54]

(我不确定数字是否正确,因为我现在不能使用 Matlab,但我确定总和 > 1)

啊提示?

先感谢您

4

4 回答 4

10

我相信,您需要做的是使用1 范数(出租车范数)进行标准化:

v = [2, 2, 1, 0];
v_normed = v / norm(v, 1); % using the 1-norm

变量v_normed现在应该是[0.4, 0.4, 0.2, 0.0]. 的 1 范数v_normed将等于 1。您也可以对向量求和(类似于 1 范数,但不对每个值应用绝对函数),但该和的范围通常在 -1 到 1 之间案例(如果任何值v低于 0)。您可以使用abs结果总和,但从数学上讲,它不再符合标准。

于 2012-06-27T11:42:14.523 回答
9

...归一化向量应该是:

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1

那要看。你的规范函数是什么?

norm(x)在 MATLAB 中返回标准范数,这意味着归一化向量的元素的平方x和为 1。

在您的示例中:

v = [1, 1, 1];         %# norm(v) = sqrt(1^2+1^2+1^2) = ~1.7321
v_norm = v / norm(v);  %# v_norm = [0.5574, 0.5574, 0.5574]

sum(v_norm .^ 2)确实产生 1,但sum(v_norm)没有如预期的那样。


我需要对 N 个整数的向量进行归一化,以便每个值与其原始值成比例(该值将在 0 和 1 之间)并且所有值的总和为 1。

“规范化”是什么意思?这是否意味着根据范数定义除以一个有效的数学范数函数的值?

“比例”是什么意思?这是否意味着所有元素都乘以相同的数字?如果是这样,并且它是一个有效的数学规范,则您不能保证元素的总和始终为 1。
例如,考虑v = [1, -2]. 然后sum(v) = -1

或者也许sum是您正在寻找的函数,但它在数学上不符合规范,因为规范是一个函数,它为向量空间中的所有向量分配严格的正长度或大小
在上面的例子中,sum(v)是负数。


啊提示?

您可以选择:

  1. sum(x),它满足这两个要求,但不符合规范函数的条件,因为它可以产生负值。
  2. norm(x, 1),正如 OleThomsenBuus 建议的那样,它实际上计算sum(abs(x(:))).
    除非您将向量空间限制为非负向量,否则它不会满足您的要求。
于 2012-06-27T11:25:30.483 回答
6

如果您的标准化没有比您在问题开始时给出的更进一步的条件,则可能的解决方案是

V = [3 4 -2];
S = sum(V);
if (S == 0)
    % no solution
else
    V_norm = V ./ S;
end
sum(V_norm)
于 2012-06-27T11:16:45.517 回答
0

我将在这里留下我的解决方案,用于“规范化”具有正条目的矩阵的行,其中规范化意味着在过程之后行和为 1。

概括

normmat = normr(sqrt(mat)).^2

最小的例子

mat是你的矩阵有积极的条目

mat = [1 2 3; 2 3 4]
mat =

     1     2     3
     2     3     4

现在我们做单线:

normmat = normr(sqrt(mat)).^2
normmat =

    0.1667    0.3333    0.5000
    0.2222    0.3333    0.4444

每行之和为1。

sum(normmat, 2)
ans =

    1.0000
    1.0000

一排内的比例是恒定的

normmat ./ mat
ans =

    0.1667    0.1667    0.1667
    0.1111    0.1111    0.1111

不一定是最有效的,但它是一条线。

于 2021-04-01T09:05:58.140 回答