目录
1.创建数据存储
手写示例文件
每封信的样本都是从许多不同的志愿者那里收集的。有些人提供了每封信的不止一个样本。每个样本都保存在一个单独的文件中,所有文件都存储在一个文件夹中。文件名的格式如下
user003_B_2.txt
这个文件将包含志愿者指定的“user003”所写的字母B的第二个样本。
letterds = datastore("*_M_*.txt")
data = read(letterds)
plot(data.X,data.Y)
再次使用read,读取datastore里的第二个文件
data = read(letterds)
plot(data.X,data.Y)
使用readall函数将所有文件中的数据导入到名为data的表中。通过绘制Y与X的对比图使数据可视化。
data = readall(letterds)
plot(data.X,data.Y)
2.添加预处理函数
通常,您需要对原始数据的每个样本应用一系列预处理操作。自动化此过程的第一步是创建一个自定义函数,该函数应用特定的预处理操作。
letterds = datastore("*_M_*.txt");
data = read(letterds);
data = scale(data);
plot(data.X,data.Y)
axis equal
plot(data.Time,data.Y)
ylabel("Vertical position")
xlabel("Time")
在脚本末尾创建一个名为scale的函数,该函数执行以下操作:
data.Time=(data.Time-data.Time(1))/1000;
data.X=1.5*data.X;
因为这些命令直接修改变量数据,所以函数应该使用数据作为输入和输出变量。
注意,脚本的第三行调用scale函数。在创建此函数之前,您的脚本不会运行。
还要注意,本地函数必须位于脚本的末尾。这意味着您将在此交互中按顺序编辑脚本部分。节标题显示在每个任务中要编辑脚本的哪个节。
function dataout = scale(data)
data.Time = (data.Time - data.Time(1))/1000;
data.X = 1.5*data.X;
dataout = data
end
目前,仍需要手动调用函数。为了自动化数据导入和预处理,您希望数据存储在读取数据时应用此函数。您可以使用转换后的数据存储来执行此操作。transform函数接受一个数据存储和一个函数作为输入。它返回一个新的数据存储作为输出。此转换的数据存储在导入数据时应用给定函数。
背景
要将函数用作另一个函数的输入,请在函数名的开头添加@符号,创建函数句柄。
transform(ds,@myfun)
函数句柄是对函数的引用。如果没有@符号,MATLAB会将函数名解释为对该函数的调用。
使用transform函数创建名为predocds的转换数据存储。此数据存储应将scale函数应用于letterds引用的数据。
preprocds = transform(letterds,@scale)
现在,每当从预印本数据存储中读取数据时,应自动应用缩放功能。
使用readall函数导入所有数据。通过将Y变量绘制为时间函数,检查预处理函数是否应用于每个文件。
data = readall(preprocds)
plot(data.Time,data.Y)
字母的位置对分类并不重要。重要的是形状。对于许多机器学习问题,一个常见的预处理步骤是对数据进行规范化。
典型的规范化包括按平均值移位(使移位数据的平均值为0)或将数据移位并缩放到固定范围(例如[-1,1])。在手写字母的情况下,将x和y数据的平均值都转换为0将确保所有字母都围绕同一点居中。
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);
data.Y = data.Y - mean(data.Y);
end
任何涉及NaNs的计算(包括默认使用mean等函数)都将导致NaN。这在机器学习中是很重要的,因为在机器学习中,数据中的值经常丢失。在手写数据中,只要作者从写字板上提起笔,就会出现NaN。
您可以使用“omitnan”选项来使用诸如mean ignore missing values之类的统计函数。
mean(x,“omitnan”)
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
本节代码
letterds = datastore("*_M_*.txt");
data = read(letterds);
data = scale(data);
plot(data.X,data.Y)
axis equal
plot(data.Time,data.Y)
ylabel("Vertical position")
xlabel("Time")
preprocds = transform(letterds,@scale)
data = readall(preprocds)
plot(data.Time,data.Y)
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