美赛2023C练习-做题笔记
代码:
clc;
load("data.mat");
save("data.mat");
TC=ProblemCDataWordle;
%数据处理
noC=TC(:,1);
wordC=TC(:,2);
dataC=TC(:,3:11);
no=cell2mat(noC);
data=cell2mat(dataC);
L=size(wordC);
L=L(1);
word=[];
%原表格有错误,根据网络数据进行修正
wordC{36}="clean" ;
wordC{247}="trash";
data(32,1)=22569;
%修正end
wordnum=zeros(L,5);
for i=1:L
str=char(wordC{i});
num=0;
for j=1:5
num=num*100;
num=num+str(j)-'a'+1;
wordnum(i,j)=str(j)-'a'+1;
end
word=[word;num];
end
Hp=data(:,2)./data(:,1);
Players=data(:,1);
ana=data(:,3:7);
%数据处理完毕
%plot(no,Players);
X=[no no.*no no.*no.*no no.*no.*no.*no no.*no.*no.*no.*no no.*no.*no.*no.*no.*no...
exp(no) exp(no.*no) log(no) log(no).*log(no) ...
exp(no).*log(no)];
y=Players;
%stepwise (X,y);
%R方=0.985990约等于0.986 调整后R方=0.985711 完全通过F检验
%x1 x2 x3 x4 x5 x9 x10都极强的通过p检验
%y=-298444e+10+54082223.7047499*no-70804.0624355989*no.^2+81.2251478254803*no.^3
% -0.0581796757825891*no.^4+1.87254597040691e-605*no.^5+14792650464.3214*log(no)
% -2033287277.42065*log(no).*log(no)
close all;
gy=fun1(no);
%plot(no,gy);
hold on;
%scatter(no,Players);
%scatter(no,(gy-y)/y);
e=flip(gy-y);
ds=[];
ebar=[];
for i=1:L
de=e(i:L,1);
newebar=sum(abs(de))/(L-i+1);
newds=sqrt(sum(de.*de)/(L-i+1));
ds=[ds;newds];
ebar=[ebar;newebar];
end
hold on;
%scatter(202:201+L,ds);
%scatter(202:201+L,ebar);
%全过程方差10521,后半段方差2735.81
%
newX=X(:,[1 2 3 4 5 9 10]);
%后来又尝试加入了各种函数,但多余变量的加入什么也没改变,说明原模型已经非常好了,或者说没有改进空间了。只有加入exp(-no)的时候带来了微弱的提升,但没什么用就不管了
%stepwise(newX,y);
%model=fitlm(newX,y)
% ci=coefCI(model)
% 不懂fitlm为什么算出来的和stepwise不一样,不管了,反正stepwise也提供置信区间
%
% stepwise提供的置信区间
% 45542572.6802495 62621874.7292504
% -83037.1825962702 -58570.9422749276
% 65.9332107876828 96.5170848632777
% -0.0700610194043316 -0.0462983321608466
% 1.45963099050699e-05 2.28546095030684e-05
% 12719524815.9227 16865776112.7201
% -2325793821.44112 -1740780733.40019
% 经过调查,发现这是回归系数的95%置信区间...而不是函数值的
%fun1(540)=20838
%自由度为 n - p - 1,其中 n 是样本量,p 是自变量的数量。因此自由度极大,此时t分布近似于标准正态分布
%标准误差是残差的标准差,上下浮动曲线是对应的分位数乘以标准误差
%95%置信水平在正态分布中对应的分位数是1.96,所以对应浮动量是20621.16、5362.1876,这个太恐怖了
%80%置信水平则是对应1.28,这个也太恐怖了
%那就专门针对后半段建立拟合曲线,标准差近似为2735.81
%因此,在95%置信水平中,[15476,26200].置信区间的中值为20838
%scatter(no,(gy-y)./y);
averagee=sum((gy-y)./y)/L;
%误差率为0.0237816360614148,不如20838±2.378% 即[20342,21334]
%model=fit(newX(:,1),y,"exp2");
%根据观察误差百分比图,我们发现误差百分比随时间没有表现出任何趋势,和时间的相关性也几乎没有,可以认为这是一个靠谱的拟合
%此前随时间表现出差异的残差一方面是没转化为残差百分比,另一方面是有一个异常数据,教训是以后做题前、做题后都得更关注异常数据才是
%我们观察到97%的数据点的偏差都落在了±20%的区间内,我们可以说我们至少可以以95%的置信水平预测23/3/1的数据是落在[16670 25006]中,置信区间中值是20838
%n*sin(n/2/pi)
%X=[wordnum exp(wordnum) log(wordnum) wordnum.*sin(wordnum/2/pi)];
%Q1-2
wordnum;
Hp=data(:,2)./data(:,1);
%scatter(no,Hp)
%wordnum->H
X=[wordnum exp(wordnum) wordnum.*sin(wordnum/2/pi)]
%没跑出结果,但 再猜出单词之前玩家就已经决定模式了,那么当天的单词是什么是无法影响玩家的模式选择的。所以答案就是:没有关系。
%愣要说关系的话,我观察到hard率和时间有强相关性。可能随着新玩家更喜欢挑战hard模式,在游戏之间爆火的过程中恰恰随着时间推移新玩家比率不断上升
Diff=(data(:,3)*1+data(:,4)*2+data(:,5)*3+data(:,6)*4+data(:,7)*5+data(:,8)*6)./ ...
(data(:,3)+data(:,4)+data(:,5)+data(:,6)+data(:,7)+data(:,8));
function answer=fun1(no)
answer=-29844369576.6553+54082223.7047499*no-70804.0624355989*no.^2+ ...
81.2251478254803*no.^3-0.0581796757825891*no.^4+0.0000187254597040691*no.^5 ...
+14792650464.3214*log(no)-2033287277.42065*log(no).*log(no);
end