Bootstrap

全国大学生数学建模竞赛2012A题葡萄酒的评价MATLAB程序

目录

一、第1问

1.1 单因素方差分析MATLAB程序

1.2 置信区间长度MATLAB程序

1.3 Q-Q图MATLAB程序

二、第2问

2.1 主成分分析——成分个数MATLAB程序

2.2 主成分分析——相关系数MATLAB程序

2.3 主成分分析——评价指标MATLAB程序

三、第3问

3.1逐步回归MATLAB程序

四、第4问

4.1 计算葡萄酒外观香气口感评分MATLAB程序

4.2 逐步回归MATLAB程序

4.3 白葡萄加入芳香物质逐步回归MATLAB程序


一、第1问

本问主要用到了:单因素方差分析、求置信区间长度、绘制Q-Q图

1.1 单因素方差分析MATLAB程序

从EXCEL(尚未排序的评分平均值)种读取数据,并将其组合成A、B两个矩阵,通过anova1函数对样本数据执行单向方差分析,并返回p值。

m=xlsread('1t检验样本数据.xlsx','红','A2:A29') ;
n=xlsread('1t检验样本数据.xlsx','红','B2:B29') ; 
o=xlsread('1t检验样本数据.xlsx','白','A2:A29') ; 
p=xlsread('1t检验样本数据.xlsx','白','B2:B29') ; 
A=[m,n];
B=[o,p];
anova1(A)%对样本数据y执行单向方差分析,并返回p值
anova1(B)

代码运行效果如图所示 (部分):

 

1.2 置信区间长度MATLAB程序

从EXCEL(排序后的评分平均值)读取数据,通过normfit函数计算其置信区间,并通过矩阵的运算得出置信区间的长度。

a=xlsread('1酒样品分布.xlsx','红葡萄酒','B2:K28'); 
a=a';
[mu1,sigma1,muci1,sigmaci1]=normfit(a,0.05);
b=xlsread('1酒样品分布.xlsx','红葡萄酒','M2:V28');
b=b';
[mu2,sigma2,muci2,sigmaci2]=normfit(b,0.05);
c=xlsread('1酒样品分布.xlsx','白葡萄酒','B2:K29'); 
c=c';
[mu3,sigma3,muci3,sigmaci3]=normfit(c,0.05);
d=xlsread('1酒样品分布.xlsx','白葡萄酒','M2:V29');
d=d';
[mu4,sigma4,muci4,sigmaci4]=normfit(d,0.05);
lengthmuci1=muci1(2,:)-muci1(1,:);
lengthmuci2=muci2(2,:)-muci2(1,:);
lengthmuci3=muci3(2,:)-muci3(1,:);
lengthmuci4=muci4(2,:)-muci4(1,:);

1.3 Q-Q图MATLAB程序

从EXCEL(排序后的评分平均值)读取数据,通过qqplot函数绘制样本数据与标准正态的Q-Q图。 

a1=xlsread('1酒样品分布.xlsx','红葡萄酒','L2:L28');
a2=xlsread('1酒样品分布.xlsx','红葡萄酒','W2:W28');
b1=xlsread('1酒样品分布.xlsx','白葡萄酒','L2:L29');
b2=xlsread('1酒样品分布.xlsx','白葡萄酒','W2:W29');
%%
qqplot(a1)
%%
qqplot(a2)
%%
qqplot(b1)
%%
qqplot(b2)

代码运行效果如图所示(部分): 

二、第2问

本问主要用到了:主成分分析——成分个数、主成分分析——相关系数、主成分分析——评价指标

2.1 主成分分析——成分个数MATLAB程序

从TXT(排序处理后的各项理化指标值)读取数据,并计算相关系数,可得出各成分相关系数,排序后可选出需要分析的成分个数。

load gc1.txt %把原始数据保存在纯文本文件gj.txt中
gc1=zscore(gc1); %数据标准化
r=corrcoef(gc1); %计算相关系数矩阵
[x,y,z]=pcacov(r); 
f=repmat(sign(sum(x)),size(x,1),1); 
x=x.*f; 
df=gc1*x(:,1:4) 
tf=df*z(1:4)/100; 
[stf,ind]=sort(tf,'descend')

