数据的归一化及其还原

 

本文算法源于作者导师主持的某动态心电压缩算法研究项目,为作者原创,可供对数据整理和归一化有需求的同学研究、讨论。 

该算法目的是将由11位表示的带符号整数归一化到-127~128之间,通过减小数据表示的位数以实现数据压缩,可作为全局压缩算法的一个环节。

 

数据集ToBeTrans.mat是重庆某医院提供的标准12导联动态心电数据(N*12),一列代表一个导联的数据(Lead),导联即通道(Channel),表示连续采自一个传感器的数据。

其中ftrQrsData_V6为来自V6导联的数据,读者可用一列随机整数集来测试。

 

程序以matlab源码描述,可以R2006a、R2008a上正确运行。 

这里谨列出:归一化、还原,以及测试函数。

 

第一部分:normData.m 

% 函数:归一化数据为int8型
function [normD, minD, maxD] = normData(data)
minD = min(data);
maxD = max(data);
normD = data / (maxD-minD) * 128; % 计算;先归一化到[-1,1]上,再乘128
normD = round(normD); % 整型便于存储
normD = int8(normD);
% data_rec2 = round ( data_norm2 / 128 * (maxD-minD) );

 

 第二部分:recoData.m 

% 函数:将归一化数据(int8型)还原
function [recoD] = recoData(normD, minD, maxD)
normD = double(normD);
recoD = round ( normD / 128 * (maxD-minD) );

 
第三部分:TestingCase.m

% 测试归一化与逆归一化程序
clear all; close all; clc;
load ToBeTrans.mat;
[normD, minD, maxD] = normData(ftrQrsData_V6);
recoD = recoData(normD, minD, maxD);

err = recoD - ftrQrsData_V6;
prd = sqrt(sum(err.^2) / sum(ftrQrsData_V6.^2)); % 误差以PRD,即均方根误差来衡量

figure;
subplot(211);
plot(err(1:300)),title('重建误差');
subplot(212);
plot(ftrQrsData_V6(1:300), 'r:'),title('重建对比'), hold on;
plot(recoD(1:300)), hold off;
legend('org', 'rec');

disp(sprintf('归一化后还原,其误差PRD为 %g%%,可行!', prd*100));

 

至于测试结果,作者亲自验证之后才在程序里写上“XX可行”字样的,见笑了。

你可能感兴趣的:(数据的归一化及其还原)