一直使用python的sklearn库对数据进行标准化(归一化)处理,已经习惯了sklearn的一套操作(MinMaxScaler, StandardScaler), 但是最近项目需要使用Matlab,所以记录一下Matlab的对应处理过程。

说明:本文所有的操作都是针对每行一个样本的数据形式,如下图所示,X1~X8分别代表8个特征变量,Y1和Y2表示当前样本所对应的标签数据。

1.数据导入

在进行数据预处理之前先导入数据,由于原始数据集为xlsx文件,在matlab中可以使用readtable函数读取文件,并将数据集的特征和标签分离开,代码如下:

data = xlsread("ENB2012_data.xlsx");

x = data(:, 1:8);

y = data(:, 9:10);

可以在工作区看到数据的维度信息如下: 说明数据样本总共768条,前8列为特征信息,后2列为标签数据。

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%,可以根据自己需要进行调整。 划分完毕之后便正式进入正题,数据归一化和标准化。

3.数据标准化/归一化

标准化也叫z-score标准化,其过程就是将数据转换为均值为0,标准差为1的标准分布形式,其公式如下所示:

x

^

=

x

μ

σ

\hat{x}=\frac{x-\mu}{\sigma}

x^=σx−μ​ 其中

μ

\mu

μ为数据的均值,

σ

\sigma

σ为数据的标准差。归一化,一般认为归一化为最大最小归一化,也即将最大值缩放为1,最小值缩放为0的变化过程。 公式如下:

x

^

=

x

x

m

i

n

x

m

a

x

x

m

i

n

\hat{x} = \frac{x-x_{min}}{x_{max}-x_{min}}

x^=xmax​−xmin​x−xmin​​ 数据的标准化/归一化的过程分为如下三个步骤:

计算训练集的标准化/归一化参数,比如均值、标准差等;使用训练集的标准化/归一化参数对训练集进行标准化/归一化;使用训练集的标准化/归一化参数对测试集进行标准化/归一化; 于是我们有必要将训练集的标准化/归一化参数进行保存,然后将同样的参数输入给测试集进行标准化处理。

3.1 使用normalize函数

normalize默认使用的就是z-score方法,对数据集进行标准化处理的代码如下:

% 数据标准化

[x_train, C, S] = normalize(x_train);

x_test = normalize(x_test, "center", C, "scale", S);

以上代码将训练集的均值和标准差分别记录在C和S变量中,然后再将其作用到测试集,从而实现训练集和测试集标准化过程的统一。

3.2 使用mapminmax和mapstd函数

从mapminmax和mapstd函数的字面意思就可以很好地理解,前者为最大最小归一化,后者为z-score标准化,但是这两个函数有一个需要特别注意的地方就是,它们针对的按照每列一个样本分布的数据集形式,因此在使用的时候,需要将数据先转置,然后标准化,然后再转置,从而得到复原的数据。

3.2.1使用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参数输出,可以看到如下信息,这是训练集归一化的参数,正是通过这些参数的传递,能够使得测试集保持和训练集一样的归一化过程。

3.2.2使用mapstd`标准化

% 使用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参数输出,可以得到如下信息,也即训练集标准化的参数:

4.数据保存

在完成了数据的预处理之后,可以将数据保存下来,方便之后的调用和加载,避免过程重复。

4.1 保存为.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等。

4.2 保存为.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");

4.3 保存为.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官方文档

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: