主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

葡萄酒分类

此示例说明模式识别神经网络如何根据葡萄酒的化学特性按酒庄对葡萄酒进行分类。

问题:葡萄酒分类

在此示例中,我们尝试构建一个神经网络,该网络可以通过十三个属性对来自三个酒庄的葡萄酒进行分类:

  • 酒精

  • 苹果酸

  • 灰的碱度

  • 总酚

  • 黄酮类

  • 非黄酮类酚

  • 原花青素

  • 颜色深度

  • 色调

  • 稀释葡萄酒的 OD280/OD315

  • 脯氨酸

这是输入与不同类相关的模式识别问题的示例,我们希望所创建的神经网络不仅可以对已知的葡萄酒正确分类,还能泛化成对未用于设计解决方案的葡萄酒进行准确分类。

为什么使用神经网络?

神经网络非常擅长处理模式识别问题。具有足够元素(称为神经元)的神经网络可以以任意准确度对任何数据进行分类。它们特别适合处理基于多种变数的复杂决策边界问题。因此,神经网络是处理葡萄酒分类问题的优选方案。

十三个相邻属性将作为神经网络的输入,并且每个属性的相应目标将是一个三元素类向量,其中相关酒庄(#1、#2 或 #3)的位置为 1。

该网络将设计为使用相邻属性训练网络以生成正确的目标类。

准备数据

通过将数据组织成两个矩阵(输入矩阵 X 和目标矩阵 T)来为神经网络设置分类问题的数据。

输入矩阵的每一列都有十三个元素,表示已知道其酒庄的葡萄酒。

目标矩阵的每个对应列将具有三个元素,包含两个零和相关酒庄位置上的 1。

使用以下命令加载一个这样的数据集。

[x,t] = wine_dataset;

我们可以查看输入 X 和目标 T 的大小。

请注意,X 和 T 都有 178 列。这些列代表 178 个葡萄酒样本属性(输入)和相关酒庄类向量(目标)。

输入矩阵 X 有十三行,表示十三个属性。目标矩阵 T 有三行,表示每个样本的三个可能酒庄。

size(x)
ans = 1×2

    13   178

size(t)
ans = 1×2

     3   178

使用神经网络进行模式识别

下一步是创建一个学习对葡萄酒进行分类的神经网络。

由于神经网络以随机初始权重开始,因此该示例的结果在每次运行时都会略有不同。

双层(即,一个隐藏层)前馈神经网络可以学习任何输入-输出关系,前提是隐藏层中有足够的神经元。非输出层称为隐含层。

对于此示例,我们将尝试具有 10 个神经元的单隐藏层。一般情况下,问题越困难,需要的神经元和层就越多。问题越简单,需要的神经元就越少。

输入和输出的大小为 0,因为网络尚未配置成与我们的输入数据和目标数据相匹配。这将在训练网络时进行。

net = patternnet(10);
view(net)

现在网络已准备就绪,可以开始训练。样本自动分为训练集、验证集和测试集。训练集用于对网络进行训练。只要网络针对验证集持续改进,训练就会继续。测试集提供完全独立的网络准确度测量。

神经网络训练工具显示正在接受训练的网络和用于训练该网络的算法。它还显示训练过程中的训练状态以及停止训练的条件(以绿色突出显示)。

底部的按钮用于打开有用的绘图,这些图可以在训练期间和训练后打开。算法名称和绘图按钮旁边的链接可打开有关这些主题的文档。

[net,tr] = train(net,x,t);

Figure Neural Network Training (02-Feb-2025 06:25:42) contains an object of type uigridlayout.

要查看在训练过程中网络性能的改善情况,请点击训练工具中的 Performance 按钮,或调用 PLOTPERFORM。

性能以均方误差衡量,并以对数刻度显示。随着网络训练的加深,均方误差迅速降低。

绘图会显示训练集、验证集和测试集的性能。

plotperform(tr)

Figure Performance (plotperform) contains an axes object. The axes object with title Best Validation Performance is 0.072181 at epoch 4, xlabel 10 Epochs, ylabel Cross Entropy (crossentropy) contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent Train, Validation, Test, Best.

测试网络

现在可以相对于测试样本测量经过训练的神经网络的均方误差。这将使我们能够了解网络在应用于真实数据时表现如何。

网络输出的范围为 0 到 1,因此我们可以使用 vec2ind 函数根据每个输出向量中最高元素的位置来获取类索引。

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testIndices = vec2ind(testY)
testIndices = 1×27

     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3

衡量神经网络数据拟合程度的另一个方法是混淆矩阵图。下面绘制了所有样本的混淆矩阵图。

该混淆矩阵显示了正确和错误分类的百分比。正确分类表示为矩阵对角线上的绿色方块。错误分类表示为红色方块。

如果网络已学会正确分类,则红色方块中的百分比应该非常小,表示几乎没有错误分类。

如果不是这样,则建议进一步进行训练,或训练具有更多隐藏神经元的网络。

plotconfusion(testT,testY)

Figure Confusion (plotconfusion) contains an axes object. The axes object with title Confusion Matrix, xlabel Target Class, ylabel Output Class contains 50 objects of type patch, text, line.

以下是正确和错误分类的总体百分比。

[c,cm] = confusion(testT,testY)
c = 
0
cm = 3×3

     7     0     0
     0    12     0
     0     0     8

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
Percentage Correct Classification   : 100.000000%
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
Percentage Incorrect Classification : 0.000000%

衡量神经网络数据拟合程度的第三个方法是受试者工作特征图。该图可显示随着输出阈值从 0 变为 1,假正率和真正率之间的相关性。

线条越偏向左上方,达到高的真正率所需接受的假正数越少。最佳分类器是线条从左下角到左上角再到右上角,或接近于该模式。

plotroc(testT,testY)

Figure Receiver Operating Characteristic (plotroc) contains an axes object. The axes object with title ROC, xlabel False Positive Rate, ylabel True Positive Rate contains 6 objects of type line. These objects represent Class 1, Class 2, Class 3.

此示例说明了如何设计一个根据每种葡萄酒的特性将葡萄酒分类到三个酒庄的神经网络。

请浏览其他示例和文档,以便更深入地了解神经网络及其应用。