Matlab机器学习1(Machine Learning Onramp)

典型工作流程

以一个处理手写字母的项目为例子,熟悉Matlab的机器学习流程。
在这里插入图片描述

导入数据

在这里插入图片描述

手写信件被存储为单独的文本文件。每个文件都是用逗号分隔的,并包含四列:时间戳、钢笔的水平位置、钢笔的垂直位置和钢笔的压力。时间戳是自数据收集开始以来所经过的时间(毫秒)。其他变量以归一化单位(0到1)表示。对于笔的位置,0表示书写表面的底部和左侧边缘,1表示顶部和右侧边缘。

letter = readtable('J.txt')	%将J.txt中的四列数据存储为一个table
plot(letter.X,letterY)	%绘制笔迹
axis equal	% 使横纵坐标轴保持相同的尺寸比例

在这里插入图片描述

处理数据

用于书写数据的笔位以归一化单位(0到1)进行测量。然而,用于记录数据的平板不是正方形的。这意味着1的垂直距离对应10英寸,而相同的水平距离对应15英寸。要纠正这个问题,水平单位应该调整到范围[0 1.5],而不是[0 1]。
在这里插入图片描述

letter = readtable("M.txt")
letter.X = 1.5*letter.X;	% 调整字母M的横纵坐标比例
plot(letter.X,letter.Y)
axis equal

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

时间戳是自数据收集以来的时间记录,而我们关心的是从写字开始,笔尖位位置与时间的对应关系(以秒为单位)。

letter.Time = letter.Time - letter.Time(1)
letter.Time = letter.Time/1000

plot(letter.Time,letter.X)
plot(letter.Time,letter.Y)

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

提取特征(Calculating Features)

这些字母的哪些方面可以用来区分J和M或V?我们的目标不是使用原始信号,而是计算将整个信号提取为简单、有用的信息单元的值,这些信息单元被称为特征
对于字母J和M,一个简单的特性可能是长宽比(字母的高度相对于宽度)。一个J可能又高又窄,而一个M可能更方形。
与J和M相比,V写起来很快,所以信号的持续时间可能也是一个显著的特征。

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) % 计算写这个字母的持续时间
aratio = range(letter.Y)/range(letter.X) % 计算这个字母的长宽比

提取特征(Viewing Features)

我们需要把特征与字母对应起来,即哪些特征应该分为哪一类。

load featuredata.mat
features % featuredata.mat文件中存有一个table:feature。包含三列共470组数据,如下图所示

在这里插入图片描述

% gscatter函数制作一个分组散点图,即根据分组变量对点进行着色的散点图。
gscatter(features.AspectRatio,features.Duration,features.Character)

在这里插入图片描述

建立模型

分类模型是将预测变量的空间划分为多个区域。每个区域被分配一个输出类。在这个有两个预测变量的简单示例中,您可以在平面上看到这些区域。
在这里插入图片描述
没有一种绝对“正确”的方法来将平面划分为类J、M和v。不同的分类算法会产生不同的划分。
在这里插入图片描述
对观察进行分类的一种简单方法是使用与已知例子最近的类相同的类。这被称为k近邻(k-nearest neighbor, kNN)模型。您可以通过向fitcknn函数传递一个数据表来拟合kNN模型。

load featuredata.mat
features	% 用作建立模型的训练数据
testdata	% 用做检验模型的测试数据

% 第二个输入是分类的结果。输出是一个包含拟合模型的变量。
knnmodel = fitcknn(features,"Character") 
% 使用训练后的模型对测试数据进行预测
predictions = predict(knnmodel,testdata)

根据数据建立模型之后,您可以使用它对新的观察结果进行分类。这只需要计算新观测的特征,并确定它们在预测空间的哪个区域。

testdata包含了已知正确类的观察结果(存储在Character变量中)。这样就可以通过比较模型预测的类和真实的类来测试模型。
在这里插入图片描述
默认情况下,fitcknn拟合一个k = 1的kNN模型。也就是说,该模型仅使用一个最近的已知例子来对给定的观察结果进行分类。这使得模型对训练数据中的任何异常值都很敏感,如上图中突出显示的异常值。离群值附近的新观测结果很可能被错误分类。通过增加k的值(即使用几个相邻的最常见的类),可以使模型对训练数据中的具体观察结果不那么敏感。这通常会提高模型的总体性能。然而,模型在任何特定测试集上的表现取决于该测试集中的具体观察结果。
fitcknn的"NumNeighbors"参数用来指定k的大小。
在这里插入图片描述

评估模型

kNN模型有多好?表testdata包含用于测试观察的已知类。您可以将已知的类与kNN模型的预测进行比较,以了解该模型在新数据上的表现如何。

计算它的错误率,并可以用confusionchart函数来可视化观察它的性能。

load featuredata.mat
testdata
knnmodel = fitcknn(features,"Character","NumNeighbors",5);
predictions = predict(knnmodel,testdata)

iscorrect = predictions == testdata.Character
accuracy = sum(iscorrect)/numel(predictions)

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

confusionchart(testdata.Character,predictions);

猜你喜欢

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