MATLAB数学建模方法与实践(第3版)——读书笔记
时间:2023-09-04 00:07:01
MATLAB数学建模方法与实践(第3版)-阅读笔记
- 1.数学建模的五个问题
- 2.MATLAB快速入门
-
- 2.从问题到脚本发布
- 2.2matlab提高
- 3.数据建模技术
-
- 3.获取、分析和预处理数据1
-
- 3.1.1数据读取
- 3.1.2数据预处理
- 3.1.3数据的统计
-
- 基本描述性统计
- 描述性分布统计
- 3.1.4数据可视化
- 3.1.5数据降维
-
- PCA:使许多相关变量变成更少的无关变量。
- 相关系数降维
- 3.22常用的数据建模方法
-
- 3.2.1回归
-
- 一元线性回归
- 一元非线性回归
- 多元回归
- 逐步回归
- logistic回归(预测)
- 3.2.2机器学习
-
- 分类
- 聚类
- 小结
- 3.2.3深度学习
- 3.2.4灰色预测
-
- 长江水质预测2005年A
- 3.2.5神经网络
- 3.2.6小波分析
-
- 小结
- 3.2.7.分析主要成分和时间序列
- 4.优化技术
-
- 4.1标准规划问题(基础)
-
- 4.1.1线性规划
- 4.1.2非线性规划
- 4.1.3整数规划
- 4.2全局优化算法(组合优化)
-
- 4.2.工具箱全局优化
- 4.2.2遗传算法
- 4.2.3模拟退火算法
- 4.2.4蚁群算法(局部最优)
- 5.连续模型matlab求解方法
-
- 5.常规微分方程求解
- 5.2ODE家族求解器
- 5.3专用求解器
- 6.评价模型的求解
-
- 6.1线性加权法
- 6.2层次分析法
- 7.机制建模matlab实现方法
-
- 7.推导机制建模(略)
- 7.2元胞自动机-模拟
- 8.2015年出租车补贴方案优化问题B
- 9.2016年开放社区对道路交通的影响
1.数学建模的五个问题
- 数据型——>拟合、回归、分类、聚类、主要成分
- 离散型——>目标规划、智能算法(神经网络、遗传、模拟退火、蚁群、粒子群)
- 连续型——>微分、偏微分、差分、函数
- 评价型——>层次分析法、多因素决策、回归
- 机理建模——>自主编程
2.MATLAB快速入门
2.从问题到脚本发布
problem:已知股票的交易数据包括日期、开盘价格、最高价格、最低价格、收盘价、交易量和周转率,图评估该股票的价值和风险。
- 导入数据。
- 数据可视化(选择两个关心的变量:日期和收盘价):选择工作区域的两个变量:右击,plot。
doc ;help命令可以帮助 我们
-
如何评估股价和风险?
3.1 价格越高,曲线斜率越大-多项拟合-得到拟合方程-然后得到斜率。
3.风险-最大回撤
-
如何拟合?ployfit。最大回撤函数?maxdrawdown
P = polyfit(DateNum,Pclose,1)%多项拟合 value=p(1)%给斜率赋值value,作为股票价值 MaxDD = maxdrawdown(Pclose);%计算最大回撤 risk=MaxDD%返回给risk,作为股票风险
- 选择导入数据时"生成脚本",在此基础上自动生成一些代码,添加代码形成脚本。
%链接:https://pan.baidu.com/s/1g0Et-S-RQcNuaDlirSLHkg %提取码:y9dy %% 导入电子表格中的数据 % 脚本用于从以下电子表格导入数据: % % 工作簿: C:\Users\LSdarker\Desktop\建模啊建模\MATLAB程序和数据\程序_MATLAB数学建模方法与实践_卓金武等\程序_MATLAB数学建模方法与实践_卓金武等\Cha2\sz000004.xls % 工作表: Sheet1 % % 为其他选定数据或其他电子表格扩展代码,请生成代替脚本的函数。 % 由 MATLAB 自动生成于 2020/09/01 19:15:05 %% 导入数据 [~, ~, raw] = xlsread('C:\Users\LSdarker\Desktop\建模啊建模\MATLAB程序和数据\程序_MATLAB数学建模方法与实践_卓金武等\程序_MATLAB数学建模方法与实践_卓金武等\Cha2\sz000004.xls','Sheet1','A2:H99'); %% 创建输出变量 data = reshape([raw{:}],size(raw)); %% 将导入的数组分配给列变量名称 Date1 = data(:,1); DateNum1 = data(:,2); Popen1 = data(:,3); Phigh1 = data(:,4); Plow1 = data(:,5); Pclose1 = data(:,6); Volum1 = data(:,7); Turn1 = data(:,8); %% 清除临时变量 clearvars data raw; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%以下是%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 数据探索 figure % 创建新的图像窗口 plot(DateNum,Pclose,'k') % 更改图片的黑色颜色(打印后不失真) datetick('x','mm');% 更改日期显示类型 xlabel(日期); % x轴说明 ylabel(收盘价); % y轴说明 figure bar(Pclose) % 作为对照图 %% 评估股票价值 p = polyfit(DateNum,Pclose,1); % 多项拟合, % 分号不在命令窗口显示执行结果 P1 = polyval(p,DateNum); % 获得多项模型的结果 figure plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的比较 value = p(1) % 给斜率赋值value, 作为股票的价值。 %% 评估股票风险 MaxDD = maxdrawdown(Pclose); % 计算最大回撤 risk = MaxDD % 给予最大回撤赋值risk, 股票风险 /code>
- 发布——编辑发布选项——将HTML改为doc,至此我们便会得到一份详细的运行报告。
- 改进——这个脚本是求1只股票的风险及价值,如果求1000只,可将该脚本抽象成函数。
2.2matlab提高
- Tab:补全命令
- :(冒号):用做多下标援引时,表示对应维度上的全部元素。
- {}:元胞数组标记符,也就是广义矩阵,可以存放任何数据类型,每个元素可以有不同的尺寸,每个元素的内容也可以完全不同。这些元素叫做元胞(cell)。
- table也是一种数据类型,展示数据和操作数据方面比元胞数组更有优势。
3.数据建模技术
3.1数据的获取、分析、预处理
3.1.1数据读取
%1.从excel读取数据
xlsread('excel所在位置',3,'B1:C5')
%3代表sheet3;B1:C5代表读入数据范围
%写入
xlsread('excel所在位置',a,3,'B1:C5')
%a代表待写入数据;3代表sheet3;B1:C5代表具体位置
%2.从TXT读取数据
load('***.txt')
%保存
save c:\***.txt a -ascii;
%a是变量 以ASCII码存放
%3.如果TXT文件存储了不同类型数据,分类读取就需要textread
[name,type,x,y,answer]=textread('**.txt','format',N,'headerlines',M)
%format 代表格式;N表示读取的次数,每次读一行;headerlines表示从M+1行开始读取。
%4.将信息写入TXT,可以控制写入精度
file=fopen('**.txt','w')
fprintf(file,'%6.2f',3.14)%6.2f表示输出宽度为6,精确到小数点2位
%5.读取图片
A=imread(filename)
%A存放像素矩阵
%6.读入并将图像拼接。此程序需要一定的算法提高拼接正确率
%% 读取图片
%链接:https://pan.baidu.com/s/1Ow6L7a-ArvFllaK4M6j4tw
%提取码:sqyx
%链接:https://pan.baidu.com/s/1z0NPoyB96CT4FEQUJsZCfg
%提取码:u3df
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
clc, clear, close all
a1=imread('000.bmp');
[m,n]=size(a1);
%% 批量读取图片
dirname = 'ImageChips';
files = dir(fullfile(dirname, '*.bmp'));
a=zeros(m,n,19);
pic=[];
for ii = 1:length(files)
filename = fullfile(dirname, files(ii).name);
a(:,:,ii)=imread(filename);
pic=[pic,a(:,:,ii)];
end
double(pic);
figure
imshow(pic,[])
%7.读取视频
%% 读取视频数据
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
videoFReader = vision.VideoFileReader('vippedtracking.mp4');%写上自己视频的名字
% 播放视频文件
videoPlayer = vision.VideoPlayer;
while ~isDone(videoFReader)
videoFrame = step(videoFReader);
step(videoPlayer, videoFrame);
end
release(videoPlayer);
%% 设置播放方式
% 重置播放器
reset(videoFReader)
% 增加播放器的尺寸
r = groot;
scrPos = r.ScreenSize;
% Size/position is always a 4-element vector: [x0 y0 dx dy]
dx = scrPos(3); dy = scrPos(4);
videoPlayer = vision.VideoPlayer('Position',[dx/8, dy/8, dx*(3/4), dy*(3/4)]);
while ~isDone(videoFReader)
videoFrame = step(videoFReader);
step(videoPlayer, videoFrame);
end
release(videoPlayer);
reset(videoFReader)
%% 获取视频中的图像
videoFrame = step(videoFReader);
n = 0;
while n~=15
videoFrame = step(videoFReader);
n = n+1;
end
figure, imshow(videoFrame)
release(videoPlayer);
release(videoFReader)
3.1.2数据预处理
- 缺失值处理
1.2删除法:删除小部分
1.2插补法:
a. 均值插补:定距用平均值、非定距用众数。
b. 回归插补。
c.极大似然估计(ML):观测数据的边际分布对未知参数进行极 大似然估计。也可以通过期望最大化来参数估计。有效样本的数量足够保证ML估计值是渐进无偏的并服从正态分布。
- 噪音过滤
noise是数据随机误差,正常的,但会影响变量真值反映。
方法有:
a. 回归法:前提是要有线性趋势。
回归法是用函数拟合数据来光滑数据,线性回归得到两个属性的最佳直线,使得通过一个预测另一个。多元线性回归的属性多于两个。通过回归后的函数值代替原始数据,避免噪声感染。
b.均值平滑法:前提是具有序列特征的变量。
用临近的若干数据均值替换原来数据。
c. 离散点分析:通过聚类的方法检测离散点,删除它。
d.小波过滤法:本质是一个函数逼近问题。
即如何在小波母函数伸缩和平移所展成的函数空间中,根据提出的衡量准则,对原信号的最佳逼近,完成原信号和噪声信号的区分。也就是从实际信号空间到小波函数空间的最佳映射,从而得到原信号的最佳恢复。
- 数据集成
将分散的数据源中的数据,集成到一个统一的数据集合。(针对数学建模。就是获取所需要的数据)
- 数据归约
属性选择:删除不相关的属性:通过数据相关性分析、数据统计分析、数据可视化、主成分分析。
样本选择。
- 数据变换
- 标准化:转化为无量纲的纯数值,便于比较和加权。
0-1标准化,也叫离差标准化,对原始数据线性变换,使其落入[0,1]区间
x ∗ = − x m i n x m a x − x m i n x^*=\frac{-x_{min}}{x_{max}-x_{min}} x∗=xmax−xmin−xmin
这种方法的缺陷是有数据新加入时,导致xmax,xmin需要重新定义。
Z标准化,标准差标准化,处理的数据符合标准正态分布
x ∗ = x − μ σ x^*=\frac{x-μ}{σ} x∗=σx−μ
μ为所有样本的均值,σ为所有样本标准差。
- 离散化:消除连续观察点之间的差异
文档:离散化.note
链接:http://note.youdao.com/noteshare?id=a704d2330cc3edf3d39000c6675970bb&sub=A74F96CF9001453EBE68FD27B2E82797
- 语义转换:将{非常好,好,一般,差,非常差}–>{1,2,3,4,5}
3.1.3数据的统计
了解数据的基本特征。从样本推断总体,推断总体的数据特征。
统计的总体:人们研究对象的全体。
总体中的一个基本单位称为个体,个体的特征用变量x表示。
从总体中随机产生若干个体的集合称为样本,记为{x1,x2,…,xn},n为样本容量。
基本描述性统计
假设一个容量为n的样本,记为x=(x1,x2…,xn),对它加工后,提出有用的信息。统计量是加工出来反映样本数量特征的函数,不包含任何未知量。
常见的统计量
- 表示位置:算法平均值和中位数
平均值定义:
x ‾ = 1 n ∑ i = 1 n x i \overline{x}=\frac{1}{n}\sum_{i=1}^nx_i x=n1i=1∑nxi
中位数是将数据从小到大排序后位于中间位置的数。
mean(x);%x的均值
median(x);%返回中位数
- 表示数据散度:标准差、方差、极差
标准差定义:
s = [ 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 ] 1 2 s=[\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\overline{x})^2]^{\frac{1}{2}} s=[n−11i=1∑n(xi−x)2]21
它是各个数据与均值偏离程度的度量,这种偏移可称为变异。
被除以n-1是对无偏估计的要求。
若需要被n除,可用matlab中std(x,1)和var(x,1)。
方差:标准差的平方s^2。
极差x=(x1,x2…,xn)的最大值与最小值之差。
std(x)%标准差
var(x)%方差
range(x)%极差
- 表示分布形态的统计量:偏度、峰度
偏度反映分布的对称性,v1>0称右偏性,位于均值右边的数据比左边的数据多;v1<0相反。v1=0认为分布对称。
峰度是衡量偏离正态分布的尺度之一,正态分布的峰度为3,若v2比3大得多,表示分布有沉重的尾巴,说明样本中有较多远离均值的数据。
skewness(x)%返回x的偏度
kurtosis(x)%峰度
以上matlab计算统计量命令中,若x为矩阵,则作用于x的列返回一个行向量。
分布描述性统计
随机变量的特性完全由它的概率分布函数或概率密度函数来描述。F(x)=P{X≤x},分布函数定义为X≤x的概率。若X是连续型随机变量,则p(x)与F(x)关系为
F ( x ) = ∫ − ∞ x p ( x ) d x F(x)=\int_{-\infty}^{x}{p(x)dx} F(x)=∫−∞xp(x)dx
分位数定义为:对于0<α<1,使某分布函数F(x)=α的x称为这个分布的α分位数,记做x_α。
直方图是频数分布图。频数/样本容量n=频率。当n->∞,频率是概率的近似,因此直方图可看做密度函数图形的离散化近似,
3.1.4数据可视化
数据分布形态、中心分布、关联情况。
%链接:https://pan.baidu.com/s/1mvusLgomW1i6bUoS7z3DKA
%提取码:pdws
% 数据可视化——基本绘图
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
% 读取数据
clc, clear al, close all
X=xlsread('dataTableA2.xlsx');
% 绘制变量dv1的基本分布
N=size(X,1);
id=1:N;
figure
plot( id', X(:,2),'LineWidth',1)
set(gca,'linewidth',2);
xlabel('编号','fontsize',12);
ylabel('dv1', 'fontsize',12);
title('变量dv1分布图','fontsize',12);
% 同时绘制变量dv1-dv4的柱状分布图
figure
subplot(2,2,1);
hist(X(:,2));
title('dv1柱状分布图','fontsize',12)
subplot(2,2,2);
hist(X(:,3));
title('dv2柱状分布图','fontsize',12)
subplot(2,2,3);
hist(X(:,4));
title('dv3柱状分布图','fontsize',12)
subplot(2,2,4);
hist(X(:,5));
title('dv4柱状分布图','fontsize',12)
%统计量绘图
% 数据可视化——数据分布形状图
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
% 读取数据
clc, clear al, close all
X=xlsread('dataTableA2.xlsx');
dv1=X(:,2);
% 绘制变量dv1的柱状分布图
h = -5:0.5:5;
n = hist(dv1,h);
figure
bar(h, n)
% 计算常用的形状度量指标
mn = mean(dv1); % 均值
sdev = std(dv1); % 标准差
mdsprd = iqr(dv1); % 四分位数
mnad = mad(dv1); % 中位数
rng = range(dv1); % 极差
% 标识度量数值
x = round(quantile(dv1,[0.25,0.5,0.75]));
y = (n(h==x(1)) + n(h==x(3)))/2;
line(x,[y,y,y],'marker','x','color','r')
x = round(mn + sdev*[-1,0,1]);
y = (n(h==x(1)) + n(h==x(3)))/2;
line(x,[y,y,y],'marker','o','color',[0 0.5 0])
x = round(mn + mnad*[-1,0,1]);
y = (n(h==x(1)) + n(h==x(3)))/2;
line(x,[y,y,y],'marker','*','color',[0.75 0 0.75])
x = round([min(dv1),max(dv1)]);
line(x,[1,1],'marker','.','color',[0 0.75 0.75])
legend('Data','Midspread','Std Dev','Mean Abs Dev','Range')
%数据关联可视化
% 数据可视化——变量想相关性
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
% 读取数据
clc, clear al, close all
X=xlsread('dataTableA2.xlsx');
Vars = X(:,7:12);
% 绘制变量间相关性关联图
figure
plotmatrix(Vars)
% 绘制变量间相关性强度图
covmat = corrcoef(Vars);
figure
imagesc(covmat);
grid;
colorbar;
%figure1绘制的变量间相关性关联图,可以看出任意两个变量的数据关联趋向
%figure2是变量间相关性强度图,用于筛选变量
%数据分组可视化
%箱体图按照不同的分位数将数据进行分组
% 数据可视化——数据分组
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
% 读取数据
clc, clear al, close all
X=xlsread('dataTableA2.xlsx');
dv1=X(:,2);
eva=X(:,12);
% Boxplot
figure
boxplot(X(:,2:12))
figure
boxplot(dv1, eva)
figure
boxplot(X(:,5))
文档:箱体图含义.note
链接:http://note.youdao.com/noteshare?id=0728298a7a1f716377feb14c32e13c2c&sub=96220FAE8BBE47E1A111648CC26CAD0F
3.1.5数据降维
PCA:使得众多相关的变成较少的无关的变量。
使用PCA分析案例中的影响因素
文档:PCA.note
链接:http://note.youdao.com/noteshare?id=c29d8e16615ccdd07ad20f865207a6f1&sub=B5D76F7ACA004ACDA5A9BAA3585776BD
PCA应用:企业综合实力排序
%链接:https://pan.baidu.com/s/198GcoR4dNJUp3vb9RRHHsA
%提取码:2se9
%% PCA数据降维实例
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 读取数据
A=xlsread('Coporation_evaluation.xlsx', 'B2:I16');
% Transfer orginal data to standard data
a=size(A,1); % Get the row number of A
b=size(A,2); % Get the column number of A
for i=1:b
SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i)); % Matrix normalization
end
% Calculate correlation matrix of A.
CM=corrcoef(SA);
% Calculate eigenvectors and eigenvalues of correlation matrix.
[V, D]=eig(CM);
% Get the eigenvalue sequence according to descending and the corrosponding
% attribution rates and accumulation rates.
for j=1:b
DS(j,1)=D(b+1-j, b+1-j);
end
for i=1:b
DS(i,2)=DS(i,1)/sum(DS(:,1));
DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1));
end
% Calculate the numvber of principal components.
T=0.9; % set the threshold value for evaluating information preservation level.
for K=1:b
if DS(K,3)>=T
Com_num=K;
break;
end
end
% Get the eigenvectors of the Com_num principal components
for j=1:Com_num
PV(:,j)=V(:,b+1-j);
end
% Calculate the new socres of the orginal items
new_score=SA*PV;
for i=1:a
total_score(i,2)=sum(new_score(i,:));
total_score(i,1)=i;
end
new_score_s=sortrows(total_score,-2);
%% 显示结果
disp('特征值及贡献率:')
DS
disp('阀值T对应的主成分数与特征向量:')
Com_num
PV
disp('主成分分数:')
new_score
disp('主成分分数排序:')
new_score_s
%分析:第9综合实力最强 12综合实力最弱。
%各成分的权重信息:贡献率
%原始变量的关联关系:特征向量
相关系数降维
对较多变量进行筛选
文档:相关系数.note
链接:http://note.youdao.com/noteshare?id=85b8dfa19eaef3adf70d622bae5f8993&sub=8B85324A4D5D4EE2A2E9F4C3EFC3B9AE
3.2常用的数据建模方法
3.2.1回归
使用回归时,首先判断自变量个数,超过两个用多元回归。判断线性还是非线性,对于多元回归,保持其它变量不变,将多元转化为一元去判断。
根据回归方法因变量的个数和回归函数的类型(线性回归、非线性回归),可将回归方法分为以下。
一元线性回归
%% 一元线性回归实例
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 输入数据
clc, clear all, close all
x=[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80,63.80,73.40];
y=[41.4,51.8,61.70,67.90,68.70,77.50,95.90,137.40,155.0,175.0];
%% 采用最小二乘回归
% 绘制散点图,判断是否具有线性关系
figure
plot(x,y,'r*') %作散点图
xlabel('x(职工工资总额)','fontsize', 12) %横坐标名
ylabel('y(商品零售总额)', 'fontsize',12) %纵坐标名
set(gca,'linewidth',2);
% 采用最小二乘拟合
Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0;
hold on
plot(x, y1,'linewidth',2);
%% 采用LinearModel.fit函数进行回归
m2 = LinearModel.fit(x,y)
%% 采用regress函数进行回归
Y=y';
X=[ones(size(x,2),1),x'];
[b, bint, r, rint, s] = regress(Y, X)
%注意Y为列向量,因变量 X为自变量组成的矩阵
%regress后缺省alpha(显著性水平)时默认是0.05
%b为β1,β2
%bint为b的置信区间
%r为残差
%rint为残差的置信区间
%s包含四个统计量:决定系数R^2(R为相关系数)、F值
%F(1,n-2)分布大于F值的概率p、剩余方差s^2
%s^2也可以由sum(r.^2)/(n-2)计算
%作用:1.R^2越接近1,变量线性相关越强,模型越有效
%2.(在1-α水平下)F(1,n-2)
一元非线性回归
%% 一元非线性回归实例
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 输入数据
clc, clear all, close all
x=[1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
y=[7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
plot(x,y,'*','linewidth',2);
set(gca,'linewidth',2);
xlabel('销售额x/万元','fontsize', 12)
ylabel('流通费率y/%', 'fontsize',12)
%% 对数形式
m1 = @(b,x) b(1) + b(2)*log(x);
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
b=nonlinfit1.Coefficients.Estimate;
Y1=b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)
%% 指数形式拟合
m2 = 'y ~ b1*x^b2';
nonlinfit2 = fitnlm(x,y,m2,[1;1])
b1=nonlinfit2.Coefficients.Estimate(1,1);
b2=nonlinfit2.Coefficients.Estimate(2,1);
Y2=b1*x.^b2;
hold on
plot(x,Y2,'r','linewidth',2)
legend('原始数据','a+b*lnx','a*x^b')
%分析结果,对数的决定系数为0.973
%指数的决定系数为0.993
%选择指数形式的函数
多元回归
包括多元线性回归、多元多项式回归。
x1=[3.5 5.3 5.1 5.8 4.2 6.0 6.8 5.5 3.1 7.2 4.5 4.9 8.0 6.5 6.6 3.7 6.2 7.0 4.0 4.5 5.9 5.6 4.8 3.9];
x2=[9 20 18 33 31 13 25 30 5 47 25 11 23 35 39 21 7 40 35 23 33 27 34 15];
x3=[6.1 6.4 7.4 6.7 7.5 5.9 6.0 4.0 5.8 8.3 5.0 6.4 7.6 7.0 5.0 4.4 5.5 7.0 6.0 3.5 4.9 4.3 8.0 5.8];
Y=[33.2 40.3 38.7 46.8 41.4 37.5 39.0 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48.0 38.0 35.9 40.4 36.8 45.2 35.1];
%% 做出Y与各自变量的散点图
subplot(1,3,1),plot(x1,Y,'g*'),
subplot(1,3,2),plot(x2,Y,'k+'),
subplot(1,3,3),plot(x3,Y,'ro'),
%这些点大致分布在一条直线旁边,有比较好的线性相关,做线性回归
%% 多元线性回归
n=24;m=3;
X=[ones(n,1),x1',x2',x3'];
[b,bint,r,rint,s]=regress(Y',X,0.05);
b%回归系数
bint%置信区间
s%R^2、F、p、s^2
%%模型检验
%1.相关系数R^2接近1,相关性较强
%2.F检验:当F>F(m,n-m-1)时,认为y为x1,...,xm之间有显著的线性相关。(在1-α的水平下)
finv(0.95,3,n-4)%F>3.098
%3.p检验:p<α(预订的显著水平),那么y与x1,...,xm之间有显著的线性相关
%s^2越小越好,在改进模型时做参考
还有两种特殊的回归方式,一种是在回归过程中可以调整变量数量的回归方法,称为逐步回归。另一种是以指数结构函数作为回归模型的回归方法,称为logistic回归。
逐步回归
是多元线性回归、多元多项式回归的结合,使得方程因子最合理
X=[7,26,6,60
1,29,15,52
11,56,8,20
11,31,8,47
7,52,6,33
11 55 9 22
3 71 17 6
1 31 22 44
2 54 18 22
21 47 4 26
1 40 23 34
11 66 9 12];%自变量 一行是一个样本,每个样本四个因素
Y=[78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8 113.3];
stepwise(X,Y,[1,2,3,4],0.05,0.10)%[1,2,3,4]表示4个自变量均保存在模型中
%一直单击next step直至变灰,便为最终结果
logistic回归(预测)
%链接:https://pan.baidu.com/s/1ljksQlTi53wCML_SfHm4CA
%提取码:wny1
% 程序P7-1: logistic方法Matlab实现程序
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 数据准备
clear all
clc
X0=xlsread('logistic_ex1.xlsx', 'A2:C21'); % 回归数据X值
X1=xlsread('logistic_ex1.xlsx', 'A2:C26'); % 验证与预测数据
Y0=xlsread('logistic_ex1.xlsx', 'D2:D21'); % 回归数据P值
%--------------------------------------------------------------------------
%% logistic函数
GM=fitglm(X0,Y0,'Distribution','binomial');
Y1=predict(GM,X1);
%% 模型评估
N0=1:size(Y0,1);N1=1:size(Y1,1);
plot(N0',Y0,'-kd');
hold on;scatter(N1',Y1,'b')
xlabel('数据点编号');ylabel('输出值');
3.2.2机器学习
利用历史数据"训练","学习"到某种规律、模式,建立预测未来的模型。
有两种学习方法:
- 有监督学习:用于决策支持。包括分类、回归。
- 无监督学习:用于知识发现。包括聚类(隐藏的模式)。
分类方法:
- K-NN(K-近邻)
- 贝叶斯
- 神经网络
- logistic
- 判别分析
- SVM
- 决策树
聚类方法:
- K-mens
- 层次聚类
- 神经网络
- 高斯混合
- 模糊C均值
分类
文档:K-NN.note
链接:http://note.youdao.com/noteshare?id=fedb9e76f023e0db060fdc01093b1ab8&sub=74C32A6EBAF44C9FA67CEDE19EA94FB8
文档:贝叶斯分类.note
链接:http://note.youdao.com/noteshare?id=eb1fe28035ea3efd72ce6b4699236614&sub=76A05961496045E58B698991F4E18AB7
文档:支持向量机分类.note
链接:http://note.youdao.com/noteshare?id=39f394075d8d4460c57397a2eae7b956&sub=EF8A15FDAE46411EB49AB2CD4B1C03D3
K-NN实现分类器、朴素贝叶斯算法实现分类器、神经网络、Logistic、判别分析、SVM、决策树的matlab代码实现
- 一家银行通过电话调查客户是否愿意买理财产品,并记录调查结果为y。另外银行有这些客户的资料X,包括十六个属性(age、job…)。希望建立一个分类器,预测一个新客服是够愿意购买。
%链接:https://pan.baidu.com/s/1RQdaIx6_EYTgKuf4DJtP2w
%提取码:ue1o
%% 分类方法示例程序
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 1.
clc, clear all, close all
%% 2.导入数据及数据预处理
load bank.mat
% 将分类变量转换成分类数组
names = bank.Properties.VariableNames;
category = varfun(@iscellstr, bank, 'Output', 'uniform');
for i = find(category)
bank.(names{i}) = categorical(bank.(names{i}));
end
% 跟踪分类变量
catPred = category(1:end-1);
% 设置默认随机数生成方式确保该脚本中的结果是可以重现的
rng('default');
% 数据探索----数据可视化
figure(1)
gscatter(bank.balance,bank.duration,bank.y,'kk','xo')
xlabel('年平均余额/万元', 'fontsize',12)
ylabel('上次接触时间/秒', 'fontsize',12)
title('数据可视化效果图', 'fontsize',12)
set(gca,'linewidth',2);
% 设置响应变量和预测变量
X = table2array(varfun(@double, bank(:,1:end-1))); % 预测变量
Y = bank.y; % 响应变量
disp('数据中Yes & No的统计结果:')
tabulate(Y)
%将分类数组进一步转换成二进制数组以便于某些算法对分类变量的处理
XNum = [X(:,~catPred) dummyvar(X(:,catPred))];
YNum = double(Y)-1;
%% 3.设置交叉验证方式
% 随机选择40%的样本作为测试样本
cv = cvpartition(height(bank),'holdout',0.40);
% 训练集
Xtrain = X(training(cv),:);
Ytrain = Y(training(cv),:);
XtrainNum = XNum(training(cv),:);
YtrainNum = YNum(training(cv),:);
% 测试集
Xtest = X(test(cv),:);
Ytest = Y(test(cv),:);
XtestNum = XNum(test(cv),:);
YtestNum = YNum(test(cv),:);
disp('训练集:')
tabulate(Ytrain)
disp('测试集:')
tabulate(Ytest)
%% 最近邻
% 4.训练分类器
knn = ClassificationKNN.fit(Xtrain,Ytrain,'Distance','seuclidean',...
'NumNeighbors',5);
% 进行预测
[Y_knn, Yscore_knn] = knn.predict(Xtest);
Yscore_knn = Yscore_knn(:,2);
% 计算混淆矩阵
disp('最近邻方法分类结果:')
C_knn = confusionmat(Ytest,Y_knn)
%% 贝叶斯
% 设置分布类型
dist = repmat({'normal'},1,width(bank)-1);
dist(catPred) = {'mvmn'};
% 训练分类器
Nb = NaiveBayes.fit(Xtrain,Ytrain,'Distribution',dist);
% 进行预测
Y_Nb = Nb.predict(Xtest);
Yscore_Nb = Nb.posterior(Xtest);
Yscore_Nb = Yscore_Nb(:,2);
% 计算混淆矩阵
disp('贝叶斯方法分类结果:')
C_nb = confusionmat(Ytest,Y_Nb)
%% 神经网络
% 设置神经网络模式及参数
hiddenLayerSize = 5;
net = patternnet(hiddenLayerSize);
% 设置训练集、验证机和测试集
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% 训练网络
net.trainParam.showWindow = false;
inputs = XtrainNum';
targets = YtrainNum';
[net,~] = train(net,inputs,targets);
% 用测试集数据进行预测
Yscore_nn = net(XtestNum')';
Y_nn = round(Yscore_nn);
% 计算混淆矩阵
disp('神经网络方法分类结果:')
C_nn = confusionmat(YtestNum,Y_nn)
%% Logistic
% 训练分类器
glm = fitglm(Xtrain,YtrainNum,'linear', 'Distribution','binomial',...
'link','logit','CategoricalVars',catPred, 'VarNames', names);
% 用测试集数据进行预测
Yscore_glm = glm.predict(Xtest);
Y_glm = round(Yscore_glm);
% 计算混淆矩阵
disp('Logistic方法分类结果:')
C_glm = confusionmat(YtestNum,Y_glm)
%% 判别分析
% 训练分类器
da = ClassificationDiscriminant.fit(XtrainNum,Ytrain);
% 进行预测
[Y_da, Yscore_da] = da.predict(XtestNum);
Yscore_da = Yscore_da(:,2);
% 计算混淆矩阵
disp('判别方法分类结果:')
C_da = confusionmat(Ytest,Y_da)
%% 支持向量机(SVM)
% 设置最大迭代次数
opts = statset('MaxIter',45000);
% 训练分类器
svmStruct = svmtrain(Xtrain,Ytrain,'kernel_function','linear','kktviolationlevel',0.2,'options',opts);
% 进行预测
Y_svm = svmclassify(svmStruct,Xtest);
Yscore_svm = svmscore(svmStruct, Xtest);
Yscore_svm = (Yscore_svm - min(Yscore_svm))/range(Yscore_svm);
% 计算混淆矩阵
disp('SVM方法分类结果:')
C_svm = confusionmat(Ytest,Y_svm)
%% 决策树
% 训练分类器
t = ClassificationTree.fit(Xtrain,Ytrain,'CategoricalPredictors',catPred);
% 进行预测
Y_t = t.predict(Xtest);
% 计算混淆矩阵
disp('决策树方法分类结果:')
C_t = confusionmat(Ytest,Y_t)
%% 通过ROC曲线来比较方法
methods = {'KNN','NBayes','NNet', 'GLM', 'LDA', 'SVM'};
scores = [Yscore_knn, Yscore_Nb, Yscore_nn, Yscore_glm, Yscore_da, Yscore_svm];
%绘制ROC曲线
figure
auc= zeros(6); hCurve = zeros(1,6);
for ii=1:6;
[rocx, rocy, ~, auc(ii)] = perfcurve(Ytest, scores(:,ii), 'yes');
hCurve(ii,:) = plot(rocx, rocy, 'k','LineWidth',2); hold on;
end
legend(hCurve(:,1), methods)
set(gca,'linewidth',2);
grid on;
title('各方法ROC曲线', 'fontsize',12);
xlabel('假阳率 [ = FP/(TN+FP)]', 'fontsize',12);
ylabel('真阳率 [ = TP/(TP+FN)]', 'fontsize',12);
% 绘制各方法分类正确率
figure;
bar(auc); set(gca,'YGrid', 'on','XTickLabel',methods);
xlabel('方法简称', 'fontsize',12);
ylabel('分类正确率', 'fontsize',12);
title('各方法分类正确率','fontsize',12);
set(gca,'linewidth',2);
%svmscore.m
function f = svmscore(svm,X)
% Compute SVM score for classes -1 and +1
% Copyright 2014 The MathWorks, Inc.
shift = svm.ScaleData.shift;
scale = svm.ScaleData.scaleFactor;
X = bsxfun(@plus,X,shift);
X = bsxfun(@times,X,scale);
sv = svm.SupportVectors;
alphaHat = svm.Alpha;
bias = svm.Bias;
kfun = svm.KernelFunction;
kfunargs = svm.KernelFunctionArgs;
f = kfun(sv,X,kfunargs{:})'*alphaHat(:) + bias;
f = -f; % flip the sign to get the score for the +1 class
end
聚类
文档:k-means聚类.note
链接:http://note.youdao.com/noteshare?id=34c9772b906cca6bda8c1c37dc3b1f7d&sub=F37E921C3837492F8689DDC3FCAA1993
- 已知20个样本,每个样本两种特征,对这些数据分类
%% K-means方法的MATLAB实现
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 数据准备和初始化
clc
clear
x=[0 0;1 0; 0 1; 1 1;2 1;1 2; 2 2;3 2; 6 6; 7 6; 8 6; 6 7; 7 7; 8 7; 9 7 ; 7 8; 8 8; 9 8; 8 9 ; 9 9];
z=zeros(2,2);
z1=zeros(2,2);
z=x(1:2, 1:2);
%% 寻找聚类中心
while 1
count=zeros(2,1);
allsum=zeros(2,2);
for i=1:20 % 对每一个样本i,计算到2个聚类中心的距离
temp1=sqrt((z(1,1)-x(i,1)).^2+(z(1,2)-x(i,2)).^2);
temp2=sqrt((z(2,1)-x(i,1)).^2+(z(2,2)-x(i,2)).^2);
if(temp1
- 一家银行希望对债券分类,但不知道分成几类,已知债券一些属性(Type、name),请确定分成几类。
k-means聚类(使用kmeans函数)、层次聚类、模糊C-均值聚类、高斯混合聚类 (GMM)、 神经网络matlab实现分类。
文档:层次聚类.note
链接:http://note.youdao.com/noteshare?id=04f1ec00ee41e0ebc4b178d4a509b4bc&sub=37626CCFD47D4170BD4FBEAE3B4C43DD
文档:模糊C-均值聚类(FCM).note
链接:http://note.youdao.com/noteshare?id=e8e959eebc264887ee101d0ec3ed1c3d&sub=3512CD8F115F4551B199F2C6687950CB
%链接:https://pan.baidu.com/s/14D7BeBF2PXjyWoO5MF1BrA
%提取码:ob7o
%% 聚类方法
% 《MATLAB数学建模方法与实践》(《MATLAB在数学建模中的应用》升级版),北航出版社,卓金武、王鸿钧编著.
%% 导入数据和预处理数据
clc, clear all, close all
load BondData
settle = floor(date);
%数据预处理
bondData.MaturityN = datenum(bondData.Maturity, 'dd-mmm-yyyy');
bondData.SettleN = settle * ones(height(bondData),1);
% 筛选数据
corp = bondData(bondData.MaturityN > settle & ...
bondData.Type == 'Corp' & ...
bondData.Rating >= 'CC' & ...
bondData.YTM < 30 & ...
bondData.YTM >= 0, :);
% 设置随机数生成方式保证结果可重现
rng('default');
%% 探索数据
% 数据可视化
figure
gscatter(corp.Coupon,corp.YTM,corp.Rating)
set(gca,'linewidth',2);
xlabel('票面利率')
ylabel('到期收益率')
% 选择聚类变量
corp.RatingNum = double(corp.Rating);
bonds = corp{:,{'Coupon','YTM','CurrentYield','RatingNum'}};
% 设置类别数量
numClust = 3;
% 设置用于可视化聚类效果的变量
VX=[corp.Coupon, double(corp.Rating), corp.YTM];
%% K-Means 聚类
dist_k = 'cosine';
kidx = kmeans(bonds, numClust, 'distance', dist_k);
%绘制聚类效果图
figure
F1 = plot3(VX(kidx==1,1), VX(kidx==1,2),VX(kidx==1,3),'r*', ...
VX(kidx==2,1), VX(kidx==2,2),VX(kidx==2,3), 'bo', ...
VX(kidx==3,1), VX(kidx==3,2),VX(kidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on;
set(F1,'linewidth',2, 'MarkerSize',8);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
ylabel('到期收益率','fontsize',12);
title('Kmeans方法聚类结果')
% 评估各类别的相关程度
dist_metric_k = pdist(bonds,dist_k);
dd_k = squareform(dist_metric_k);
[~,idx] = sort(kidx);
dd_k = dd_k(idx,idx);
figure
imagesc(dd_k)
set(gca,'linewidth',2);
xlabel('数据点','fontsize',12)
ylabel('数据点', 'fontsize',12)
title('k-Means聚类结果相关程度图', 'fontsize',12)
ylabel(colorbar,['距离矩阵:', dist_k])
axis square
%% 层次聚类
dist_h = 'spearman';
link = 'weighted';
hidx = clusterdata(bonds, 'maxclust', numClust, 'distance' , dist_h, 'linkage', link);
%绘制聚类效果图
figure
F2 = plot3(VX(hidx==1,1), VX(hidx==1,2),VX(hidx==1,3),'r*', ...
VX(hidx==2,1), VX(hidx==2,2),VX(hidx==2,3), 'bo', ...
VX(hidx==3,1), VX(hidx==3,2),VX(hidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on
set(F2,'linewidth',2, 'MarkerSize',8);
set(gca,'linewidth',2);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
ylabel('到期收益率','fontsize',12);
title('层次聚类方法聚类结果')
% 评估各类别的相关程度
dist_metric_h = pdist(bonds,dist_h);
dd_h = squareform(dist_metric_h);
[~,idx] = sort(hidx);
dd_h = dd_h(idx,idx);
figure
imagesc(dd_h)
set(gca,'linewidth',2);
xlabel('数据点', 'fontsize',12)
ylabel('数据点', 'fontsize',12)
title('层次聚类结果相关程度图')
ylabel(colorbar,['距离矩阵:', dist_h])
axis square
% 计算同型相关系数
Z = linkage(dist_metric_h,link);
cpcc = cophenet(Z,dist_metric_h);
disp('同型相关系数: ')
disp(cpcc)
% 层次结构图
set(0,'RecursionLimit',5000)
figure
dendrogram(Z)
set(gca,'linewidth',2);
set(0,'RecursionLimit',500)
xlabel('数据点', 'fontsize',12)
ylabel ('标准距离', 'fontsize',12)
title('层次聚类法层次结构图')
%% 神经网络
%设置网络
dimension1 = 3;
dimension2 = 1;
net = selforgmap([dimension1 dimension2]);
net.trainParam.showWindow = 0;
%训练网络
[net,tr] = train(net,bonds');
nidx = net(bonds');
nidx = vec2ind(nidx)';
%绘制聚类效果图
figure
F3 = plot3(VX(nidx==1,1), VX(nidx==1,2),VX(nidx==1,3),'r*', ...
VX(nidx==2,1), VX(nidx==2,2),VX(nidx==2,3), 'bo', ...
VX(nidx==3,1), VX(nidx==3,2),VX(nidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on
set(F3,'linewidth',2, 'MarkerSize',8);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
ylabel('到期收益率','fontsize',12);
title('神经网络方法聚类结果')
%% 模糊C-Means聚类
options = nan(4,1);
options(4) = 0;
[centres,U] = fcm(bonds,numClust, options);
[~, fidx] = max(U);
fidx = fidx';
%绘制聚类效果图
figure
F4 = plot3(VX(fidx==1,1), VX(fidx==1,2),VX(fidx==1,3),'r*', ...
VX(fidx==2,1), VX(fidx==2,2),VX(fidx==2,3), 'bo', ...
VX(fidx==3,1), VX(fidx==3,2),VX(fidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on
set(F4,'linewidth',2, 'MarkerSize',8);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
ylabel('到期收益率','fontsize',12);
title('模糊C-Means方法聚类结果')
%% 高斯混合聚类 (GMM)
gmobj = gmdistribution.fit(bonds,numClust);
gidx = cluster(gmobj,bonds);
%绘制聚类效果图
figure
F5 = plot3(VX(fidx==1,1), VX(fidx==1,2),VX(fidx==1,3),'r*', ...
VX(fidx==2,1), VX(fidx==2,2),VX(fidx==2,3), 'bo', ...
VX(fidx==3,1), VX(fidx==3,2),VX(fidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on
set(F5,'linewidth',2, 'MarkerSize',8);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
ylabel('到期收益率','fontsize',12);
title('高斯混合方法聚类结果')
%% k-Means方法确定最佳的聚类类别数
% 绘制几个典型类别数情况下的平均轮廓值图
figure
for i=2:4
kidx = kmeans(bonds,i,'distance',dist_k);
subplot(3,1,i-1)
[~,F6] = silhouette(bonds,kidx,dist_k);
xlabel('轮廓值','fontsize',12);
ylabel('类别数','fontsize',12);
set(gca,'linewidth',2);
title([num2str(i) '类对应的轮廓值图 ' ])
snapnow
end
% 计算平均轮廓值
numC = 15;
silh_m = nan(numC,1);
for i=1:numC
kidx = kmeans(bonds,i,'distance',dist_k,'MaxIter',500);
silh = silhouette(bonds,kidx,dist_k);
silh_m(i) = mean(silh);
end
%绘制各类别数对应的平