2011-01-13 27 views

Trả lời

26

norm bình thường hóa một vector để tổng của hình vuông là 1.

Nếu bạn muốn bình thường hóa các vector để tất cả các yếu tố của nó nằm giữa 0 và 1, bạn cần phải sử dụng tối thiểu và giá trị lớn nhất, mà sau đó bạn có thể sử dụng để không chuẩn hóa lại.

%# generate some vector 
vec = randn(10,1); 

%# get max and min 
maxVec = max(vec); 
minVec = min(vec); 

%# normalize to -1...1 
vecN = ((vec-minVec)./(maxVec-minVec) - 0.5) *2; 

%# to "de-normalize", apply the calculations in reverse 
vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec 
+0

Làm thế nào tôi có thể sử dụng cùng một mã để bình thường hóa trong khoảng từ 0 đến 1? – Shyamkkhadka

+0

@Shyamkkhadka: Sử dụng mã do ScottG cung cấp bên dưới hoặc sử dụng '((vec-minVec) ./ (maxVec-minVec))' – Jonas

0

Câu trả lời mở rộng được xây dựng dựa trên câu trả lời của Jonas bên dưới. Nó cho phép chuẩn hóa tự động dựa trên các số âm và dương có mặt trong véc-tơ hoặc lựa chọn thủ công loại bình thường mong muốn. Bên dưới hàm là một tập lệnh thử nghiệm.

chức năng Normalization

function [vecN, vecD] = normVec(vec,varargin) 
% Returns a normalize vector (vecN) and "de-nomralized" vector (vecD). The 
% function detects if both positive and negative values are present or not 
% and automatically normalizes between the appropriate range (i.e., [0,1], 
% [-1,0], or [-1,-1]. 
% Optional argument allows control of normalization range: 
% normVec(vec,0) => sets range based on positive/negative value detection 
% normVec(vec,1) => sets range to [0,1] 
% normVec(vec,2) => sets range to [-1,0] 
% normVec(vec,3) => sets range to [-1,1] 

%% Default Input Values 
% Check for proper length of input arguments 
numvarargs = length(varargin); 
if numvarargs > 1 
    error('Requires at most 1 optional input'); 
end 

% Set defaults for optional inputs 
optargs = {0}; 

% Overwrite default values if new values provided 
optargs(1:numvarargs) = varargin; 

% Set input to variable names 
[setNorm] = optargs{:}; 

%% Normalize input vector 
% get max and min 
maxVec = max(vec); 
minVec = min(vec); 

if setNorm == 0 
    % Automated normalization 
    if minVec >= 0 
     % Normalize between 0 and 1 
     vecN = (vec - minVec)./(maxVec - minVec); 
     vecD = minVec + vecN.*(maxVec - minVec); 
    elseif maxVec <= 0 
     % Normalize between -1 and 0 
     vecN = (vec - maxVec)./(maxVec - minVec); 
     vecD = maxVec + vecN.*(maxVec - minVec); 
    else 
     % Normalize between -1 and 1 
     vecN = ((vec-minVec)./(maxVec-minVec) - 0.5) *2; 
     vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec; 
    end 
elseif setNorm == 1 
    % Normalize between 0 and 1 
    vecN = (vec - minVec)./(maxVec - minVec); 
    vecD = minVec + vecN.*(maxVec - minVec); 
elseif setNorm == 2 
    % Normalize between -1 and 0 
    vecN = (vec - maxVec)./(maxVec - minVec); 
    vecD = maxVec + vecN.*(maxVec - minVec); 
elseif setNorm == 3 
    % Normalize between -1 and 1 
    vecN = ((vec-minVec)./(maxVec-minVec) - 0.5) *2; 
    vecD = (vecN./2+0.5) * (maxVec-minVec) + minVec; 
else 
    error('Unrecognized input argument varargin. Options are {0,1,2,3}'); 
end 

Script để kiểm tra chức năng

% Define vector 
x=linspace(0,4*pi,25); 
y = sin(x); 
ya=sin(x); yb=y+10; yc=y-10; 

% Normalize vector 
ya0=normVec(ya); yb0=normVec(yb); yc0=normVec(yc); 
ya1=normVec(ya,1); yb1=normVec(yb,1); yc1=normVec(yc,1); 
ya2=normVec(ya,2); yb2=normVec(yb,2); yc2=normVec(yc,2); 
ya3=normVec(ya,3); yb3=normVec(yb,3); yc3=normVec(yc,3); 

% Plot results 
figure(1) 
subplot(2,2,1) 
plot(x,ya0,'k',x,yb0,'ro',x,yc0,'b^') 
title('Auto Norm-Range') 
subplot(2,2,2) 
plot(x,ya1,'k',x,yb1,'ro',x,yc1,'b^') 
title('Manual Norm-Range: [0,1]') 
subplot(2,2,3) 
plot(x,ya2,'k',x,yb2,'ro',x,yc2,'b^') 
title('Manual Norm-Range: [-1,0]') 
subplot(2,2,4) 
plot(x,ya3,'k',x,yb3,'ro',x,yc3,'b^') 
title('Manual Norm-Range: [-1,1]') 
0

Một up-to-date câu trả lời sẽ được sử dụng các chức năng rescale giới thiệu trong Matlab R2017b. Để chuẩn hóa vector A đến phạm vi -1:1, bạn muốn chạy:

A = rescale(A, -1, 1); 

Bạn có thể hoàn tác này bằng cách tiết kiệm tối thiểu và tối đa trước sau đó chạy rescale một lần nữa:

maxA = max(A(:)); 
minA = min(A(:)); 
A = rescale(A, -1, 1); 
% use the normalised A 
A = rescale(A, minA, maxA); 
Các vấn đề liên quan