大家好,又见面了,我是你们的朋友全栈君。
将数据归一化到任意区间范围的方法
一般常见的数据归一化,是归一化到0~1,或者-1~1的区间,但在一些特殊场合下,我们需要根据实际情况归一化到其他任意区间,方法是:
将数据归一化到[a,b]区间范围的方法:
(1)首先找到样本数据Y的最小值Min及最大值Max
(2)计算系数为:k=(b-a)/(Max-Min)
(3)得到归一化到[a,b]区间的数据:norY=a+k(Y-Min)
Matlab代码:
clc;clear all;close all;
%%
x=0:0.1:10;
y=(x-5).^2;%产生原始数据样本
figure
plot(x,y,'.-')
axis([0 10 0 26]);
grid on
%% 将数据归一化到[a,b]区间的方法
a=0.1;
b=0.5;
Ymax=max(y);%计算最大值
Ymin=min(y);%计算最小值
k=(b-a)/(Ymax-Ymin);
norY=a+k*(y-Ymin);
figure;
plot(x,norY,'.-')
axis([0 10 0 1]);
grid on
实质上,归一化的一般规范函数是:y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin:
参考资料:http://zjh776.iteye.com/blog/1972777
下面给出简化的归一化到任意区间的方法函数:
function [ y ] = normalization( x,ymin,ymax )
%NORMALIZATION 将数据x归一化到任意区间[ymin,ymax]范围的方法
% 输入参数x:需要被归一化的数据
% 输入参数ymin:归一化的区间[ymin,ymax]下限
% 输入参数ymax:归一化的区间[ymin,ymax]上限
% 输出参数y:归一化到区间[ymin,ymax]的数据
xmax=max(x);%计算最大值
xmin=min(x);%计算最小值
y = (ymax-ymin)*(x-xmin)/(xmax-xmin) + ymin;
end
Matlab里有一个归一化函数normalize,对矩阵是按列归一化的:
%按列归一化,任意归一化范围
function [Array_dst]=normalize(Array_src,ymin,ymax)
[l,r]=size(Array_src);
Bound=[];
for i=1:r
Bound(1,i)=min(Array_src(:,i));
Bound(2,i)=max(Array_src(:,i));
if abs(Bound(1,i)-Bound(2,i))<0.000000001
Bound(1,i)=0;
Bound(2,i)=1;
end
end
[m,n]=size(Array_src);
for i=1:m
Array_dst(i,:)=ymin + (Array_src(i,:)-Bound(1,:))./(Bound(2,:)-Bound(1,:)).*( ymax - ymin );
end
OpenCV或者C++中可以这么实现:
cv::Mat Normalization(cv::Mat data,float Omin,float Omax) {
double minv = 0.0, maxv = 0.0;
minMaxIdx(data, &minv, &maxv);
float *p= data.ptr<float>(0);
int len = data.cols;
cv::Mat dest(1, len, CV_32FC1);
float *d = dest.ptr<float>(0);
for (size_t i = 0; i < len; i++)
{
d[i] = (Omax - Omin)*(p[i] - minv)/ (maxv - minv) + Omin;;
}
return dest;
}
cv::Mat Normalization(cv::Mat data, float Imin, float Imax,float Omin, float Omax) {
float *p = data.ptr<float>(0);
int len = data.cols;
cv::Mat dest(1, len, CV_32FC1);
float *d = dest.ptr<float>(0);
for (size_t i = 0; i < len; i++)
{
d[i] = (Omax - Omin)*(p[i] - Imin) / (Imax - Imin) + Omin;;
}
return dest;
}
float Normalization(float x, float Imin, float Imax, float Omin, float Omax) {
float d = (Omax - Omin)*(x - Imin) / (Imax - Imin) + Omin;;
return d;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152310.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...