天天看點

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

年初的新冠疫情來勢洶洶,但好在政府及時控制住,經濟得以恢複正常。疫情發生後,國内外很多研究學者都通過模組化等方法分析了疫情可能導緻的感染人數,下面分享一下通過Matlab的多項式曲線拟合預測新冠病毒感染人數趨勢,結果粗糙,僅僅作為學習。

寫在前言:預測資料基于官方公布的資料,本文隻做一個學術研究,結果僅供參考;

1、資料擷取

為了簡化過程,網上查詢到對應的感染人數。選擇了2020/1/18到2/3日的資料

x1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];      % 累計天數
x2 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];         % 新增天數
y1 = [291,391,440,571,830,1287,1975,2744,4515,5974,7711,9692,11791,14411,17205,20438];  % 累計
y2 = [77,149,131,259,444,688,769,1771,1459,1737,1982,2102,2590,2829,3235];              % 新增           

複制

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

2、資料處理

在後續繪圖的過程中,将橫坐标改為日期的形式,用來表示每天的病例人數,用到了matlab中的月曆類型。

首先,使用datetime函數,指定開始日期:

t1=datetime(2020,1,18);           

複制

由于繪圖時橫坐标需要精确到每天,故将每天的datetime類型通過for循環存入數組:

利用caldays函數進行日期的加減運算。

t1=datetime(2020,1,18);
 
for i = 1:length(x1)
    accumulate = [accumulate t1+caldays(i)];
end
 
for i = 1:length(x2)
    add = [add t1+caldays(i+1)];
end
 
for i=1:33
    date = [date t1+caldays(i)];
end           

複制

這樣,使用第二段代碼中data這個數組作為橫坐标就能繪制日期橫坐标的圖了。

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

3、模型建立——多項式拟合

3.1、多項式拟合原理和本文說明

多項式拟合是用一個多項式展開去拟合包含數個分析格點的一小塊分析區域中的所有觀測點,得到觀測資料的客觀分析場。展開系數用最小二乘拟合确定。

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

多項式拟合,将一組資料盡可能的映射到一個多項式函數上,反映這一組資料之間的一個函數關系。故可以使用多項式拟合方法對于資料的未來走向進行一定程度上的預測。

對多項式進行曲線拟合可以使用polyfit函數,該函數能夠很好地進行曲線拟合,用法MATLAB程式代碼為:

p =polyfit(x,y,n)           

複制

其中,x為橫坐标,在本文中,為自2020-01-18開始的天數(1代表2020-01-19,以此類推),y為縱坐标,在本為中,為自2020-01-18開始每日的累計感染人數。

n為拟合的多項式次數。

3.2、拟合次數n的選取

在本文中,n=4,即多項式的最高次數為4。選取原因如下:

1、一次、二次、三次函數單調性太過明顯,線性和指數級别的單調增加不能良好反映疫情的發展狀況;

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數
4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

2、五次以上的拟合情況,結果如下:

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數
4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

據分析,n=3時,單調遞增顯然不符合疫情發展趨勢,n=5和6時結果太誇張。

是以3、5、6和更高次的拟合都不符合目前的實際情況。

當n=4時:

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

在四次多項式拟合中疫情出現了拐點,雖然在拐點之後,函數是單調遞減的,但是結合目前國家的大力防控措施,可以姑且認為四次多項式在拐點之前的增長是具有一定參考價值的。

拟合代碼實作如下(使用polyval函數預測每日感染人數):

order = 4;
p1 =polyfit(x1, y1, order);      % 累計 四次函數
p2 =polyfit(x2, y2, order-1);      % 新增是累計的一階導數 三次函數
add_new = polyval(p2,day_num); % 預測的新增
total = polyval(p1,day_num); % 累計           

複制

畫圖函數實作如下:

figure
plot(date,total,'r')
hold on;
plot(date,add_new,'b')
hold on;
plot(accumulate, y1, '*')
hold on;
plot(add, y2, 'o')
grid on;           

複制

4、資料分析與預測

通過将1月18日統計資料開始後的天數代入函數,使用polyval函數計算每日的感染人數,并繪制圖像

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

由此分析,疫情将在2月15日至2月20日期間出現“拐點”,即累計感染人數顯著降低。

4.算法類(1) --Matlab多項式曲線拟合預測新冠病毒感染人數

代碼全文:

clc
clear
close all
x1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];      % 累計天數
x2 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];         % 新增天數
y1 = [291,391,440,571,830,1287,1975,2744,4515,5974,7711,9692,11791,14411,17205,20438];  % 累計
y2 = [77,149,131,259,444,688,769,1771,1459,1737,1982,2102,2590,2829,3235];              % 新增
figure
plot(x1,y1,x2,y2)
xlabel 天
ylabel 人數
legend('累計人數','新增人數')

accumulate = []; % 累計和新增天數橫坐标
add = [];
date = []; % 累計和新增天數橫坐标
day_num = 1:33; % 預測的天數;

t1=datetime(2020,1,18);
 
for i = 1:length(x1)
    accumulate = [accumulate t1+caldays(i)];
end
 
for i = 1:length(x2)
    add = [add t1+caldays(i+1)];
end
 
for i=1:33
    date = [date t1+caldays(i)];
end
figure
plot(accumulate,y1,add,y2)
xlabel 天
ylabel 人數
legend('累計人數','新增人數')

order = 4;
p1 =polyfit(x1, y1, order);      % 累計 四次函數
p2 =polyfit(x2, y2, order-1);      % 新增是累計的一階導數 三次函數
add_new = polyval(p2,day_num); % 預測的新增
total = polyval(p1,day_num); % 累計

figure
plot(date,total,'r')
hold on;
plot(date,add_new,'b')
hold on;
plot(accumulate, y1, '*')
hold on;
plot(add, y2, 'o')
grid on;
% title('拟合次數為4')           

複制

最後祝各位讀者朋友2020遠離疾病、遠離災難,平安渡過2020