Competencia de modelado matemático de la Copa Huawei Intercambio de experiencias Número 2 - Manos de programación

Los programadores desempeñan un papel más importante en las competiciones de modelado matemático: no solo necesitan completar la escritura del código de acuerdo con las ideas del modelador, sino que también deben comunicarse con el escritor para analizar y presentar los resultados. Por lo tanto, los programadores deben completar el aprendizaje correspondiente en diferentes etapas, aquí lo divido en antes del juego y durante el juego.

1. Antes del juego

Para la mayoría de las personas es difícil aprender nuevos códigos y aplicarlos en solo 4 días, por lo que los programadores deben practicar más códigos antes del juego, incluidos: tipo de predicción, tipo de evaluación, tipo de optimización y modelo de mecanismo, clase, etc. Sólo acumulando más en tiempos normales podrás completar las tareas de programación más rápido durante las competiciones. Este es el requisito básico para que los programadores se preparen antes del juego.

Para los problemas de predicción, no se trata solo del uso de modelos de predicción (BP, SVM, LSTM, etc.), sino también del preprocesamiento de los datos originales. Los datos proporcionados en las competiciones de modelado matemático a menudo tienen valores atípicos, valores faltantes, etc. Por lo tanto, los modeladores deben estudiar o comprender algunas implementaciones de código de métodos de eliminación de valores atípicos y códigos para completar los valores faltantes antes del juego. No entraré en detalles sobre los métodos correspondientes aquí. Puede ir a Baidu para buscar métodos de limpieza de datos. Para la categoría de optimización, es necesario preparar algunos solucionadores de optimización CPLEX, gurobi, etc. de uso común. Aquí, debe estar familiarizado con sus reglas de programación. Para la categoría de mecanismo, las preguntas del concurso anterior incluían modelos de enfermedades infecciosas. Podemos consultar las ideas de este tipo de modelo para realizar modelos matemáticos de problemas similares. En resumen, los modeladores, si quieren ganar premios en concursos de modelado matemático, deben seguir acumulando.

2. En competición

Durante la competencia, el programador necesita escribir el código de acuerdo con las ideas del modelador. A veces, debido a problemas de tiempo o capacidad de programación personal limitada, es imposible completar la escritura del modelo creado por el modelador. En este momento, debe comunicarse con el modelador para simplificar el modelo y luego completar la programación. En segundo lugar, el programador también debe entregar los datos finales del código y el diagrama de resultados experimentales preliminares al escritor para su posterior procesamiento. Si hay suficiente tiempo en la competencia, sugiero que los programadores puedan usar más métodos. Por ejemplo, en el modelo de predicción, el modelo que finalmente elegimos puede ser LSTM, entonces podemos usar algunos modelos convencionales como BP y SVM como Comparativamente, esto también es una ventaja. Vale la pena señalar que si se utiliza la comparación de métodos, los resultados de varios métodos deben analizarse en el artículo, es decir, decirle a los expertos revisores por qué el método que utilicé es bueno. La respuesta a este tipo de preguntas a menudo puede describirse en la introducción principal del modelo y finalmente reflejarse en el análisis de resultados. De manera similar, la comparación de sus métodos debe reflejarse en el diagrama de flujo técnico después del análisis del problema, lo que hará que su idea sea más clara y los resultados experimentales más creíbles.

A continuación se muestra un ejemplo: tomemos como ejemplo la clasificación de las señales de ECG. Utilice 1DCNN y una máquina de vectores de soporte para comparar los efectos. La parte correspondiente del código es la siguiente:

%%1DCNNclear;clc;%% 载入数据;fprintf('Loading data...\n');tic;load('N_dat.mat');load('L_dat.mat');load('R_dat.mat');load('V_dat.mat');fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 控制使用数据量,每一类5000,并生成标签,one-hot编码;fprintf('Data preprocessing...\n');tic;Nb=Nb(1:5000,:);Label1=repmat([1;0;0;0],1,5000);Vb=Vb(1:5000,:);Label2=repmat([0;1;0;0],1,5000);Rb=Rb(1:5000,:);Label3=repmat([0;0;1;0],1,5000);Lb=Lb(1:5000,:);Label4=repmat([0;0;0;1],1,5000);Data=[Nb;Vb;Rb;Lb];Label=[Label1,Label2,Label3,Label4];clear Nb;clear Label1;clear Rb;clear Label2;clear Lb;clear Label3;clear Vb;clear Label4;Data=Data-repmat(mean(Data,2),1,250); %使信号的均值为0,去掉基线的影响;fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 数据划分与模型训练测试;fprintf('Model training and testing...\n');Nums=randperm(20000);      %随机打乱样本顺序,达到随机选择训练测试样本的目的;train_x=Data(Nums(1:10000),:);test_x=Data(Nums(10001:end),:);train_y=Label(:,Nums(1:10000));test_y=Label(:,Nums(10001:end));train_x=train_x';test_x=test_x';cnn.layers = {
   
       struct('type', 'i') %input layer    struct('type', 'c', 'outputmaps', 4, 'kernelsize', 31,'actv','relu') %convolution layer    struct('type', 's', 'scale', 5,'pool','mean') %sub sampling layer    struct('type', 'c', 'outputmaps', 8, 'kernelsize', 6,'actv','relu') %convolution layer    struct('type', 's', 'scale', 3,'pool','mean') %subsampling layer};cnn.output = 'softmax';  %确定cnn结构;                         %确定超参数;opts.alpha = 0.01;       %学习率;opts.batchsize = 16;     %batch块大小;opts.numepochs = 30;     %迭代epoch;cnn = cnnsetup1d(cnn, train_x, train_y);      %建立1D CNN;cnn = cnntrain1d(cnn, train_x, train_y,opts); %训练1D CNN;[er,bad,out] = cnntest1d(cnn, test_x, test_y);%测试1D CNN;[~,ptest]=max(out,[],1);[~,test_yt]=max(test_y,[],1);Correct_Predict=zeros(1,4);                     %统计各类准确率;Class_Num=zeros(1,4);                           %并得到混淆矩阵;Conf_Mat=zeros(4);for i=1:10000    Class_Num(test_yt(i))=Class_Num(test_yt(i))+1;    Conf_Mat(test_yt(i),ptest(i))=Conf_Mat(test_yt(i),ptest(i))+1;    if ptest(i)==test_yt(i)        Correct_Predict(test_yt(i))= Correct_Predict(test_yt(i))+1;    endendACCs=Correct_Predict./Class_Num;fprintf('Accuracy = %.2f%%\n',(1-er)*100);fprintf('Accuracy_N = %.2f%%\n',ACCs(1)*100);fprintf('Accuracy_V = %.2f%%\n',ACCs(2)*100);fprintf('Accuracy_R = %.2f%%\n',ACCs(3)*100);fprintf('Accuracy_L = %.2f%%\n',ACCs(4)*100);figure(1)confusionchart(test_y,ptest)
