人工智能 | 机器学习 | 入门之旅(一)

该文章是MATLABHome网站上的机器学习入门教程,通过字迹识别示例介绍分类工作流,包括数据导入、处理、特征提取和模型建立与评估。读者将学习如何使用MATLAB进行数据操作和建模,以及如何评估模型性能。
摘要由CSDN通过智能技术生成

Hi,大家好,我是半亩花海。本专栏主要是基于 MATLAB在线学习网站MATLAB Home (mathworks.com)的机器学习入门之旅,详情可见使用 MATLAB 进行机器学习 - MATLAB & Simulink (mathworks.cn)该网站的有关在线学习课程,感觉是新手的入门利器。

目录

1.机器学习概述

2.分类工作流

2.1 概览

2.2 导入数据

任务 1

任务 2

任务 3

任务 4

2.3 处理数据

任务 1

任务 2

2.4 提取特征(计算特征)

任务 1

任务 2

2.5 提取特征(查看特征)

任务 1

任务 2

2.6 建立模型

任务 1

任务 2

任务 3

2.7 评估模型

任务 1

任务 2

任务 3

任务 4

任务 5

2.8 复习

任务 1

任务 2

任务 3


1.机器学习概述

欢迎大家一起加入机器学习入门之旅!

在传统建模中,我们必须根据系统的工作原理来自己找出方法,但许多现实问题过于复杂而无法通过上述方式解决。使用机器学习,我们可以改为基于数据构建模型,将机器学习算法应用于真实数据,并让机器从这些示例中学习如何输入映射到期望的输出。

本课程主要是通过字迹识别示例来了解整个分类工作流——导入数据-清理数据-提取信息-构建模型-评估模型

 让我们一起从入门到轻松实战吧!

如下是 MATLAB在线网站MATLAB Home (mathworks.com) 的页面:

以及使用 MATLAB 进行机器学习 - MATLAB & Simulink (mathworks.cn)在线学习课程的网站页面:


2.分类工作流

2.1 概览

以下是分类工作流概述。


2.2 导入数据

任务 1

背景

您可以使用 readtable 函数从电子表格或文本文件导入表格数据,并将结果以表的形式存储。

data = readtable("myfile.xlsx");

这将从电子表格 myfile.xlsx 中导入数据,并将其存储在名为 data 的表中。

任务

将存储在文件 "J.txt" 中的数据读入名为 letter 的变量。

letter = readtable("J.txt");

结果 

任务 2

您可以使用圆点表示法来引用表中的任何单个变量

x = mytable.Xdata;

y = mytable.Ydata;

这样可以从表 mytable 中提取变量 Xdata 并将结果存储在名为 x 的新变量中。同样,变量 Ydata 也会被提取后存储到 y 中。

任务

通过在水平轴上绘制 letter 的 X 变量和在垂直轴上绘制 Y 变量来可视化字母。

plot(letter.X,letter.Y)

结果

任务 3

默认轴范围会使字母的纵横比失真。您可以使用 axis 命令强制轴保持数据的纵横比。

任务

使用命令 axis equal 修正绘图的纵横比。

axis equal

结果

任务 4

任务

对文件 M.txt 中的数据重复执行相同的导入和绘制任务。

letter = readtable("M.txt")
plot(letter.X,letter.Y)
axis equal

结果


2.3 处理数据

任务 1

背景

您可以使用圆点表示法来提取、修改表中的变量并对其重新赋值,就像处理任何变量一样。

x = x + 3;

data.XVal = data.XVal + 3;

任务

将表 letter 的变量 X 中的值乘以纵横比 1.5。将结果重新赋给 X,使 letter 包含修正后的数据。

letter.X = 1.5*letter.X;
% View the result
plot(letter.X,letter.Y)
axis equal

结果

任务 2

背景

您可以像对任意变量一样对表中的变量进行索引。

finalX = data.XVal(end);

任务

通过从所有元素中减去第一个值,对表 letter 的 Time 变量进行偏移以从 0 开始。将结果除以 1000 以转换为秒。将结果重新赋给 Time,使 letter 包含调整后的数据。

