由于之前因为一系列不可抗力的原因导致我的国赛的凉了,但是拥有一个国奖梦的我觉得继续加油,于是开始和队友一起准备美赛,现在已经是12月26日了,下一个月的这个时候我应该都在苦逼的想如何对模型进行求解了吧,如果快的话。
利用零星的时间和队友准备了这两个月左右美赛,也就是每周,有时候是两周看一篇O奖论文,由于是双非院校的本科生,所以看这种纯英文的论文确实有一点难度,队里面唯一一个英语不错的同学,数学方面有比较欠缺,所以对我们队伍的未来,我还有点小担心,不过,我相信我们一定会搞好的,毕竟是双非院校的三个学霸,又是计科+英语强强组合,加油加油。
今天总结,也顺便完成田老给我布置的作业了,分析一下2015美赛A题的O奖论文,我这里就拿Team Control NUMBER 32150的论文来做分析(虽然不知道是哪位大佬队伍写的)
首先还是来看看看A题的题目是什么,
总结一下就是几点
- 建立一个模型用来控制埃博拉病毒的疯涨或者直接根除它
- 模型中必须考虑疾病的传播,药品的质量,药品的调度方案,药品的制作速度
- 其他影响模型的因素
32150论文的思路:
首先看到题目,我们就会联想到传染病模型,同样这篇论文也用到了传染病模型。他们首先通过传染病模型建立一个初步的模型,但是不同于最简单的病人-易感人群-移除个体,他们创新的初步模型中添加了潜伏人群。也就是ESIR模型
这里
- S(t)表示t时刻的易感人群
- E(t)表示潜在人群
- I(t)表示感染人群
- R(t)表示死亡人群
- CUM 表示病毒累积量
- γ表示感染率
- sigema表示爆发率
- beta表示流动率
这里在描述beta时他们机智的beta进行了分类分析,有病人人群被控制前,被控制后,这里在控制后beta是呈一个指数函数的趋势的
第二个模型,他们就是在模型1的基础上,添加一些属性,比如把之前的潜在人群细分成了住院人群,医院外部人群等等,并且考虑到死人的病毒传播,病毒追踪等等。
其实到这里才仅仅是全篇论文的12/36,那么后面他们叙述了什么呢?后面他们把某些中的每个参数都拿出来单独分析了一边,有些参数根据其特性可以有多个值,他们的适用情况等等。
拿病死率,即上面模型的来举例:
该论文先药物的问题,考虑药物的需求量和病人总数之间的关系,建立相关模型,并且算出每个地区内的药物需求量。根据药物的需求量以及药物的制造速度进而建立另一个病死率的相关模型,这里D就表示需求量,u就表示生产量,让D>U时,其实病死率应该得到控制,也就是最低
通过知道每个地区的药物需求量,进而进行聚类算法,这里使用的时C均值加权聚类,我也就是根据权重,个每一个点赋予0~1中的任意一个数,具体的请自行看笔记。聚完类之后就可以得到每个地区的病死率,每个地区到疫情发展情况。
、、、、、、、、、、、、、、、、、、、、、、、
总结:
其实这篇论文有很多的发光点值得我这个菜鸡学习,当然也不得不感慨一下,不愧是o将论文。
1.文献检索的能力。按照A题无数据的惯例,选择做A题那么找数据就是这道题难度的一半,谁能找到更多,更准确的数据,以及相关论文那么就已经赢了一半了。而这篇论文从WHO官网上大量的数据中找到自己想要的数据,这点来说值得学习,还有该篇论文引用的论文数量:26
2、虽然我不是负责写论文的,但是也不得不承认他们的论文写得确实有那么点意思,首先是前期调查
这个部分,作者将他们小组能够找到的论文以及论文描述的问题都进行了阐述与归纳,并找出其中对本题有帮助的内容。
接下来是作者在建立自己的模型时所写道的:
在每次提到用的是哪一个模型时,都会讲清楚这是哪个论文中提到,使整篇论文的说服性变的很强
3.加权模糊C聚类算法,了解论文的同时,我也学习到了这个算法。
k均值聚类:一种硬聚类算法,隶属度只有两个取值0或1,提出的基本根据是“类内误差平方和最小化”准则;
模糊的c均值聚类算法:一种模糊聚类算法,是k均值聚类算法的推广形式,隶属度取值为[0 1]区间内的任何一个数,提出的基本根据是“类内加权误差平方和最小化”准则;
这两个方法都是迭代求取最终的聚类划分,即聚类中心与隶属度值。两者都不能保证找到问题的最优解,都有可能收敛到局部极值,模糊c均值甚至可能是鞍点。
K均值和C均值,其实有种C是包含在K中的感觉,C只是特定的实现方式,K均值是广义的概念。
function[center,U,obj_fun]=FCMCluster(data,n,options)
%采用模糊C均值将数据集data分为n类
%用法
% 1 [center,U,obj_fcn]=FCMCluster(data,n,options);
% 2 [center,U,obj_fcn]=FCMCluster(data,n);
%输入
% data n*m矩阵,n个样本数,每个样本的维度为m
% n 类别数
% options 4*1 矩阵
% options(1):隶属度矩阵U的加权指数
% options(2):最大迭代次数
% options(3):隶属度最小变化量,迭代终止条件
% options(4):每次迭代是否输出信息标志
%输出
% center 聚类中心
% U 隶属度矩阵
% obj_fun 目标函数值
if nargin~=2 && nargin~=3
error('Too many or too few input arguments');
end
data_n=size(data,1);
in_n=size(data,2);
%默认参数
default_options=[2;100;1e-5;1];
%参数配置
%如果只输入前两个参数,选用默认的参数;如果参数个数小于4,其他选用默认参数
if nargin==2
options=default_options;
else
if length(options)<4
tmp=default_options;
tmp(1:length(options))=options;
options=tmp;
end
nan_index=find(isnan(options)==1);
options(nan_index)=default_options(nan_index);
if options(1)<=1
error('The exponent should be greater than 1!');
end
end
%将options 中的分量分别赋值给四个变量
expo=options(1);
max_iter=options(2);
min_impro=options(3);
display=options(4);
obj_fun=zeros(max_iter,1);
%初始化模糊分配矩阵
U=initfcm(n,data_n);
%主程序
for i=1:max_iter
[U,center,obj_fun(i)]=stepfcm(data,U,n,expo);
if display
fprintf('FCM:Iteration count=%d,obj_fun=%f\n',i,obj_fun(i));
end
%终止条件判别
if i>1
if abs(obj_fun(i)-obj_fun(i-1))<min_impro
break;
end
end
end
iter_n=i;
obj_fun(iter_n+1:max_iter)=[];
%
end
%%子函数 模糊矩阵初始化
function U= initfcm(n,data_n)
U=rand(n,data_n);
col_sum=sum(U);
U=U./col_sum(ones(n,1),:);
end
%%子函数 逐步聚类
function [U_new,center,obj_fun]=stepfcm(data,U,n,expo)
mf=U.^expo;
center=mf*data./((ones(size(data,2),1)*sum(mf'))');
dist=distfcm(center,data);
obj_fun=sum(sum((dist.^2).*mf));
tmp=dist.^(-2/(expo-1));
U_new=tmp./(ones(n,1)*sum(tmp));
end
%%子函数 计算距离
function out=distfcm(center,data)
out=zeros(size(center,1),size(data,1));
for k=1:size(center,1)
out(k,:)=sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
end
测试用例:
利用加权c均值聚类,初始化2维data,然初始化一列的权重指数
data=rand(100,2);
weigh = unidrnd(10,[100,1]).10;
[center,U,obj_fcn] = FCMCluster(data,4,weigh);
plot(data(:,1),data(:,2),‘o’);
figure;
index1=find(U(1,:)==max(U));%找出划分为第一类的数据索引
index2=find(U(2,:)==max(U));%找出划分为第二类的数据索引
index3=find(U(3,:)==max(U));%找出划分为第三类的数据索引
index4=find(U(4,:)==max(U));%找出划分为第四类的数据索引
plot(data(index1,1),data(index1,2),'g’);
hold on;
plot(data(index2,1),data(index2,2),‘r*’);
hold on;
plot(data(index3,1),data(index3,2),‘y*’);
hold on;
plot(data(index4,1),data(index4,2),‘b*’);
hold on;
plot([center(:,1)],[center(:,2)],’*’,‘color’,‘k’);
实验结果展示:
原数据分布
聚类结果