%%支持向量机clear;clc;%% 载入数据;fprintf('Loading data...\n');tic;load('N_dat.mat');load('L_dat.mat');load('R_dat.mat');load('V_dat.mat');fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 控制使用数据量,每一类5000,并生成标签;fprintf('Data preprocessing...\n');tic;Nb=Nb(1:5000,:);Label1=ones(1,5000);%Label1=repmat([1;0;0;0],1,5000);Vb=Vb(1:5000,:);Label2=ones(1,5000)*2;%Label2=repmat([0;1;0;0],1,5000);Rb=Rb(1:5000,:);Label3=ones(1,5000)*3;%Label3=repmat([0;0;1;0],1,5000);Lb=Lb(1:5000,:);Label4=ones(1,5000)*4;%Label4=repmat([0;0;0;1],1,5000);Data=[Nb;Vb;Rb;Lb];Label=[Label1,Label2,Label3,Label4];Label=Label';clear Nb;clear Label1;clear Rb;clear Label2;clear Lb;clear Label3;clear Vb;clear Label4;Data=Data-repmat(mean(Data,2),1,250); %使信号的均值为0,去掉基线的影响;fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 利用小波变换提取系数特征,并切分训练和测试集;fprintf('Feature extracting and normalizing...\n');tic;Feature=[];for i=1:size(Data,1)    [C,L]=wavedec(Data(i,:),5,'db6');  %% db6小波5级分解;endNums=randperm(20000);      %随机打乱样本顺序,达到随机选择训练测试样本的目的;train_x=Feature(Nums(1:10000),:);test_x=Feature(Nums(10001:end),:);train_y=Label(Nums(1:10000));test_y=Label(Nums(10001:end));[train_x,ps]=mapminmax(train_x',0,1); %利用mapminmax内建函数特征归一化到0,1之间;test_x=mapminmax('apply',test_x',ps);train_x=train_x';test_x=test_x';fprintf('Finished!\n');toc;fprintf('=============================================================\n');%% 训练SVM,并测试效果;fprintf('SVM training and testing...\n');tic;model=libsvmtrain(train_y,train_x,'-c 2 -g 1'); %模型训练;[ptest,~,~]=libsvmpredict(test_y,test_x,model); %模型预测;Correct_Predict=zeros(1,4);                     %统计各类准确率;Class_Num=zeros(1,4);Conf_Mat=zeros(4);for i=1:10000    Class_Num(test_y(i))=Class_Num(test_y(i))+1;    Conf_Mat(test_y(i),ptest(i))=Conf_Mat(test_y(i),ptest(i))+1;    if ptest(i)==test_y(i)        Correct_Predict(test_y(i))= Correct_Predict(test_y(i))+1;    endendACCs=Correct_Predict./Class_Num;fprintf('Accuracy_N = %.2f%%\n',ACCs(1)*100);fprintf('Accuracy_V = %.2f%%\n',ACCs(2)*100);fprintf('Accuracy_R = %.2f%%\n',ACCs(3)*100);fprintf('Accuracy_L = %.2f%%\n',ACCs(4)*100);toc;figure(1)confusionchart(test_y,ptest)

Resultados comparativos:

Resultados de 1DCNN:

imagen

imagen

Resultados de SVM:

imagen

imagen

    Al comparar los resultados de los dos modelos, se puede ver que 1DCNN es significativamente mejor que SVM. ¿Por qué 1DCNN es obviamente mejor que SVM? Podemos analizarlo desde la perspectiva de los principios del algoritmo, no entraremos en detalles aquí.

    

Supongo que te gusta

Origin blog.csdn.net/qq_45013535/article/details/133146689
Recomendado
Clasificación