数学建模:高级建模技巧与拓展(神经网络)

人工神经网络是一种类比于人脑的计算模型,其通过大量的数据和训练,学习到数据之间的相关性和规律,并可以用于预测、分类、回归等多种任务。在数学建模中,人工神经网络被广泛应用于各种问题的求解。本文将以两个案例为例,介绍基于神经网络的模式识别和回归分析,并给出MATLAB代码实现。

  1. 模式识别

在这个案例中,我们将使用神经网络对手写数字进行分类,即将输入的手写数字图像识别为相应的数字类别。这个问题可以看作是一个多分类问题,其中输入为图像数据,输出为数字类别。我们将使用MATLAB中自带的手写数字数据集进行实验。

首先,我们需要加载数据集并将其划分为训练集和测试集。代码如下:

% 加载数据集
load digits.mat;
inputs = digits.images;
targets = digits.labels;

% 将数据集划分为训练集和测试集
numTrain = 5000;
idx = randperm(size(inputs, 3));
inputsTrain = inputs(:, :, idx(1:numTrain));
targetsTrain = targets(idx(1:numTrain));
inputsTest = inputs(:, :, idx(numTrain+1:end));
targetsTest = targets(idx(numTrain+1:end));

然后,我们需要创建一个神经网络模型,并训练该模型。这里,我们使用前馈神经网络模型,并使用交叉熵损失函数进行训练。代码如下:

% 创建并训练神经网络
hiddenLayerSize = 100;
net = patternnet(hiddenLayerSize);
net.trainFcn = 'trainscg';
net.trainParam.epochs = 1000;
net.trainParam.max_fail = 10;
[net, tr] = train(net, inputsTrain(:,:), targetsTrain(:,:));

最后,我们可以使用训练好的神经网络对测试集进行分类,并计算分类准确率。代码如下:

% 使用神经网络进行预测
outputsTest = net(inputsTest(:,:));
outputsTest = vec2ind(outputsTest);

% 计算分类精度
accuracy = sum(outputsTest == targetsTest) / numel(targetsTest);

2.回归分析

在这个案例中,我们将使用神经网络对汽车燃油效率进行预测。具体来说,我们将使用神经网络来学习汽车的一些特征(例如气缸数、排量、马力、重量等),并预测汽车的燃油效率。这个问题可以看作是一个回归分析问题,其中输入为汽车特征,输出为汽车的燃油效率。我们将使用UCI机器学习数据集中的汽车数据集进行实验。

首先,我们需要加载数据集,并将其划分为训练

集和测试集。代码如下:

% 加载数据集
data = readtable('auto-mpg.csv');
inputs = table2array(data(:, 1:7));
targets = table2array(data(:, 8));

% 将数据集划分为训练集和测试集
numTrain = 300;
idx = randperm(size(inputs, 1));
inputsTrain = inputs(idx(1:numTrain), :);
targetsTrain = targets(idx(1:numTrain));
inputsTest = inputs(idx(numTrain+1:end), :);
targetsTest = targets(idx(numTrain+1:end));

然后,我们需要对输入数据进行标准化处理,即将所有特征缩放到相同的尺度。这可以提高神经网络的学习效果。代码如下:

% 对输入数据进行标准化处理
inputsTrainMean = mean(inputsTrain);
inputsTrainStd = std(inputsTrain);
inputsTrain = (inputsTrain - inputsTrainMean) ./ inputsTrainStd;
inputsTest = (inputsTest - inputsTrainMean) ./ inputsTrainStd;

接着,我们可以创建并训练神经网络模型。这里,我们使用多层感知器(MLP)神经网络模型,并使用均方误差损失函数进行训练。代码如下:

% 创建并训练神经网络
hiddenLayerSize = 20;
net = fitnet(hiddenLayerSize);
net.trainFcn = 'trainscg';
net.trainParam.epochs = 1000;
net.trainParam.max_fail = 10;
[net, tr] = train(net, inputsTrain', targetsTrain');

最后,我们可以使用训练好的神经网络对测试集进行预测,并计算预测结果与实际结果之间的均方误差。代码如下:

 
 