load gc2.txt %把原始数据保存在纯文本文件gj.txt中
gc2=zscore(gc2); %数据标准化
r=corrcoef(gc2); %计算相关系数矩阵
[x,y,z]=pcacov(r); 
f=repmat(sign(sum(x)),size(x,1),1); 
x=x.*f; 
df=gc2*x(:,1:4) 
tf=df*z(1:4)/100; 
[stf,ind]=sort(tf,'descend')

2.2 主成分分析——相关系数MATLAB程序

从TXT(排序处理后的各项理化指标值)读取数据,并通过上一步确定主成分个数,代入代码可得出各项理化指标的回归系数。

clc,clear 
load sn1.txt %把原始的x1,x2,x3,x4,y的数据保存在纯文本文件sn.txt中 
[m,n]=size(sn1);num=11; %num为选取的主成分的个数
mu=mean(sn1);sigma=std(sn1); 
snb=zscore(sn1); %数据标准化 
b=snb(:,1:end-1); %x1,x2,x3,x4的数据赋给b 
r=cov(b); %标准化数据的协方差阵就是相关系数阵 
[x,y,z]=pcacov(r); 
f=repmat(sign(sum(x)),size(x,1),1); 
x=x.*f; 
%以下是普通的最小二乘法回归 
r=[ones(m,1),b]\snb(:,end); %标准化数据的回归方程系数 
bzh=mu./sigma; 
ch10=mu(end)-bzh(1:end-1)*r(2:end)*sigma(end) %原始数据的常数项 
fr=r(2:end);fr=fr'; 
ch1=fr./sigma(1:end-1)*sigma(end) %原始数据的x1,x2等等系数 
%以下是主成分回归 
pval=b*x(:,1:num); 
rp=[ones(m,1),pval]\snb(:,end); %主成分数据的回归方程系数 
beta=x(:,1:num)*rp(2:num+1); %标准化数据的回归方程系数 
ch20=mu(end)-bzh(1:end-1)*beta*sigma(end) %原始数据的常数项 
fr=beta'; 
ch2=fr./sigma(1:end-1)*sigma(end) %原始数据的x1,x2等等系数 
check1=sqrt(sum((sn1(:,1:end-1)*ch1'+ch10-sn1(:,end)).^2)/(m-n)) 
check2=sqrt(sum((sn1(:,1:end-1)*ch2'+ch20-sn1(:,end)).^2)/(m-num-1))

clc,clear 
load sn2.txt %把原始的x1,x2,x3,x4,y的数据保存在纯文本文件sn.txt中 
[m,n]=size(sn2);num=13; %num为选取的主成分的个数
mu=mean(sn2);sigma=std(sn2); 
snb=zscore(sn2); %数据标准化 
b=snb(:,1:end-1); %x1,x2,x3,x4的数据赋给b 
r=cov(b); %标准化数据的协方差阵就是相关系数阵 
[x,y,z]=pcacov(r); 
f=repmat(sign(sum(x)),size(x,1),1); 
x=x.*f; 
%以下是普通的最小二乘法回归 
r=[ones(m,1),b]\snb(:,end); %标准化数据的回归方程系数 
bzh=mu./sigma; 
ch10=mu(end)-bzh(1:end-1)*r(2:end)*sigma(end) %原始数据的常数项 
fr=r(2:end);fr=fr'; 
ch1=fr./sigma(1:end-1)*sigma(end) %原始数据的x1,x2等等系数 
%以下是主成分回归 
pval=b*x(:,1:num); 
rp=[ones(m,1),pval]\snb(:,end); %主成分数据的回归方程系数 
beta=x(:,1:num)*rp(2:num+1); %标准化数据的回归方程系数 
ch20=mu(end)-bzh(1:end-1)*beta*sigma(end) %原始数据的常数项 
fr=beta'; 
ch2=fr./sigma(1:end-1)*sigma(end) %原始数据的x1,x2等等系数 
check1=sqrt(sum((sn2(:,1:end-1)*ch1'+ch10-sn2(:,end)).^2)/(m-n)) 
check2=sqrt(sum((sn2(:,1:end-1)*ch2'+ch20-sn2(:,end)).^2)/(m-num-1))

2.3 主成分分析——评价指标MATLAB程序

从EXCEL(排序处理后的各项理化指标值)读取数据,将上一步得出的回归方程系数与各项理化指标通过回归方程最终计算出对不同葡萄酒样品的评价系数。

c=zeros(27,1);
ch=xlsread('2平均过后的酿酒葡萄理化指标.xlsx','转置红','C3:C32');
a=xlsread('2平均过后的酿酒葡萄理化指标.xlsx','转置红','D3:AD32');
for i=1:27
b=a(:,i).*ch;
c(i)=sum(b);
end

c=zeros(28,1);
ch=xlsread('2平均过后的酿酒葡萄理化指标.xlsx','转置白','C3:C32');
a=xlsread('2平均过后的酿酒葡萄理化指标.xlsx','转置白','D3:AE32');
for i=1:28
b=a(:,i).*ch;
c(i)=sum(b);
end

三、第3问

本问主要用到了:逐步回归

3.1逐步回归MATLAB程序

从EXCEL(排序处理后的各项理化指标值)读取数据,通过zscore函数对所有数据进行Z标准化处理,并调用stepwise逐步回归MATLAB工具箱,选取逐步回归的指标并计算系数。

%%
clc,clear 
x0=xlsread('3平均过后的酿酒葡萄理化指标.xlsx','酿酒红葡萄','B2:AE28');
y0=xlsread('3平均过后的葡萄酒理化指标.xlsx','红葡萄酒','B2:J28');
x0=zscore(x0);
y0=zscore(y0);
x=x0(:,1:30); 
y1=y0(:,1); 
stepwise(x,y1)
%%
y2=y0(:,2);
stepwise(x,y2)
%%
y3=y0(:,3);
stepwise(x,y3)
%%
y4=y0(:,4);
stepwise(x,y4)
%%
y5=y0(:,5);
stepwise(x,y5)
%%
y6=y0(:,6);
stepwise(x,y6)
%%
y7=y0(:,7);
stepwise(x,y7)
%%
y8=y0(:,8);
stepwise(x,y8)
%%
y9=y0(:,9);
stepwise(x,y9)

%%
clc,clear 
x0=xlsread('3平均过后的酿酒葡萄理化指标.xlsx','酿酒白葡萄','B2:AE29');
y0=xlsread('3平均过后的葡萄酒理化指标.xlsx','白葡萄酒','B2:I29');
x0=zscore(x0);
y0=zscore(y0);
x=x0(:,1:30); 
y1=y0(:,1); 
stepwise(x,y1)
%%
y2=y0(:,2);
stepwise(x,y2)
%%
y3=y0(:,3);
stepwise(x,y3)
%%
y4=y0(:,4);
stepwise(x,y4)
%%
y5=y0(:,5);
stepwise(x,y5)
%%
y6=y0(:,6);
stepwise(x,y6)
%%
y7=y0(:,7);
stepwise(x,y7)
%%
y8=y0(:,8);
stepwise(x,y8)

 代码运行效果如图所示(部分): 

四、第4问

本问主要用到了:运用MATLAB处理复杂EXCEL表格、逐步回归

4.1 计算葡萄酒外观香气口感评分MATLAB程序

1.从EXCEL(排序处理后的各项理化指标值)读取数据;

2.通过mat2cell函数对数据矩阵进行拆分以方便计算;

3.通过deal函数将拆分后的数据矩阵赋值给t矩阵数组;

4.通过for循环继续拆分数据矩阵;

5.通过sum函数对数据矩阵进行求和;

6.最终取平均值求出所需指标评分:外观、香气、口感。

a=xlsread('4葡萄酒品尝评分表.xls','第二组红葡萄酒品尝评分','C5:L378');
aa=mat2cell(a,[14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 10],[10]);
[t{1} t{2} t{3} t{4} t{5} t{6} t{7} t{8} t{9} t{10} t{11} t{12} t{13} t{14} t{15} t{16} t{17} t{18} t{19} t{20} t{21} t{22} t{23} t{24} t{25} t{26} t{27}]=deal(aa{:});
for i=1:27
 if i<27
 aaa=mat2cell(t{i},[2 3 4 5],[10]);
 [m n o p]=deal(aaa{:});
 x{i,1}=sum(sum(m))/10;
 y{i,1}=sum(sum(n))/10;
 z{i,1}=sum(sum(o))/10;
 end
 if i==27
 aaa=mat2cell(t{i},[2 3 4 1],[10]);
 [m n o p]=deal(aaa{:});
 x{i,1}=sum(sum(m))/10;
 y{i,1}=sum(sum(n))/10;
 z{i,1}=sum(sum(o))/10;   
 end
end

a=xlsread('4葡萄酒品尝评分表.xls','第二组白葡萄酒品尝评分','E4:N337');
aa=mat2cell(a,[12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 10],[10]);
[t{1} t{2} t{3} t{4} t{5} t{6} t{7} t{8} t{9} t{10} t{11} t{12} t{13} t{14} t{15} t{16} t{17} t{18} t{19} t{20} t{21} t{22} t{23} t{24} t{25} t{26} t{27} t{28}]=deal(aa{:});
for i=1:28
 if i<28
 aaa=mat2cell(t{i},[2 3 4 3],[10]);
 [m n o p]=deal(aaa{:});
 x{i,1}=sum(sum(m))/10;
 y{i,1}=sum(sum(n))/10;
 z{i,1}=sum(sum(o))/10;
 end
 if i==28
 aaa=mat2cell(t{i},[2 3 4 1],[10]);
 [m n o p]=deal(aaa{:});
 x{i,1}=sum(sum(m))/10;
 y{i,1}=sum(sum(n))/10;
 z{i,1}=sum(sum(o))/10;   
 end
end

4.2 逐步回归MATLAB程序

与第3问相同,加入外观香气口感参数,从EXCEL(排序处理后的各项理化指标值)读取数据,通过zscore函数对所有数据进行Z标准化处理,并调用stepwise逐步回归MATLAB工具箱,选取逐步回归的指标并计算系数。

%%
clc,clear 
x0=xlsread('3平均过后的酿酒葡萄理化指标.xlsx','酿酒红葡萄','B2:AE28');
y0=xlsread('3平均过后的葡萄酒理化指标.xlsx','红葡萄酒','B2:J28');
z0=xlsread('4外观香气口感.xlsx','红2','B2:D28');
x1=[x0,y0];
x1=zscore(x1);
z0=zscore(z0);
x=x1(:,1:39); 
z1=z0(:,1); 
stepwise(x,z1)
%%
z2=z0(:,2);
stepwise(x,z2)
%%
z3=z0(:,3);
stepwise(x,z3)

%%
clc,clear 
x0=xlsread('3平均过后的酿酒葡萄理化指标.xlsx','酿酒白葡萄','B2:AE29');
y0=xlsread('3平均过后的葡萄酒理化指标.xlsx','白葡萄酒','B2:I29');
z0=xlsread('4外观香气口感.xlsx','白2','B2:D29');
x1=[x0,y0];
x1=zscore(x1);
z0=zscore(z0);
x=x1(:,1:38); 
z1=z0(:,1); 
stepwise(x,z1)
%%
z2=z0(:,2);
stepwise(x,z2)
%%
z3=z0(:,3);
stepwise(x,z3)

4.3 白葡萄加入芳香物质逐步回归MATLAB程序

与第3问相同,加入外观香气口感参数与芳香物质参数,从EXCEL(排序处理后的各项理化指标值)读取数据,通过zscore函数对所有数据进行Z标准化处理,并调用stepwise逐步回归MATLAB工具箱,选取逐步回归的指标并计算系数。

%%
clc,clear 
a0=xlsread('3平均过后的酿酒葡萄理化指标.xlsx','酿酒白葡萄','B2:AE29');
b0=xlsread('3平均过后的葡萄酒理化指标.xlsx','白葡萄酒','B2:I29');
c0=xlsread('4处理过后的芳香物质.xlsx','白葡萄酒','B2:BV29');
z0=xlsread('4外观香气口感.xlsx','白2','B2:D29');
x1=[a0,b0,c0];
x1=zscore(x1);
z0=zscore(z0);
x=x1(:,1:111); 
z1=z0(:,1); 
stepwise(x,z1)
%%
z2=z0(:,2);
stepwise(x,z2)
%%
z3=z0(:,3);
stepwise(x,z3)

 

;