close all;
clear all;
data = xlsread('工作簿数据.xlsx','sheet2','g2:g106556'); %读入数据
%测试数据 data = lognrnd(8,.7,10000,1);
[y x]=hist(data,200); %统计频次分布
h=bar(x,y,1); %画直方图
hold on;
%对数正态分布密度函数
fun=@(p,x) p(1)./x.*exp(-((log(x)-p(2))/p(3)).^2/2);
%A=p(1),mu=p(2),sigma=p(3)
[maxy ind]=max(y);
%做非线性数据拟合
p=nlinfit(x,y,fun,[maxy*x(ind),log(x(ind)),1]);
%画拟合曲线
x1 = min(x):0.01:max(x);
yfit=fun(p,x1);
plot(x1,yfit,'r','linewidth',1);
%极大似然处 x=exp(mu-sigma^2);
xmax=exp(p(2)-p(3)^2);
ymax=fun(p,xmax);
plot([xmax xmax],[0 ymax],'g','linewidth',2);
%期望值处 x=exp(mu+sigma^2/2)
xmean=exp(p(2)+p(3)^2/2);
ymean=fun(p,xmean);
plot([xmean xmean],[0 ymean],'c','linewidth',2);
xlim([min(x) max(x)]);
xlabel('BC浓度(ng/m^3)');
ylabel('频数');
legend('统计数据',['对数正态分布:\mu=' num2str(p(2)) ',\sigma=' num2str(p(3))],...
['极大概然分布位置:x=' num2str(xmax)],['期望值位置:x=' num2str(xmean)]);
text(xmean+10000,ymean+10,'$ y=\frac{A}{x}e^{-\frac{(lnx-\mu)^2}{2\sigma^2}} $',...
'interpreter','latex','FontSize',18);
追问大神好厉害啊,请问能用matlab对拟合效果进行检验吗
追答logn_cdf=[data, cdf('logn',data,8,.7)];% 求累计概率
H0:符合指数分布
h= kstest(data,logn_cdf) %缺省alpha=0.05
h=0:不能拒绝H0,
追问大神,得不出来检验效果啊
追答你的数据不是指数分布的吧
追问数据看趋势是符合对数正态分布的吧,而且我的样本比较大,有十几万条,我现在主要想对拟合效果进行检验,看看数据是否符合对数正态分布。我看别人说大数据样本用ks检验误差大,要随机抽取数进行检验。