2012-06-27 24 views
8

tôi cần phải bình thường hóa một vector của N số nguyên sao cho:Tôi nên chuẩn hóa một véc-tơ trong Matlab ở đâu tổng là 1?

  • Mỗi giá trị tỷ lệ với giá trị ban đầu của nó (giá trị sẽ nằm giữa 0 và 1)
  • Tổng của tất cả các giá trị là = 1

Ví dụ:

Nếu tôi có một vector

V = [2,2,1,0] 

vector bình thường nên cần phải:

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

Tôi đã thử với nhiều giải pháp được tìm thấy trong cộng đồng này và trên web và cuối cùng tôi đã làm nó với mã này:

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

Vấn đề làm việc này nếu :

  • tất cả các yếu tố của mảng là "0" -> mảng kết quả không thay đổi
  • chỉ có một yếu tố của ARRA y là> 0 và tất cả các phần tử khác là = 0 -> mảng kết quả: phần tử> 0 là 1 và phần tử khác 0

nhưng nếu tôi có trường hợp khác, mặc dù kết quả tỷ lệ thuận, tổng là không 0. Ví dụ:

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

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

(tôi không chắc chắn nếu số lượng là chính xác bởi vì tôi không thể sử dụng Matlab ngay bây giờ nhưng tôi chắc chắn số tiền là> 1)

ahy dấu?

Cảm ơn bạn trước

Trả lời

8

... các chuẩn hóa véc tơ nên là:

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

Điều đó tùy thuộc. Chức năng norm của bạn là gì?

norm(x) trong MATLAB trả về tiêu chuẩn, có nghĩa là tổng của các hình vuông của các yếu tố của một vector bình thường x là 1.

Trong ví dụ của bạn:

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) thực sản lượng 1, nhưng sum(v_norm) không, như mong đợi.


tôi cần phải bình thường hóa một vector của N số nguyên sao cho mỗi giá trị tỷ lệ với giá trị ban đầu của nó (giá trị sẽ nằm giữa 0 và 1) và tổng của tất cả các giá trị là 1.

Ý anh là gì bởi "bình thường"? Điều đó có nghĩa là chia cho một giá trị là một hàm chỉ tiêu toán học hợp lệ, theo số norm definition?

Ý của bạn là gì theo "tỷ lệ thuận"? Điều đó có ngụ ý rằng tất cả các phần tử được nhân với số đó cùng số? Nếu có, và đó là một tiêu chuẩn toán học hợp lệ, bạn không thể đảm bảo rằng tổng các phần tử sẽ luôn là 1.
Ví dụ: xem xét v = [1, -2]. Sau đó sum(v) = -1.

Hoặc có thể sum là hàm bạn đang tìm kiếm, nhưng nó không đủ tiêu chuẩn toán học, bởi vì một chỉ tiêu là một hàm chỉ định chiều dài hoặc kích thước cực dương cho tất cả vectơ trong không gian vectơ .
Trong ví dụ trên, sum(v) là số âm.


ahy gợi ý?

Bạn có thể chọn một trong hai:

  1. sum(x), mà đáp ứng cả hai yêu cầu nhưng không đủ điều kiện như là một chức năng tiêu chuẩn vì nó có thể mang lại giá trị âm.
  2. norm(x, 1), như OleThomsenBuus đề xuất, thực tế tính toán sum(abs(x(:))).
    Nó sẽ không đáp ứng cả hai yêu cầu của bạn trừ khi bạn hạn chế không gian vectơ của bạn thành các vectơ không âm.
6

Nếu không có điều kiện furhter để bình thường hóa của bạn hơn bạn đưa vào đầu câu hỏi của bạn, một giải pháp khả thi sẽ là

V = [3 4 -2]; 
S = sum(V); 
if (S == 0) 
    % no solution 
else 
    V_norm = V ./ S; 
end 
sum(V_norm) 
+0

Là một bên lề, 'sum (v)' không thể tính toán như một [chuẩn] (http://en.wikipedia.org/wiki/Norm_ (toán học)) vì nó có thể mang lại giá trị âm. –

+0

Không đáp ứng yêu cầu của tất cả các giá trị nằm trong khoảng từ 0 đến 1 (xem xét các yếu tố âm). – Tobold

+0

Tôi đồng ý. Tôi không nên sử dụng "bình thường hóa" thay vì "chuẩn mực", cũng như OP. Tôi sẽ chỉnh sửa câu trả lời của tôi cho phù hợp. – Deve

9

Những gì bạn cần làm là, tôi tin rằng, bình thường bằng cách sử dụng (mức taxi) 1-norm:

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

Biến v_normed bây giờ sẽ được [0.4, 0.4, 0.2, 0.0]. 1-norm của v_normed sẽ bằng 1. Bạn cũng có thể tổng hợp vectơ (tương tự như 1-norm, nhưng không áp dụng hàm tuyệt đối cho mỗi giá trị), nhưng phạm vi của tổng đó sẽ nằm trong khoảng từ -1 đến 1 trong trường hợp chung (nếu có giá trị trong v dưới 0). Bạn có thể sử dụng abs trên tổng kết quả, nhưng về mặt toán học, nó sẽ không còn đủ điều kiện làm chuẩn.

+0

+1: Đề nghị tốt, nhưng tôi không nghĩ rằng 'abs' là cần thiết. –

+0

Tốt hơn? Cảm ơn btw. –

+0

Như tôi đã nêu trong câu trả lời của tôi, nó vẫn không đáp ứng được hai yêu cầu của OP đối với các vectơ _all_, nhưng ít nhất nó có đủ tiêu chuẩn toán học như một chuẩn mực. –

Các vấn đề liên quan