Matlab实现标准化和归一化

一直使用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^=xmaxxminxxmin
    数据的标准化/归一化的过程分为如下三个步骤:
  1. 计算训练集的标准化/归一化参数,比如均值、标准差等;
  2. 使用训练集的标准化/归一化参数对训练集进行标准化/归一化;
  3. 使用训练集的标准化/归一化参数对测试集进行标准化/归一化;
    于是我们有必要将训练集的标准化/归一化参数进行保存,然后将同样的参数输入给测试集进行标准化处理。

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 使用mapminmaxmapstd函数

mapminmaxmapstd函数的字面意思就可以很好地理解,前者为最大最小归一化,后者为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';

再一次强调,mapminmaxmapstd函数是针对每列一个样本的数据形式,需要将数据进行转置之后进行标准化/归一化处理,处理完之后再转置回来。

代码中的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_trainx_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函数数据保存格式示意图:
save保存格式
dlmwrite函数数据保存格式示意图:
dlmwrite格式

参考内容:
MATLAB官方文档

  • 1
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值