机器学习--手写英文字母2--导入与处理数据

目录

1.创建数据存储

2.添加预处理函数

本节代码


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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值