将数据归一化到任意区间范围的方法
生活随笔
收集整理的這篇文章主要介紹了
将数据归一化到任意区间范围的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將數據歸一化到任意區間范圍的方法
? ?一般常見的數據歸一化,是歸一化到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; endMatlab里有一個歸一化函數normalize,對矩陣是按列歸一化的:
?
%按列歸一化,任意歸一化范圍 function [Array_dst]=normalize(Array_src,ymin,ymax) [l,r]=size(Array_src); Bound=[]; for i=1:rBound(1,i)=min(Array_src(:,i));Bound(2,i)=max(Array_src(:,i));if abs(Bound(1,i)-Bound(2,i))<0.000000001Bound(1,i)=0;Bound(2,i)=1;end end[m,n]=size(Array_src); for i=1:mArray_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; }?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的将数据归一化到任意区间范围的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++读取txt数据为二维数组 将数据保
- 下一篇: 图像增强:多尺度的图像细节提升(mult