Matlab机器学习2(Machine Learning Onramp)

Importing and Preprocessing Data

现在有一批手写字母的样本。每个字母都是从许多不同的志愿者那里收集的。有些人提供了一个字母的很多样本。每个示例保存在一个单独的文件中,所有文件存储在一个文件夹中。如:
user003_B_2.txt
这个文件是志愿者“user003”写的字母B的第二个样本。

创建Datastores

% 使用通配符为所有包_M_的txt文件创建一个datastore文件。
letterds = datastore('*_M_*.txt')

% 使用read函数可以从datastore文件中逐个读取数据
data = read(letterds)
plot(data.X,data.Y)

% 使用read函数读取datastore中的第二个文件
data = read(letterds)
plot(data.X,data.Y)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

% 使用readall函数将datastore中的所有数据文件导入到同一个变量中
data = readall(letterds)
plot(data.X,data.Y)

我们一般需要对每个字母执行一些预处理,比如坐标比例的变化,计算其特征。但是,在使用readall时,无法确定一个文件的数据在何处结束,自下一个文件的数据在何处开始。如果你试图把这种用readall读取的所有的字母放在一起进行预处理肯定是不行的。

导入数据时进行数据预处理

通常要对原始数据做一系列的预处理时,使这个过程自动化的第一步是创建一个有固定操作的自定义函数。
在这里插入图片描述

% 创建一个对原始数据做坐标变换功能的函数
function data = scale(data)
data.Time = (data.Time - data.Time(1))/1000;
data.X = 1.5*data.X;
end

现在我还是要手动调用函数,才是能实现对原始数据的预处理。我希望能在从datastore中read数据的时候直接完成数据的预处理。使用转换函数transform接受一个datastore和转换规则函数作为输入,输出一个做完预处理的datastore。
在这里插入图片描述

% transform函数用来实现转换datastore文件
% 第一参数是希望转换的datastore
% 第二个参数是转换的规则,是一个函数句柄
% 其对应函数的输入参数,一定要和read函数读取datastore的结果结构相同
preprocds = transform(letterds,@scale)
% 对执行过预处理操作获得的新datastore直接使用readall读取
data = readall(preprocds)
plot(data.Time,data.Y)

在这里插入图片描述
在这里插入图片描述
字母的位置对分类来说并不重要。重要的是形状。对于许多机器学习问题,一个常见的预处理步骤是对数据进行归一化。
典型的归一化包括按平均值移动(以便移动数据的平均值为0)或将数据移动和缩放到一个固定的范围(如[-1,1])。
本例中将x和y都移动成均值为0,确保所有的字母都以同一点为中心。
在这里插入图片描述
任何涉及NaN的计算(包括mean等函数的默认使用)都将导致NaN。这在机器学习中很重要,因为在机器学习中,你的数据经常会丢失一些值。在手写数据中,当写作者从平板上取笔时,就会出现NaN。
可以使用“omitnan”选项来使用mean等统计函数来忽略丢失的值。

function data = scale(data)
data.Time = (data.Time - data.Time(1))/1000;
data.X = 1.5*data.X;
data.X = data.X - mean(data.X,"omitnan");
data.Y = data.Y - mean(data.Y,"omitnan");
end

猜你喜欢

转载自blog.csdn.net/Explore_OuO/article/details/108889670