ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

正交表构造、正交性校验与极差分析:L9(3⁴)试验设计实战

正交表构造、正交性校验与极差分析:L9(3⁴)试验设计实战 简介《正交表构造方法PPT课件》面向需要开展多因素实验设计的科研人员、工程师与高校师生尤其适合统计学基础薄弱、希望快速上手的实践者。课件系统梳理正交试验设计的基本思想讲清正交表记号 Ln(ji) 中各符号含义、整齐可比性与均衡分散性两大正交性准则、混合型正交表的识别方法并串起因素与水平确定、选表、安排试验、数据分析到验证优化这一完整流程并以三因素三水平实例说明正交表如何大幅压缩试验量。资源包仅1个pptx文件、约440KB共36页依导入、原理、记号、正交性到案例的顺序编排可直接用于课堂讲授或自学。目前已有79人学习。读者据此能掌握选表逻辑与结果分析思路在质量控制、工程优化、生物医学与化学实验等场景中有效压缩试验次数。1. 3³ 试验要跑 27 次L9(3⁴) 只跑 9 次——省下的 18 次靠什么补回来拿到「正交表构造方法」这份课件多数人的第一反应是把 L9(3⁴) 那张九行四列的表背下来背完发现没什么用换个因素数、换个水平数表就得换一张。真正值钱的东西不是某张具体的表而是这张表为什么长这样——行数怎么定、列数怎么算、哪些列能放因素、哪些列必须空着当误差。一次三因素三水平的试验全面铺开是 3³27 组正交表只让你做 9 组砍掉三分之二。砍掉的不是随便挑的而是让每一列各水平出现次数相等、任意两列的搭配数对出现次数也相等。这两条约束合起来叫正交性是把 27 组压到 9 组的全部依据。往下按「符号读法 → 表体生成 → 正交性校验 → 三因素三水平落地 → 混合水平与交互作用」的顺序推每一步都配上能直接跑的代码和能直接查的表。2. 读懂 Ln(j^i)行数、水平数与列数怎么对上2.1 符号四个位置各管什么正交表的记号 Ln(j^i) 拆开看是四个位置L 是正交表代号n 是行数也就是试验次数j 是每一列里的数码种类也就是水平数i 是列数也就是最多能排的因素个数把交互作用列和空列都算在内。各列水平数相同时写成 Ln(j^i)各列水平数不同时写成一串乘积比如 L8(4¹×2⁴) 表示 8 行、第 1 列 4 水平、后面 4 列各 2 水平。课件的例子里给了 L9(3⁴)9 次试验每列 3 个水平4 列全面组合数是 3⁴81等于从 81 种搭配里挑了 9 种。同一页还出现了 L18(3⁷) 的写法这里要留个心——标准表是 L18(2¹×3⁷)18 行里第 1 列 2 水平、后 7 列 3 水平。判断依据很简单行数如果不是水平数的整数次幂基本可以断定它是混合水平表或部分追加设计。行数 n 的取法有规律。等水平表里 nj^kk 取整数二水平表行数是 4、8、16、32三水平表是 9、27、81四水平表是 16、64。想要 12 行或 20 行的等水平表不存在。表号行数 n水平数 j列数 i全面组合数 j^iL4(2³)4238L8(2⁷)827128L9(3⁴)93481L16(4⁵)16451024L27(3¹³)2731315943232.2 列数不等于能排的因素数L8(2⁷) 有 7 列直觉上能排 7 个二水平因素。真这么做就叫饱和设计7 列全占满一行不剩误差自由度为零方差分析做不下去只能靠极差粗判。L9(3⁴) 同理4 列全排满9-18 个总自由度被 4 列 × 2 自由度吃干净。这笔账要用自由度算。一列的自由度 水平数 - 1二水平列 1 个三水平列 2 个四水平列 3 个。表的总自由度 行数 - 1必须等于各列自由度之和。L9(3⁴)4×2 8 9-1。L8(4¹×2⁴)34×1 7 8-1。两条都严丝合缝。排因素时的常见做法是先算因素自由度总和再选一张总自由度明显大于它的表差额留给空列当误差。三因素三水平占 6 个自由度选 L9(3⁴) 正好余 2 个自由度给第 4 列。提示空列的极差 R 值就是误差的量级参照。某个因素列的 R 值和空列 R 值差不多这个因素基本可以判定为不显著。2.3 用代码打印一张 L9(3⁴)标准 L9(3⁴) 的表体不长直接写进代码里最省事# 标准 L9(3^4) 表体每行是一次试验每列是一个因素位 # 第 4 列不排真实因素留作误差估计 L9 [ [1, 1, 1, 1], [1, 2, 2, 2], [1, 3, 3, 3], [2, 1, 2, 3], [2, 2, 3, 1], [2, 3, 1, 2], [3, 1, 3, 2], [3, 2, 1, 3], [3, 3, 2, 1], ] def render(tbl, cols): tbl: 表体二维列表cols: 列名列表 width max(len(str(len(tbl))), 4) # 宽度对齐兼容 9 行和 27 行 print(试验号.ljust(width), *[c.ljust(width) for c in cols]) for idx, row in enumerate(tbl, start1): print(str(idx).ljust(width), *[str(v).ljust(width) for v in row]) render(L9, [A, B, C, 空列])render 接收表体和列名两个参数第一行打表头之后按试验号逐行输出。宽度 width 取试验号位数和 4 的较大值是为了让 9 行和 27 行的表输出时列位一致。列名传 [A,B,C,空列]把第 4 列的用途直接写在表头上比事后翻笔记找哪列空着靠谱。运行结果试验号 A B C 空列 1 1 1 1 1 2 1 2 2 2 3 1 3 3 3 4 2 1 2 3 5 2 2 3 1 6 2 3 1 2 7 3 1 3 2 8 3 2 1 3 9 3 3 2 12.4 混合水平表的读法L8(4¹×2⁴) 这类表括号里乘号左边是 4 水平的列右边是 2 水平的列也就是第 1 列取 1~4、第 2 到 5 列取 1~2# L8(4^1 x 2^4)8 行第 1 列 4 水平第 2~5 列各 2 水平 L8_mix [ [1, 1, 1, 1, 1], [1, 2, 2, 2, 2], [2, 1, 1, 2, 2], [2, 2, 2, 1, 1], [3, 1, 2, 1, 2], [3, 2, 1, 2, 1], [4, 1, 2, 2, 1], [4, 2, 1, 1, 2], ] render(L8_mix, [D, A, B, C, 空列])混合表的水平数不等校验两列之间的数对均衡时不能一律按 j² 去数要按两列水平数之积来数第 1 列 4 水平配第 2 列 2 水平应该有 4×28 种数对每种出现 1 次两个 2 水平列之间是 4 种数对每种出现 2 次。上面这张表里第 1 列取 1 的有两行第 2 列分别落在 1 和 2取 2、3、4 的行同理八种组合各一次干净。3. 正交性校验整齐可比与均衡分散的两种代码验法3.1 两个准则的数学含义整齐可比说的是每一列内部n 行里 j 个字码各出现 n/j 次。L9(3⁴) 每列 1、2、3 各 3 次L8(2⁷) 每列 1、2 各 4 次。这条保证了同一列的各水平是在同等次数下被比较的不会因为某个水平多做两次而占便宜。均衡分散说的是任意两列之间把同行的两个数看成有序数对j² 种数对每种的次数都是 n/j²。L9(3⁴) 里 (1,1)、(1,2)…(3,3) 九种数对各出现 1 次L8(2⁷) 里 (1,1)、(1,2)、(2,1)、(2,2) 四种各出现 2 次。这条保证了两因素之间的各种水平搭配被均匀地试到。两条合起来就是能用 9 次试验去近似代替 81 次的全部理由每个因素的水平被公平地比过每对因素的水平组合被均匀地铺过。这不是抽样是设计。注意整齐可比只保证单列内部的均衡均衡分散只保证两列之间的均衡。三列以上的高阶搭配正交表不做保证也不需要保证。3.2 单列频次校验from collections import Counter def check_balance(tbl): 检查每一列各字码出现次数是否相等整齐可比 n, ncol len(tbl), len(tbl[0]) ok True for c in range(ncol): cnt Counter(row[c] for row in tbl) expect n / len(cnt) # 理论上每列每个字码应出现的次数 n/j flag len(set(cnt.values())) 1 and cnt.most_common(1)[0][1] expect ok flag print(f第{c1}列 {dict(sorted(cnt.items()))} f应出现 {expect:g} 次 {通过 if flag else 不通过}) return ok check_balance(L9)Counter 统计每列各数码的出现次数expect n/j 是理论次数。判据有两层所有次数必须相同而且必须等于 expect。只判“次数相同”不够因为一张抄错但恰好均匀分布的表也能过第一层加上理论次数这道闸才能拦住。L9 的输出是每列 {1:3, 2:3, 3:3}应出现 3 次全部通过。3.3 两列数对搭配校验from itertools import combinations def check_pairs(tbl): 检查任意两列的数对搭配是否均衡均衡分散 ncol len(tbl[0]) for c1, c2 in combinations(range(ncol), 2): cnt Counter((row[c1], row[c2]) for row in tbl) lv1 len({row[c1] for row in tbl}) # 第 c1 列的水平数 lv2 len({row[c2] for row in tbl}) # 第 c2 列的水平数 expect_pairs lv1 * lv2 # 理论上应有的数对种类 expect_each len(tbl) / expect_pairs flag (len(cnt) expect_pairs and all(abs(v - expect_each) 1e-9 for v in cnt.values())) print(f列{c11}-列{c21}: {len(cnt)}/{expect_pairs} 种数对 f每种 {expect_each:g} 次 {通过 if flag else 不通过}) check_pairs(L9) check_pairs(L8_mix)combinations 遍历所有两列组合expect_pairs 取两列水平数之积——对等水平表它就是 j²对混合表自动变成 4×28 这种值代码不用改分支。expect_each 是浮点数所以比较时用 abs(v - expect_each) 1e-9 兜底。L9 会打出 6 组C(4,2)6每组 9/9 种数对、每种 1 次L8(4¹×2⁴) 的前四组第 1 列配后四列是 8/8 种、每种 1 次后六组后四列两两之间是 4/4 种、每种 2 次。3.4 校验不通过时先查什么手抄表体抄错一位是校验不通过最常见的原因尤其是 L18 这类十几行的表第 7、8 行串位很难用肉眼看出来。第二种是拿错了表二水平因素排进三水平表的列里某个数码就永远不出现频次校验立刻报警。第三种是把混合表的水平标号写成了 0 / 1 和其它列的 1 / 2 混着用统计出来是 {0:4, 1:4}次数对但字码不对只查次数是查不出来的。提示把这两个校验函数封装成一个校验脚本每次改表体自动跑一遍比人工核对快得多。4. 三因素三水平试验从水平表到极差分析的完整落地4.1 定因素与定水平课件里的例子是三个因素温度 A 取 80、85、90 ℃时间 B 取 90、120、150 min浓度 C 取 5%、6%、7%。因素可以是定量的也可以是定性的定量因素各水平间的距离可以相等也可以不等。温度这种连续量一般取等距步长取多宽取决于工艺窗口有多窄——窗口窄就取小步长、多设几档。水平的选取有个容易被跳过的前提范围要先圈在「可能有效」的区间里。正交表只负责在给定区间内找最优组合它没法告诉你区间选错了。三个水平如果全落在最优点的同一侧极差分析会给出一个假的最优水平其实是区间的边界。4.2 表头设计与因素上列选 L9(3⁴)A、B、C 依次放第 1、2、3 列第 4 列空着得到完整的试验方案试验号A 温度/℃B 时间/minC 浓度/%空列180905128012062380150734859063585120716851505279090728901205399015061第 4 列写的是 1、2、3它不对应任何真实因素只用来估计误差。因素上列的规则是哪个因素放哪一列可以任意指定但一旦指定就不能中途改。若要考察交互作用主效应因素就不能随便占列得按表的交互作用表来安排这一点在第 5 章展开。4.3 试验实施与数据登记九次试验的顺序不能按表从上往下依次做要随机化。表体的顺序是构造出来的不携带时间信息如果恰好和升温、换料、设备预热这类漂移过程同步误差就会被系统性地分配进某一列。每次试验的结果要连同条件一起记下来整理成下面这种结构再进分析import pandas as pd data pd.DataFrame({ A: [1, 1, 1, 2, 2, 2, 3, 3, 3], B: [1, 2, 3, 1, 2, 3, 1, 2, 3], C: [1, 2, 3, 2, 3, 1, 3, 1, 2], 空列: [1, 2, 3, 3, 1, 2, 2, 3, 1], y: [58, 57, 59, 65, 67, 66, 68, 66, 67], }) print(data)y 是试验指标收率、强度、纯度都行。A、B、C 存的是水平编号而不是真实数值真实数值放在另一张映射字典里这样水平数变化时表体不用改。4.4 极差分析K、k、R 三步def range_analysis(df, factors, yy): 对每个因素做极差分析返回 K 值、k 值和极差 R result {} for f in factors: grp df.groupby(f)[y] K grp.sum() # K 值该水平下 y 之和 k grp.mean().round(2) # k 值该水平下的均值 result[f] {K: K.to_dict(), k: k.to_dict(), R: round(k.max() - k.min(), 2)} return result res range_analysis(data, [A, B, C, 空列]) for f, v in res.items(): print(f{f}: K{v[K]} k{v[k]} R{v[R]})groupby(f)[y].sum() 求每个水平下的指标之和得到 K 值除以该水平下的试验次数得到均值 k 值R 是各水平 k 值的极差。R 越大说明这个因素在所选水平范围内对指标的影响越大。参数 factors 传要分析的列名列表把空列一起传进去才能拿到误差参照。跑出来的结果因素K1K2K3k1k2k3RA17419820158.0066.0067.009.00B19119019263.6763.3364.000.67C19018919463.3363.0064.671.67空列19219119064.0063.6763.330.674.5 结果怎么读先看 R 的排序A 的 9.00 远大于 C 的 1.67 和 B 的 0.67因素主次是 A C B。再看空列的 R 0.67与 B 相同说明 B 的影响已经淹没在误差里可以判定为不显著。优水平的取法是比每个因素各水平的 k 值指标越大越好就取最大A 取 A390 ℃B 取 B3150 minC 取 C37%优组合是 A3B3C3。这个组合在九次试验里并没有直接出现过——九次里没有 A3B3C3——这正是正交表的用途用有限试验推断出没做过的组合。注意推断出的优组合必须做验证试验。极差分析假设因素之间没有交互作用若两个因素存在交互各自优水平简单拼起来未必是最优。5. L8(4¹×2⁴) 与交互作用列选表时最容易翻车的两处5.1 混合水平表的自由度匹配因素水平数不齐时用混合表。假设四个因素其中一个取 4 个水平、另外三个各取 2 个水平总自由度 3 3×1 6行数至少 7取 L8(4¹×2⁴) 正好5 列里用 4 列剩 1 列当误差。如果四个二水平因素再加一个四水平因素自由度 3 4 7L8 刚好被占满变成饱和设计这时该换 L16(4⁵)。混合表里只有水平数相同的列才能直接比 R 值。一个 4 水平列和几个 2 水平列横着比大小是不严谨的因为 4 水平列内部的波动空间本来就更大。跨水平数比较时要么改看方差分析的 F 值要么把 4 水平列拆成几个正交对比再比。5.2 交互作用占列不占因素两个因素之间的交互作用会占掉一列甚至好几列。二水平正交表找交互作用列可以用「列号相加取模」L8(2⁷) 里第 1 列和第 2 列交互占第 3 列123第 1 列和第 3 列交互占第 4 列。三水平表的算法要查表配套的交互作用表不能凭直觉推。排因素时的常见做法是主效应先占前面几列交互作用按表指定的列放放不下就换更大的表。L8(2⁷) 排三个因素加一个交互作用勉强够用排四个因素还想要交互作用就得换 L16。不想纠缠交互作用列这套规则的话换个思路是走混料设计或者响应面设计把交互项当独立列处理代价是试验次数要多一些。5.3 一个能省事的验证技巧最省事的做法是把最后推出来的优组合和另外一两个接近的组合一起做 2~3 次重复试验既验证推断结果又顺手拿到了误差的独立估计。成本很低但能挡住「极差分析给出漂亮结论、实际复现不出来」这种尴尬。更稳一点是把第 3 章那两个校验函数挂到设计表的版本库提交钩子上表体一改就自动跑一遍哪个字码出现次数不对、哪两列数对搭配不均当场报错。行数上到 27、列数上到 13 以后人眼已经核对不动每个字码和每个数对的出现次数了让代码去数比事后发现某个因素水平排错要早得多也便宜得多。本文还有配套的精品资源点击获取
返回列表