Matlab中的机器学习实例
如何使用机器学习工具箱,建立模型、分类、预测等任务?
作为集成了许多有用机器学习算法和工具的软件包,Matlab的机器学习工具箱可以用于许多不同的任务,例如分类、回归、聚类、降维等。对于初学者,这里将介绍一些常见任务中使用机器学习工具箱的方法。
1. 数据准备
首先,从一些数据开始。很多机器学习工作的质量最终取决于数据质量。在Matlab中,数据通常存储在矩阵或表格中。矩阵的每一行表示一组数据的特征,每列代表一个特征/属性。表格通常是软件中其他功能的输出形式,包含有关数据的附加元数据。
例如,考虑一个手写数字识别的任务,我们假设有一个数据集,其中包含了一些手写数字图像。每张图片都已经被表示为一个 $28times 28$ 的灰度图,每个像素都是图像的一个特征,取值为 $0$~$255$ 之间的整数。我们需要将这些数据转换为可行的格式。
% 读入图像
data = load(‘data.mat’);
images = data.images;
labels = data.labels;% 将图像转换成 784 x N 格式
data = reshape(images, 784, size(images, 3));
labels = double(labels);在代码中,我们首先从一个.mat格式的文件中读入图像和标签信息。图像是一个三维数组,其中每张 $28times28$ 的手写数字图像占据数组的每一个层。接下来,我们使用 reshape 函数将这些图像转换为一个 $784(N)times N$ 的矩阵,其中每一行代表一个图像的特征向量。最后,我们将标签数据转换为 double 类型,准备用于模型建立。
2. 数据探索
在数据准备之后,可以使用 MatLab 的数据探索工具了解数据的分布、相关性等特性。例如,使用 PCA 算法和 scatter 函数绘制特征向量之间的散点图,观察特征之间的关系。
% 观察数据集的前10张图像
figure(1)
for i = 1:10
subplot(2, 5, i)
imshow(images(:, :, i))
title(num2str(labels(i)))
end% 绘制特征间散点图(取前三个主成分)
[coeff, score, latent] = pca(data);
score3 = score(:, 1:3);
gscatter(score3(:, 1), score3(:, 2), labels);
xlabel(‘PC1’)
ylabel(‘PC2’)
zlabel(‘PC3’)通过运行代码,我们能够观察数据集的前十张图像和它们对应的标签。接下来,我们使用 PCA 算法将原始数据降维至三维,并使用 gscatter 函数绘制了特征向量之间的散点图,每个点代表一张手写数字图像,使用不同的颜色区分不同数字。从图中可以看出,基本上每个数字都有其独特的数据分布,但是有时也会出现一些重叠数据点。
3. 建立模型
在准备好数据和理解了其性质之后,可以使用机器学习算法建立模型。以手写数字识别的任务为例,最常见的算法包括 SVM、随机森林和神经网络等。
例如,以下代码使用神经网络建立模型:
% 将数据集分为训练集和测试集
[train_data, test_data, train_labels, test_labels] = …
crossvalind(‘HoldOut’, size(data, 2), 0.25);% 神经网络建模
inputs = data(:, train_data);
targets = zeros(10, length(train_labels));
for i = 1:length(train_labels)
targets(train_labels(i) + 1, i) = 1;
endhiddenLayerSize = 200;
net = patternnet(hiddenLayerSize);
net.trainFcn = ‘trainscg’;% 训练神经网络
[net, tr] = train(net, inputs, targets);
nntraintool在代码中,我们首先将原始数据集拆分成训练集和测试集,其中用于训练模型的数据集在代码中标记为 train_data。接下来,我们使用神经网络建立模型,使用 patternnet 函数指定了神经网络的结构,使用 train 函数训练模型。在模型训练之后,我们可以使用 nntraintool 函数调出神经网络训练界面,观察模型的训练情况和性能。
4. 模型测试与评估
在建立模型之后,需要使用测试集对模型进行测试,并计算其性能。在一般的分类任务中,最常用的性能指标为分类准确率和混淆矩阵。
以下代码使用测试集计算并显示混淆矩阵。
% 对测试集进行预测
inputs = data(:, test_data);
targets = zeros(10, length(test_labels));
for i = 1:length(test_labels)
targets(test_labels(i) + 1, i) = 1;
endoutputs = net(inputs);
[~, predicted_labels] = max(outputs);
% 显示混淆矩阵
figure(2)
plotconfusion(targets, outputs)% 计算和显示分类准确率
accuracy = sum(predicted_labels-1 == test_labels)/length(test_labels);
sprintf(‘Classification Accuracy: %.2f%%’, accuracy*100)在代码中,我们首先将测试集插入到计算网络输出的公式中。然后使用 max 函数预测每个测试样本的标签,使用 targets 和 outputs 收集真实和预测标签,并使用 plotconfusion 函数计算和显示混淆矩阵。最后,我们计算并显示模型的分类准确率。
5. 应用
在成功建立模型并评估其性能后,我们可以将其应用于一些实际的应用场景中。例如,在手写数字识别的任务中,我们可以实现一个应用程序,让用户手写数字并自动识别。
以下代码通过打开一个图形窗口实现这一应用:
% 打开应用程序窗口
app = uifigure;
canvas = uiaxes(app, …
‘Units’, ‘pixels’, …
‘Position’, [20, 70, 280, 280], …
‘XLim’, [0, 27], …
‘YLim’, [0, 27], …
‘XGrid’, ‘on’, …
‘YGrid’, ‘on’, …
‘XTick’, [], …
‘YTick’, []);title(canvas, ‘手写数字识别’)
info = uilabel(app, …
‘Units’, ‘pixels’, …
‘Position’, [20, 25, 210, 22], …
‘HorizontalAlignment’, ‘left’, …
‘Text’, ‘请手写一个0-9之间的数字’);% 预测手写数字
canvas.ButtonDownFcn = @mouse_down_callback;function mouse_down_callback(hObject, event)
% 读取绘制的图像
set(gcf, ‘WindowButtonUpFcn’, @mouse_up_callback)
global canvas_content
canvas_content = getframe(gca);function mouse_up_callback(hObject, event)
% 调整图像大小并预测其标签
global canvas_content
I = imresize(canvas_content.cdata, [28 28]);
I = im2bw(rgb2gray(I), 0.5);
I = imcomplement(I(:)’);% 预测图像的标签
test_input = double(I);
predicted_label = round(net(test_input’));
title(canvas, sprintf(‘预测标签: %d’, predicted_label-1))在代码中,我们首先创建了一个图形窗口,用于手写数字的绘制和预测。然后,我们使用 globa 函数创建了一个全局变量用于存储用户绘制的图像,同时绑定 mouse_down_callback 函数以捕捉用户的输入。当用户完成绘制时,我们使用 imresize 函数将图像调整为 $28times 28$,使用 im2bw 函数进行二值化,使用 imcomplement 函数翻转颜色。最后,我们使用网络进行预测,并将预测标签显示在应用程序的标题中。
总结
Matlab的机器学习工具箱提供了许多有用的算法和工具,方便了机器学习和数据挖掘的研究和应用。在这篇文章中,我们介绍了如何使用机器学习工具箱进行常见的分类任务,包括数据准备、数据探索、模型建立、模型测试和评估、以及应用场景。通过这篇文章,我们希望读者们能够更好地理解 MatLab 的机器学习工具箱,并在实际应用中使用它来提高工作效率和研究质量。
2023年05月16日 12:01