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

私はこのコミュニティとWebで見つかった多くのソリューションを試し、最後に次のコードでそれを行いました。

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

これが機能する問題:

  • 配列のすべての要素は「0」です->結果の配列は変更されません
  • 配列の1つの要素のみが>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 ノルムは 1v_normedに等しくなります。ベクトルを合計することもできます (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では、標準ノルムを返します。これは、正規化されたベクトルの要素の2乗の合計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)、期待どおりには生成しません。


各値が元の値に比例し(値は0から1の間になります)、すべての値の合計が1になるように、N個の整数のベクトルを正規化する必要があります。

「正規化」とはどういう意味ですか?それは、ノルムの定義に従って、有効な数学的ノルム関数である値で除算することを意味しますか?

「比例」とはどういう意味ですか?それは、すべての要素が同じ数で乗算されることを意味しますか?もしそうなら、そしてそれが有効な数学的規範であるならば、要素の合計が常に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

1 行内の比率は一定です

normmat ./ mat
ans =

    0.1667    0.1667    0.1667
    0.1111    0.1111    0.1111

必ずしも最も効率的ではありませんが、1 行です。

于 2021-04-01T09:05:58.140 に答える