
简介Matlab概率论与数理统计分析学习包面向需要把概率统计理论转化为编程实践的高校学生、考研复习者及科研入门人员重点解决数据处理、统计建模、随机过程模拟中“会看公式但不会用工具”的痛点。压缩包共15个文件其中14个为.m格式的Matlab源码1个为PDF说明文档整体大小41.36MB源码可直接运行、修改PDF便于对照理解原理与操作流程。内容覆盖概率分布计算、随机数生成、蒙特卡洛模拟、联合分布与条件概率、描述性统计、参数假设检验、线性与非线性回归、方差分析ANOVA等主题并示范直方图、箱线图、PDF/CDF曲线等可视化方法帮助读者把每个统计概念落到具体代码和图表上。已有1706人学习下载无论是课堂同步练习、期末复习还是课题前期探索都能借助这套脚本和讲义快速搭建分析思路减少从公式到实现的摸索成本。1. Matlab概率论与数理统计分析从样本到统计推断的最后一公里概率论与数理统计这门课最尴尬的地方在于公式推导都能看懂一到手头有几百个实验数据就卡住了——不知道该拟合哪个分布、检验统计量怎么算、置信区间到底谁说了算。Matlab概率论与数理统计分析这个方向解决的就是这条从样本到结论的链路数据进 MATLAB依靠最大似然估计把分布参数定下来用假设检验判断组间差异是否显著再用回归或方差分析解释变量之间的关系。真正频繁使用这些功能的往往不是统计学家而是做信号处理、可靠性测试、量化回测和实验数据处理的工程师。与其翻着 matlab 教程按函数名逐个试不如先把这条链路完整走通。下面按建分布、做检验、建模型、验证流程四步展开每段代码都能直接粘贴改参数复现。2. 概率分布拟合Matlab 里从样本到分布参数的完整链路数理统计的第一步不是急着画图而是把样本映射到某个理论分布上。分布选错后面所有检验的 p 值都没有意义。MATLAB 的 Statistics and Machine Learning Toolbox统计与机器学习工具箱把分布建模收敛为一条对象化接口fitdist 负责从样本估参数makedist 负责按参数造分布然后所有计算都走 pdf、cdf、icdf、random 四个方法。2.1 fitdist 与 makedist先用最大似然把参数估出来fitdist 做的是最大似然估计MLE给定分布族找一组参数让当前样本出现概率最大。它接收原始样本和分布名字符串返回一个概率分布对象而不是散装的参数向量。以 MATLAB 自带的考试成绩数据为例% 读取 MATLAB 自带成绩数据并展成一列 load(examgrades.mat); scores grades(:); % 120x5 的矩阵展成 600 个样本 % 用正态分布做最大似然拟合 pd_norm fitdist(scores, Normal); mu_hat pd_norm.mu; % 均值估计 sigma_hat pd_norm.sigma; % 标准差估计 % 用拟合结果画概率密度图直方图归一化为概率密度 histogram(scores, Normalization, pdf); hold on; x 0:0.1:100; plot(x, pdf(pd_norm, x), LineWidth, 2); hold off;逻辑说明load 加载工具箱自带的 examgrades.matgrades 是 120 行 5 列的成绩矩阵直接展平得到 600 个观测。fitdist 返回的 pd_norm 是一个 ProbDistUnivParam 对象mu 和 sigma 只是它的公开属性真正有用的是挂载在对象上的方法。histogram 里的 Normalization,pdf 参数把频数直方图归一化成概率密度让直方图和拟合曲线画在同一张图里量纲一致——这是 matlab 画图里最常被忽略的一处设置省掉它曲线会被频数坐标压成一条扁平的线。参数说明fitdist 的第二个参数支持 Exponential、Weibull、Lognormal、Poisson、Binomial 等二十多种内置分布切换分布只需替换分布名。MLE 对样本量敏感每组数据少于 30 个时参数估计方差会被放大此时与其信任某个理论分布的强假设不如结合经验分布函数ecdf一起看。2.2 pdf、cdf、icdf、random一个分布对象怎么算四种量分布对象的好处在于四个操作被统一了换分布不动调用代码。pdf 给密度值cdf 给累积概率icdf 是 cdf 的反函数random 按分布生成样本。先记住常用分布的构造参数才不会在写 Weibull 时把尺度参数和形状参数填反。分布名makedist 关键参数典型场景Normalmu, sigma测量误差、加性噪声Exponentialmu无记忆性的等待时间WeibullA尺度, B形状寿命与可靠性数据Lognormalmu, sigma对数值浓度、股价等右偏数据Poissonlambda单位时间事件计数BinomialN, p固定次数成功数t 分布nu自由度小样本均值推断% 构造威布尔分布对象尺度参数 10形状参数 2 pd_w makedist(Weibull, A, 10, B, 2); % 反向查分位数可靠度 0.9 对应的寿命 t_90 icdf(pd_w, 0.9); % 生成 1000 个随机样本供后续蒙特卡洛验证使用 samples random(pd_w, 1000, 1); % 一次取多个分位数用于构造 Q-Q 图的参考线 qs icdf(pd_w, [0.05 0.5 0.95]);逻辑说明makedist 直接按参数构造分布不需要样本这在做仿真时比 fitdist 更常用。icdf 解决的是给定概率反推阈值这类问题可靠性分析里的 B10 寿命累计失效 10% 对应的时间点就是 icdf(pd_w, 0.1)。random 第二个参数是输出尺寸给出 [1000, 1] 生成 1000 行 1 列的向量供后续模拟复现。参数说明Weibull 的 A 是尺度参数B 是形状参数B 小于 1 时失效率随时间递减B 大于 1 时递增——这块填反会导致拟合出的寿命分布形状完全错误。Lognormal 里的 mu 和 sigma 是取对数之后的均值和标准差不是原始数据的均值和标准差新手常在这里栽跟头。2.3 chi2gof、kstest 与概率图怎么判断分布选没选错拟合完必须回答一个问题这个分布真的解释得了数据吗卡方检验chi2gof和 Kolmogorov-Smirnov 检验kstest是两条常见路线但两者对参数估计的处理不同混用容易得出错误结论。% 卡方拟合优度检验原假设是样本服从该分布 [h_c, p_c] chi2gof(scores, CDF, pd_norm, NParams, 2); % KS 检验正态分布且参数未知时优先用 Lilliefors 修正版 [h_l, p_l] lillietest(scores); % 概率图比检验更直观的尾部诊断 probplot(pd_norm, scores);逻辑说明chi2gof 会把数据分箱再比较频数CDF 参数传分布对象即可但必须用 NParams 告诉它已经从同一份数据里估了 2 个参数均值和标准差否则自由度算错p 值虚高——这是 chi2gof 最隐蔽的坑。kstest 对正态分布且参数由样本估计的场景不适用因为原假设分布被数据污染了此时要换成 lillietest它内部做了 Lilliefors 修正。probplot 生成 Q-Q 图如果散点明显偏离参考线即使 p 值没拒绝也该怀疑分布选型。顺带一提想算一维数据的信息熵MATLAB 没有现成函数但可以把分布估计的思路接上用 histcounts 取概率再套香农公式。p histcounts(x, Normalization, probability); p p(p 0); H -sum(p .* log2(p));这段的本质就是先用经验分布逼近真实分布再计算熵值。拟合检验里 p 值大于 0.05 只能说没有证据拒绝不能反过来说数据一定服从该分布样本量越大检验越容易拒绝轻微偏差所以大样本下要结合概率图看偏差是否落在工程可接受范围内。3. 假设检验与置信区间Matlab 里检验函数怎么选才不翻车假设检验的代码只有几行真正考验人的是选型。选错检验函数最直接的后果是 p 值偏小、虚假的显著性结论满天飞。选择顺序我一般这样走先看数据是否正态、方差是否已知再看是单样本还是两组比较最后决定用参数检验还是非参数检验。下面按这个顺序把 MATLAB 里的核心函数过一遍。3.1 ztest 与 ttest方差已知还是未知决定第一个分岔路总体方差已知用 z 检验未知用 t 检验。现实数据里已知的情况极少除非你有历史长期积累的总体标准差否则默认走 ttest。两者在 MATLAB 里的调用形式几乎一样。rng(42); % 固定随机种子保证复现 data 5 2.5 * randn(200, 1); % 模拟均值 5、标准差 2.5 的样本 % 总体方差已知例如来自历史大量样本走 z 检验 [h_z, p_z, ci_z] ztest(data, 5, 2.5, Alpha, 0.05); % 总体方差未知走 t 检验绝大多数实际数据走这条 [h_t, p_t, ci_t, stats_t] ttest(data, 5, ... Alpha, 0.05, Tail, both);逻辑说明ztest 的第三个参数是已知的总体标准差 2.5ttest 不需要这个参数因为它用样本标准差替代并自动修正自由度。输出里 h 是拒绝结论1 拒绝原假设0 不拒绝p 是显著性概率ci 是均值置信区间。stats_t 里带 tstat 和 df 字段写报告时这两个值要单独提出来。Alpha 默认 0.05改成 0.01 会得到更宽的置信区间和更保守的结论。参数说明Tail 参数有三个取值both 是双侧检验原假设是均值等于 5right 对应均值大于 5的单侧检验left 相反。单侧检验的 p 值大约是双侧的一半但必须事先根据业务方向确定不能看了双侧结果再回头挑单侧那是自欺欺人。两组均值比较时把 ttest 换成 ttest2两个样本长度不同没关系但要留意默认假设两组方差相等不确定时先做下面的方差齐性检验。3.2 vartest、vartest2 与 vartestn方差齐性检验的组合t 检验和方差分析都假设各组方差齐性这个前提一旦不满足自由度修正方式就得换。MATLAB 提供三个层次vartest 做单样本方差检验vartest2 做两样本方差比较vartestn 做多样本方差齐性检验。% 造两组方差不同的样本 x1 normrnd(10, 2, 50, 1); x2 normrnd(10, 3, 50, 1); % 两样本方差是否相等原假设是方差相同 [h_v, p_v] vartest2(x1, x2); % 多样本方差齐性Levene 修正对正态偏离更稳健 grp [ones(30,1); 2*ones(30,1); 3*ones(30,1)]; [h_vn, p_vn] vartestn([x1(1:30); x1(1:30)1; x2(1:30)], grp, ... Test, LeveneQuadratic);逻辑说明vartest2 默认做 F 检验对正态性敏感样本偏离正态时 F 检验会误报。vartestn 的 Test 参数可以切换方法BrownForsythe 是默认值使用绝对中位数差对重尾分布更稳LeveneQuadratic 使用平方偏差适合对称分布OBrien 对偏态数据更鲁棒。多样本检验之前先目测各组方差差距超过 3 倍时基本不用等检验结果就能判断不齐。参数说明vartest 的第二参数是待检验的方差值注意不是标准差。比如想验证标准差等于 2要传 4 给 vartest。方差齐性检验本身也是假设检验小样本下功效很低没拒绝不意味着方差真的相等组间样本量差异大时尤其要谨慎。3.3 非正态小样本ranksum、kstest2 与置换检验数据不满足正态性或者样本量小到没法验证正态性就用非参数检验。ranksum 对应两独立样本的 Wilcoxon 秩和检验kstest2 是双样本 KS 检验前者关注位置差异后者关注分布形状整体差异两者回答的问题不一样。% 非正态数据两组秩和检验原假设是中位数相等 [h_r, p_r, stats_r] ranksum(x1, x2, Tail, both); % 双样本 KS检验两组是否来自同一分布 [h_ks, p_ks] kstest2(x1, x2);逻辑说明ranksum 把两组数据混合排序用秩次替代原始数值对离群值不敏感但前提是两组分布形状大致相同它检验的其实是位置偏移。如果方差差异明显ranksum 会把方差差异也误判成中位数差异。kstest2 比较两条经验 CDF 的最大距离对分布形状敏感但拒绝后不告诉你差异在哪里。样本量极小比如每组 5 个时精确 p 值比近似更可信ranksum 默认在小样本下自动算精确 p也可以用 Method,exact 强制。小样本连非参数检验的理论分布都站不住时我一般直接用置换检验permutation testMATLAB 写起来不复杂rng(1); B 5000; n numel([x1; x2]); n1 numel(x1); obs_diff abs(mean(x1) - mean(x2)); pool [x1; x2]; perm_stat zeros(B, 1); for k 1:B idx randperm(n, n1); perm_stat(k) abs(mean(pool(idx)) - mean(pool(setdiff(1:n, idx)))); end p_perm (sum(perm_stat obs_diff) 1) / (B 1);逻辑说明置换检验的核心思路是把组别标签打乱重算统计量看真实观测差异在置换分布中的位置。加 1 的分子和分母起到拉普拉斯平滑作用避免 p 值恰好为 0。B 取 5000 在多数场景下足够p 值的标准误差约为 sqrt(p(1-p)/B)5000 次迭代能把误差压到 1% 以内。置换检验不依赖任何分布假设代价是计算量数据量大时可以把 for 循环改成 parfor 并行加速。4. 相关性、回归与方差分析Matlab 里的统计建模三件套假设检验回答的是有没有差异接着要回答变量之间什么关系相关分析看关联强度回归建模看定量影响方差分析看分组效应。这三者在 MATLAB 里由 corrcoef、fitlm、anova1 三个入口承接参数设置各有讲究。4.1 corrcoef 与 Spearman相关矩阵与显著性输出corrcoef 一次计算多个变量两两之间的皮尔逊相关系数同时输出每个相关系数对应的显著性概率。皮尔逊相关假设线性关系和近似正态遇到单调但非线性的关系要换 Spearman 秩相关。rng(7); x (1:100); y 3 * x randn(100, 1); % 强线性关系 z sin(x / 10) 0.2 * randn(100, 1); % 非线性关系 data [x, y, z]; % 皮尔逊相关矩阵与显著性 [R, P] corrcoef(data); % 秩相关对非线性单调关系更鲁棒 R_sp corr(data, Type, Spearman);逻辑说明R 的对角线恒为 1第 i 行第 j 列是变量 i 和 j 的相关系数。P 矩阵对应位置是该相关系数的显著性 p 值原假设是相关系数为 0。P 矩阵的陷阱在于它只做两两检验没有做多重比较校正变量一多靠 p 值挑显著相关的做法会把随机噪声误判成规律。corr 函数里 Type,Spearman 把数据折算成秩次再算相关能看到皮尔逊相关看不出来的单调趋势上面例子中 z 与 x 的皮尔逊相关接近波动Spearman 结果更能反映整体趋势。参数说明corr 还支持 Type,Kendall适合有序分类变量。存在第三个混杂变量时相关系数会虚高此时用 partialcorr 控制协变量partialcorr([x y], z)计算控制 z 之后 x 和 y 的偏相关。相关不等于因果这句话在报告里写一百遍也不为过但偏相关至少能把已知的混杂因素剥离掉一部分。4.2 fitlm 与 stepwiselm线性回归的系数表与残差诊断拟合线性回归在 MATLAB 里用 fitlm 一行完成难点在于读结果系数表里每个字段对应什么、哪种残差图说明模型失效。fitlm 支持公式语法也可以直接传设计矩阵两类输入写法不同。% 用设计矩阵拟合y 对 x1、x2 的线性回归 X [x, z]; y 3 * x 0.5 * z randn(100, 1); mdl fitlm(X, y); % 显示完整系数表 disp(mdl); % 一次输出四个残差诊断图 plot(mdl); % 对新的观测做预测同时给出预测区间 newX [101, 0.3]; [yhat, yci] predict(mdl, newX);逻辑说明拟合结果里最重要的是 Coefficients 表的四列Estimate 是系数估计值SE 是标准误tStat 是 t 统计量pValue 是显著性。一个常见误读是只看 pValue 小于 0.05 就宣布变量显著正确做法是先看 Rsquared.Adjusted 判断整体解释力再用 plot(mdl) 出的诊断图检查残差。四张图的顺序是固定的第一张残差对拟合值理想状态是随机分布没有喇叭形第二张是残差的正态概率图偏离直线说明残差不正态第三张直方图辅助判断第四张杠杆值图用来找异常点。残差出现明显趋势说明线性模型结构不对不是调整优化器能解决的——非线性最小二乘要找 matlab 优化工具箱里的 lsqnonlin那是另一套建模路径。参数说明fitlm 的第三个参数支持公式对象比如 y ~ x1 x2改成 y ~ x1*x2 会自动加入交互项和主效应。变量很多时用 stepwiselm 做逐步回归stepwiselm(X, y, Criterion, BIC)按信息准则筛选变量BIC 准则比 AIC 惩罚更重选出的模型更简洁。predict 的第二个参数是行向量新数据要和训练数据列数严格对应预测区间 yci 包含的是均值估计的不确定性不是未来单点观测的区间写报告时别混用。4.3 anova1 与 multcompare多组均值比较的完整流程方差分析回答多组均值是否完全相同但原假设被拒绝后只知道至少有一组不同不知道差在哪两组需要 multcompare 做两两事后比较。% 三组样本均值分别为 5、6、5.5 g1 randn(30, 1) 5; g2 randn(30, 1) 6; g3 randn(30, 1) 5.5; groups [g1; g2; g3]; grp [ones(30,1); 2*ones(30,1); 3*ones(30,1)]; % 单因素方差分析 [p_a, tbl, stats_a] anova1(groups, grp); % Tukey 事后比较给出每对组别的差异置信区间 [c, m, h] multcompare(stats_a);逻辑说明anova1 的第一个输出 p 小于 0.05 说明组间均值存在显著差异tbl 是标准的方差分析表包含组间平方和、组内平方和与 F 统计量。multcompare 的 c 矩阵六列分别是组 A 编号、组 B 编号、差异下界、差异估计、差异上界、p 值。若第三列和第五列同号不跨 0说明该组差异显著GUI 图形界面上会用不同颜色标出显著差异的组。画图窗口的横线如果都和参考线相交说明没有显著差异。参数说明anova1 的默认假设包括独立性、正态性和方差齐性正态性可以用 3.1 的 lillietest 逐组验证方差齐性用 3.2 的 vartestn 验证。不满足时改用 Kruskal-Wallis 检验kruskalwallis 函数它是非参数版本的 one-way ANOVA。如果分组本身未知可以先用 kmeans 聚类算法把样本分成若干簇再做组间差异检验——这是实验数据预处理里的标准动作但聚类得到的组别和业务定义的组别在统计解释上不是一回事写结论时要区分。5. 用蒙特卡洛验证置信区间覆盖率一个比读 p 值更可靠的收尾技巧p 值回答的是这一次实验里原假设是否荒谬它回答不了我这套统计流程整体靠不靠谱。置信区间覆盖率是验证流程本身的手段如果置信区间声称 95% 覆盖真实参数那在大量重复实验里它应该大约 95% 的时间真的覆盖到。这类验证用蒙特卡洛模拟在 MATLAB 里做非常顺手因为 random 函数已经把各种分布的样本生成接口统一了。5.1 检验 t 区间在正态假设下的经验覆盖率mu 3; sigma 1.5; n 30; B 2000; cover false(B, 1); for k 1:B smp normrnd(mu, sigma, n, 1); [~, ~, ci] ttest(smp, mu); cover(k) (ci(1) mu) (ci(2) mu); end empirical_cov mean(cover); % 覆盖率的蒙特卡洛标准误差 mc_se sqrt(empirical_cov * (1 - empirical_cov) / B);逻辑说明每次迭代抽 30 个正态样本用 ttest 构建均值置信区间然后检查真实均值 3 是否落在区间内。B 取 2000 次时95% 覆盖率对应的标准误差约 0.5 个百分点所以 empirical_cov 落在 0.94 到 0.96 之间都算正常。如果理论分布和验证分布不一致——比如真实数据是偏态分布而流程里强套 t 区间——覆盖率会明显偏离 0.95这个方法能把模型误设暴露出来。5.2 用 bootstrap 区间兜底和种子复现样本量不足或分布不确定时参数置信区间可以换 bootstrap 重采样区间bootci 默认给出多种构造方式BCa偏差校正加速对偏态数据的区间更准确。rng(1); % 待估参数样本中位数 bootfun (s) median(s); % BCa 法构建 95% bootstrap 置信区间 bci bootci(5000, {bootfun, smp}, Type, bca);逻辑说明bootstrap 的思想是把观测样本当作总体有放回地反复重采样每次重算统计量从经验分布中取分位数作为区间端点。Type 参数可选 norm、per、cper、bca、student其中 per 是朴素百分位法bca 额外修正偏差和偏度是多数统计教科书推荐的默认选择。实际项目里可以同时输出 per 和 bca 两组区间若差别悬殊说明统计量对样本敏感这时候结论应该写得保守。整套验证脚本第一行固定写 rng(1) 或 rng(42)把随机种子写进脚本头蒙特卡洛覆盖率结果才能被同事原样复现否则每次运行数字都在跳没法作为交付依据。本文还有配套的精品资源点击获取