letter.Time =  (letter.Time-letter.Time(1)) / 1000;
% View the result
plot(letter.Time,letter.X)
plot(letter.Time,letter.Y)

结果


2.4 提取特征(计算特征)

任务 1

背景

特征仅仅是根据信号计算的值,例如其持续时间。

任务

通过提取 letter.Time 的最后一个值并将结果存储在名为 dur 的变量中,来计算书写该字母所需的时间。

% Do not edit. This code loads and preprocesses the data.
letter = readtable("M.txt");
letter.X = letter.X*1.5;
letter.Time = (letter.Time - letter.Time(1))/1000
plot(letter.X,letter.Y)
axis equal

dur = letter.Time(end)

结果

任务 2

range 函数返回数组中值的极差。即 range(x) 等效于 max(x) - min(x)

任务

使用 range 函数通过将 letter.Y 的值极差除以 letter.X 的值极差来计算字母的纵横比。将结果赋给名为 aratio 的变量。

aratio = range(letter.Y)/range(letter.X)

结果


2.5 提取特征(查看特征)

任务 1

MAT 文件 featuredata.mat 包含一个表,其中包含由不同人书写的 470 个字母的提取特征。表 features 有三个变量:AspectRatio 和 Duration(在上一节中计算的两个特征)以及 Character(已知字母)。

任务

使用 scatter 函数绘制提取的特征,水平轴上为纵横比,垂直轴上为持续时间。

% Do not edit. This code loads the data.
load featuredata.mat
features

scatter(features.AspectRatio,features.Duration)

结果

任务 2

尚不清楚这些特征是否足以区分数据集中的三个字母(J、M 和 V)。gscatter 函数生成一个分组散点图——即根据分组变量对点进行着色的散点图

gscatter(x,y,g)

任务

使用 gscatter 函数创建与之前相同的散点图,但根据字母进行着色,字母存储在表 features 的 Character 变量中。

gscatter(features.AspectRatio,features.Duration,features.Character)

结果


2.6 建立模型

以下代码加载数据

load featuredata.mat
features

任务 1

背景

一个简单模型是将一个观测值与最邻近的已知示例划分为相同的类。这称为 k 最近邻 (kNN) 模型。您可以通过将数据表传递给 fitcknn 函数来拟合 kNN 模型。
mdl = fitcknn(data,"ResponseVariable");

第二个输入是表中响应变量的名称(即模型要预测的类)。输出是包含拟合模型的变量。

470 个已知示例的特征和类存储在表 features 中,该表存储在 featuredata.mat 中。

任务

使用 fitcknn 函数对 features 中存储的数据进行模型拟合。已知的类存储在名为 Character 的变量中。将生成的模型存储在名为 knnmodel 的变量中。

knnmodel = fitcknn(features,"Character")

结果

任务 2

背景

predict 函数用于确定新观测值的预测类。

predClass = predict(model,newdata)

输入是经过训练的模型和新观测值。输出是 newdata 中每个观测值的预测类的分类数组。

通常情况下,新观测值以表的形式出现,其预测变量与用于训练模型的预测变量相同。然而,在本例中,模型使用了两个数值特征(纵横比和持续时间),因此观测值也能以具有两列的数值数组形式出现。

任务

使用 predict 函数和经过训练的模型 knnmodel 对纵横比为 4、持续时间为 1.2 的一个字母进行分类。将预测存储在名为 predicted 的变量中。以二元素行向量形式提供字母特征。

predicted = predict(knnmodel,[4,1.2])

结果

任务 3

背景

 通过在调用 fitcknn 时设置 "NumNeighbors" 属性,可以在 kNN 模型中指定 k 的值。

mdl = fitcknn(data,"ResponseVariable",...

"NumNeighbors",10);

任务

重复前两个任务中的命令,但使用 "NumNeighbors" 选项将模型中的邻点数更改为 5。

knnmodel = fitcknn(features,"Character","NumNeighbors",5)
predicted = predict(knnmodel,[4,1.2])

