16
A
回答
26
norm
归一向量,使其平方和是1。
如果要使得它的所有元素都是0和1之间,则需要使用的最小值和最大值,以归一化载体,其然后你可以再次使用非规范化。
%# 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
乔纳斯在答案上构建的扩展答案如下。它允许基于矢量中是否存在负数和正数以及是否需要手动选择所需的归一化类型来进行自动归一化。该函数下面是一个测试脚本。
正常化功能
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
脚本测试功能
% 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
的最高最新的答案是使用在Matlab R2017b推出rescale
功能。为了标准化矢量A
的范围-1:1
,你会运行:
maxA = max(A(:));
minA = min(A(:));
A = rescale(A, -1, 1);
% use the normalised A
A = rescale(A, minA, maxA);
相关问题
- 1. 范围标准化(0到1)
- 2. 反规范化MLData在Encog
- 3. 反规范化的建议
- 4. R反规范化数据
- 5. 变化范围,以html
- 6. 规范化表
- 7. Java:XML规范化
- 8. Oracle规范化
- 9. PDF“规范化”
- 10. 规范化sklearn
- 11. SQL规范化
- 12. 如何规范化此表
- 13. 规范化以下场景
- 14. 简化范围
- 15. 正常化从[0.5 - 1]到[0 - 1]
- 16. 规范化SQL表
- 17. 规范化或反规范化将修订历史存储在RDBMS中?
- 18. 如何使KernalDensity正常化为1?
- 19. 如何正常化1维FFT输出
- 20. 规范化表格
- 21. 将非规范化文件中的数据加载到规范化表中
- 22. Angular 1.x指令范围
- 23. 索引1超出范围
- 24. 反规范化意味着什么?
- 25. 表链,什么时候反规范化?
- 26. 功能规范化
- 27. 地址规范化
- 28. 规范化 - SQL - 3NF
- 29. 规范化属性
- 30. 规范化和3NF
我如何使用相同的代码:
你可以通过保存的最小和最大事先然后再次运行重新调整撤消此正常化在0和1之间? – Shyamkkhadka 2017-05-19 13:12:35