赞
踩
一直使用python的sklearn库对数据进行标准化(归一化)处理,已经习惯了sklearn的一套操作(MinMaxScaler, StandardScaler), 但是最近项目需要使用Matlab,所以记录一下Matlab的对应处理过程。
说明:本文所有的操作都是针对每行一个样本的数据形式,如下图所示,X1~X8分别代表8个特征变量,Y1和Y2表示当前样本所对应的标签数据。
在进行数据预处理之前先导入数据,由于原始数据集为xlsx文件,在matlab中可以使用readtable
函数读取文件,并将数据集的特征和标签分离开,代码如下:
data = xlsread("ENB2012_data.xlsx");
x = data(:, 1:8);
y = data(:, 9:10);
可以在工作区看到数据的维度信息如下:
说明数据样本总共768条,前8列为特征信息,后2列为标签数据。
在matlab中没有sklearn的train_test_split
函数,但是与此类似有一个用于划分交叉验证的函数可以使用,代码如下:
% 按照比例划分数据集
train_ratio = 0.8; % 训练集的比例
test_ratio = 1 - train_ratio; % 测试集的比例
num_samples = size(x, 1); % 训练样本的第一个维度,也即样本个数,等价于python中的shape
indices = crossvalind('HoldOut', num_samples, test_ratio);
x_train = x(indices, :); % 训练数据集
y_train = y(indices, :);
x_test = x(~indices, :); % 测试数据集
y_test = y(~indices, :);
至此,我们成功将数据集进行了划分,其中训练数据占80%,测试数据占20%,可以根据自己需要进行调整。
划分完毕之后便正式进入正题,数据归一化和标准化。
normalize
函数normalize
默认使用的就是z-score方法,对数据集进行标准化处理的代码如下:
% 数据标准化
[x_train, C, S] = normalize(x_train);
x_test = normalize(x_test, "center", C, "scale", S);
以上代码将训练集的均值和标准差分别记录在C和S变量中,然后再将其作用到测试集,从而实现训练集和测试集标准化过程的统一。
mapminmax
和mapstd
函数从mapminmax
和mapstd
函数的字面意思就可以很好地理解,前者为最大最小归一化,后者为z-score标准化,但是这两个函数有一个需要特别注意的地方就是,它们针对的按照每列一个样本分布的数据集形式,因此在使用的时候,需要将数据先转置,然后标准化,然后再转置,从而得到复原的数据。
mapminmax
归一化% 使用mapminmax进行归一化处理,将数据缩放到[0, 1]区间
% ps用来存储训练集归一化使用的参数
[x_train, ps] = mapminmax(x_train', 0, 1);
% 使用apply参数将训练集的参数作用到测试集
x_test = mapminmax('apply', x_test', ps);
x_train = x_train';
x_test = x_test';
再一次强调,mapminmax
和mapstd
函数是针对每列一个样本的数据形式,需要将数据进行转置之后进行标准化/归一化处理,处理完之后再转置回来。
代码中的x_train'
右上角的'
代表的是转置过程!
归一化的部分结果展示,可以看到所有的数据都被缩放到[0,1]
区间:
训练集数据:
测试集数据:
如果将ps参数输出,可以看到如下信息,这是训练集归一化的参数,正是通过这些参数的传递,能够使得测试集保持和训练集一样的归一化过程。
% 使用mapstd进行标准化处理
% ps用来存储训练集归一化使用的参数
[x_train, ps] = mapstd(x_train');
% 使用apply参数将训练集的参数作用到测试集
x_test = mapstd('apply', x_test', ps);
% 将数据从转置的形式还原
x_train = x_train';
x_test = x_test';
如果将ps参数输出,可以得到如下信息,也即训练集标准化的参数:
在完成了数据的预处理之后,可以将数据保存下来,方便之后的调用和加载,避免过程重复。
.mat
文件可以使用如下代码保存数据:
save("data.mat", "x_train", "x_test", "y_train", "y_test");
以上代码用于将四个变量x_train
, x_test
, y_train
, y_test
保存到文件data.mat
中,加载的过程也十分简单,使用load函数就可以将四个变量加载到工作区了,后续使用也依然使用原变量名,也就是这里的x_train
,x_test
等。
.csv
文件或者可以将其保存为其它文件格式,比如csv文件使用如下代码:
csvwrite("x_train.csv", x_train);
csvwrite("x_test.csv", x_test);
csvwrite("y_train.csv", y_train);
csvwrite("y_train.csv", y_test);
可以看到的是,matlab的csvwrite
函数每次只能导出一个变量,加载过程同样简单:
x_train = csvread("x_train.csv");
x_test = csvread("x_test.csv");
y_train = csvread("y_train.csv");
y_test = csvread("y_test.csv");
.txt
文件filename = 'data_x.txt'; % 文件名
% 将数据写入文件, 使用逗号做分隔符,精度保留6位小数
dlmwrite(filename, x_train, 'delimiter', ',', 'precision', '%.6f');
% 使用-append参数表示追加数据,将x_test变量追加到filename文件中,其他内容与上方保持一致
dlmwrite(filename, x_test, '-append', 'delimiter', ',', 'precision', '%.6f');
另外,除了使用dlmwrite
函数,还可以使用save
函数进行txt
文件的保存,与dlmwrite
函数些许不同的是,save的保存格式默认为科学计数法,而使用dlmwrite`可以自定义,可根据需求选用,两者效果如下:
save函数数据保存格式示意图:
dlmwrite函数数据保存格式示意图:
参考内容:
MATLAB官方文档
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。