结果


2.7 评估模型

任务 1

kNN 模型的性能如何?您可以使用该模型进行预测,但这些预测的性能如何?通常,您需要让模型对已知正确分类的观测值进行预测,以此来测试模型。

文件 featuredata.mat 包含表 testdata,该表具有与 features 相同的变量,包括测试观测值的已知所属类。不过,features 并不包含testdata 中的观测值。您可以使用 predict 函数来获得 kNN 模型对 testdata 中的观测值的预测,然后将预测情况与已知类进行比较,以评估该模型对新数据的处理效果。

请注意,使用模型执行预测时,predict 函数将忽略 Character 变量。

任务

使用 predict 函数和经过训练的模型 knnmodel 对表 testdata 中的字母进行分类。将预测存储在名为 predictions 的变量中。

% Do not edit. This code loads the data.
load featuredata.mat
knnmodel = fitcknn(features,"Character","NumNeighbors",5);
testdata

predictions = predict(knnmodel,testdata)

结果

任务 2

测试观测值的已知所属类存储在表 testdata 的变量 Character 中。

任务

使用 == 运算符将 predictions 与已知类进行比较。将结果存储在名为 iscorrect 的变量中。

iscorrect = predictions == testdata.Character

结果

任务 3

任务

将正确预测数除以预测总数,计算出正确预测的比例。将结果存储在名为 accuracy 的变量中。您可以使用 sum 函数确定正确预测数,使用 numel 函数来确定预测总数。

accuracy = sum(iscorrect)/numel(predictions)

结果

任务 4

常用的评估模型指标是误分类率(不正确预测的比例),而不是准确度(正确预测的比例)。

任务

使用 ~= 运算符确定误分类率。将结果存储在名为 misclassrate 的变量中。

iswrong = predictions ~= testdata.Character
misclassrate = sum(iswrong)/numel(predictions)

结果

任务 5

准确度和误分类率使用单个值来描述模型的整体性能,但进一步细分模型混淆了哪些类可能会很有用。混淆矩阵显示真实类和预测类的每个组合的观测值数目。

混淆矩阵通常根据元素的值给元素着色来实现可视化。通常,对角线元素(正确分类)用同一种颜色着色,其他元素(不正确分类)用另一种颜色着色。您可以使用 confusionchart 函数来可视化混淆矩阵。

confusionchart(ytrue,ypred);

其中 ytrue 是已知类的向量,ypred 是预测类的向量。

任务

使用 confusionchart 函数将 predictions 与已知标签(存储在表 testdata 的变量 Character 中)进行比较。

confusionchart(testdata.Character,predictions)

结果


2.8 复习

任务 1

背景

MAT 文件 featuredata13letters.mat 包含表 (features),其中的特征与之前的相同。然而,现在的数据包括 13 个不同字母的采样。

任务

使用 gscatter 函数对 features 中的观测值绘图,水平轴为纵横比,垂直轴为持续时间,按类着色(存储在 Character 变量中)。

不会评估坐标轴范围,但您可能希望用这些范围进行试验,以放大大部分观测值。

% Do not edit. This code loads the data.
load featuredata13letters.mat
features
testdata

gscatter(features.AspectRatio,features.Duration,features.Character)
xlim([0 10])

结果

任务 2

任务

使用 fitcknn 函数对数据进行模型拟合。将 "NumNeighbors" 属性设置为 5。将模型存储在名为 knnmodel 的变量中。使用模型预测 testdata 中存储的观测值的类。将预测存储在名为 predictions 的变量中。

knnmodel = fitcknn(features,"Character","NumNeighbors",5);
predictions = predict(knnmodel,testdata);

结果

任务 3

表 testdata 包含变量 Character 中的已知类。

任务

计算模型的误分类率,创建一个混淆矩阵图。将误分类率存储在名为 misclass 的变量中。

misclass = sum(predictions ~= testdata.Character)/numel(predictions)
confusionchart(testdata.Character,predictions);

结果

​​​​​✨写作不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半亩花海

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值