% 使用神经网络进行预测
outputsTest = net(inputsTest')';

% 计算均方误差
mseTest = mean((outputsTest - targetsTest).^2);

通过以上步骤,我们可以使用神经网络对汽车燃油效率进行预测,并计算预测结果与实际结果之间的均方误差。

案例一:基于神经网络的股票价格预测

在股票市场中,股票价格的变化受到多种因素的影响,如经济环境、政策变化、公司业绩等。通过分析这些因素,我们可以使用神经网络来预测股票价格的走势。下面我们以沪深300指数为例,使用神经网络来预测其未来一个月的涨跌情况。

首先,我们需要获取沪深300指数的历史数据,并将其转换成合适的格式。代码如下:

% 获取沪深300指数历史数据
data = getStockData('000300', '2010-01-01', '2022-10-31');

% 提取收盘价和日期
dates = data(:, 1);
prices = data(:, 6);

% 计算价格变化率
returns = diff(prices) ./ prices(1:end-1);

接着,我们可以将价格变化率作为输入数据,以未来一个月的价格变化率作为输出数据,来训练神经网络。这里,我们使用多层感知器(MLP)神经网络模型,并使用均方误差损失函数进行训练。代码如下:

% 划分数据集
numTrain = floor(numel(returns) * 0.8);
inputsTrain = returns(1:numTrain)';
targetsTrain = returns(2:numTrain+1)';
inputsTest = returns(numTrain+1:end)';
targetsTest = returns(numTrain+2:end)';

% 创建并训练神经网络
hiddenLayerSize = 10;
net = fitnet(hiddenLayerSize);
net.trainFcn = 'trainscg';
net.trainParam.epochs = 100;
net.trainParam.max_fail = 10;
[net, tr] = train(net, inputsTrain, targetsTrain);

最后,我们可以使用训练好的神经网络对未来一个月的价格变化率进行预测,并根据预测结果来判断股票的涨跌情况。代码如下:

% 使用神经网络进行预测
outputsTest = net(inputsTest);

% 根据预测结果判断股票的涨跌情况
predictions = zeros(size(outputsTest));
predictions(outputsTest > 0) = 1;
predictions(outputsTest < 0) = -1;

% 计算分类准确率
accuracy = sum(predictions == sign(targetsTest)) / numel(targetsTest);

通过以上步骤,我们可以使用神经网络来预测股票价格的涨跌情况,并计算分类准确率。

案例二:基于神经网络的手写体数字识别

手写体数字识别是一个经典的模式识别问题,其主要任务是将手写数字图像转换为相应的数字类别。在这个案例中,我们将使用神经网络来解决手写体数字识别问题,即将输入的手

写数字图像识别为相应的数字类别。我们将使用MNIST数据集进行实验。

首先,我们需要加载数据集并将其划分为训练集和测试集。代码如下:

% 加载数据集
dataTrain = loadMNISTImages('train-images-idx3-ubyte');
labelsTrain = loadMNISTLabels('train-labels-idx1-ubyte');
dataTest = loadMNISTImages('t10k-images-idx3-ubyte');
labelsTest = loadMNISTLabels('t10k-labels-idx1-ubyte');

% 将数据集划分为训练集和测试集
numTrain = 5000;
idx = randperm(size(dataTrain, 2));
dataTrain = dataTrain(:, idx(1:numTrain));
labelsTrain = labelsTrain(idx(1:numTrain));

然后,我们需要创建一个神经网络模型,并训练该模型。这里,我们使用卷积神经网络(CNN)模型,并使用交叉熵损失函数进行训练。代码如下:

% 创建并训练神经网络
layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(3, 8, 'Padding', 'same')
    reluLayer
    maxPooling2dLayer(2, 'Stride', 2)
    convolution2dLayer(3, 16, 'Padding', 'same')
    reluLayer
    maxPooling2dLayer(2, 'Stride', 2)
    convolution2dLayer(3, 32, 'Padding', 'same')
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

options = trainingOptions('sgdm', ...
    'MaxEpochs', 10, ...
    'ValidationData', {dataTest, categorical(labelsTest)}, ...
    'ValidationFrequency', 30, ...
    'Verbose', false, ...
    'Plots', 'training-progress');

net = trainNetwork(dataTrain, categorical(labelsTrain), layers, options);

最后,我们可以使用训练好的神经网络对测试集进行分类,并计算分类准确率。代码如下:

 
 
% 使用神经网络进行预测
outputsTest = classify(net, dataTest);

% 计算分类准确率
accuracy = sum(outputsTest == categorical(labelsTest)) / numel(labelsTest);

通过以上步骤,我们可以使用神经网络对手写体数字图像进行分类,并计算分类准确率。

总结

本文介绍了人工神经网络在数学建模中的应用,并给出了两个案例,分别是股票价格预测和手写体数字识别。通过学习本文,读者可以了解神经网络在模式识别和回归分析中的应用,并可以根据自己的实际应用场景,选择合适的神经网络模型进行数据分析和处理。同时,我们也给出了使用MATLAB实现这两个案例的代码,读者可以根据需要进行参考和借鉴。

猜你喜欢

转载自blog.csdn.net/m0_68036862/article/details/129934237