总览 · ← 返回运行 20261001-233756-search-t1-abc-r0-B-population
节点 n31
copy_last(最新官方阶段)+两级增殖重加权抽样(β_type=-4,β_cell=-1)+类型内增殖-表达OLS斜率逐细胞放大(γ=-1.6,|slope|>0.05);本节点实测的dropout零值填补与斜率幅度上界均无效/有害,默认关闭。
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261001-233756-search-t1-abc-r0-B-population |
|---|---|
| 父节点 | n7 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 54.64(+0.1) · proxy 56.97(+0.2) · proxy2 56.97(+0.2) · X3 50.00(+0.0) |
| 审查 | 未审查 |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 13 分 |
| 程序版本 | 3d849813de249bcbe7229031e70dd4cd34fa40e9 (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git 3d849813de:solution/METHOD.md
copy_last(最新官方阶段)+两级增殖重加权抽样(β_type=-4,β_cell=-1)+类型内增殖-表达OLS斜率逐细胞放大(γ=-1.6,|slope|>0.05);本节点实测的dropout零值填补与斜率幅度上界均无效/有害,默认关闭。
方法
基底与父节点7完全相同:
- 取 manifest 中最新的官方输入阶段(外部阶段永不直接当输出;proxy 只有 E8.5,final 用 E9.5)。
- 增殖得分 = 面板内通用细胞周期基因(Mki67/Top2a/Pcna/Cdk1/Ccna2/Ccnb1/Aurkb/Bub1/Cenpf/Nusc1)的均值,全部在输入快照内现场计算。
- 两级 Efraimidis–Spirakis 加权无放回抽样:类型级 w=1+β_type·(type_score−mean),细胞级 w=1+β_cell·(score−type_score),β_type=-4、β_cell=-1。
- 表达调整:每个细胞类型内对每个基因做 expression ~ proliferation 的 OLS 斜率(|slope|>0.05 才用,类型 ≥20 细胞),x_adj = x + (−γ)·slope·(score_i − type_score),clip ≥0。γ=-1.6(本节点在 A 半确认优于父的 -0.8:57.197→57.369)。
- 保护开关:外部来源输入阶段或退化抽样(n_target ≥ 池大小,如 X3)时完全跳过表达调整。
本节点新增(均默认关闭)
IMPUTE_ALPHA/FREQ_MIN:类型内 dropout 零值填补(零 → α·该类型该基因非零均值,仅 freq≥FREQ_MIN 的基因,非零值不动)。实测 α=0.3、FREQ_MIN=0.5 在 proxy A 半总分 46.26(对照 57.20),covariation 从 53.56 崩到 21.03 —— 把零填成同一常数会摧毁细胞间共变结构,de_recovery 只 +0.5(53.0 vs 52.48)完全不抵。放弃。CLIP_MAX:逐基因把调整幅度限制在 CLIP_MAX·类型内标准差。实测 γ=-0.8 时 clip=2.0 与不 clip 逐位相同(约束从不生效);γ=-1.6 时 clip=2.0 → 57.369(=不 clip),clip=1.0 → 57.328,clip=0.5 → 57.235,即越紧越差,covariation 并不因放宽 γ 而受损到需要上界。默认 0(关闭)。- γ=-2.4+clip=1.0 → 56.943(covariation 49.76),确认 -1.6 附近是边界。
查分记录(proxy A 半,seed 0)
| 配置 | board | de_rec | direction | cell_state | covar |
|---|---|---|---|---|---|
| γ=-0.8(父默认) | 57.197 | 52.48 | 59.72 | 61.45 | 53.56 |
| γ=-0.8 + 填补 α=0.3 | 46.256 | 53.00 | 56.76 | 48.70 | 21.03 |
| γ=-1.6, clip=2.0 | 57.369 | 52.48 | 59.76 | 63.31 | 51.59 |
| γ=-1.6, clip=1.0 | 57.328 | 52.48 | 59.76 | 63.15 | 51.62 |
| γ=-1.6, clip=0.5 | 57.235 | 52.48 | 59.77 | 62.76 | 51.73 |
| γ=-2.4, clip=1.0 | 56.943 | 52.48 | 59.70 | 63.15 | 49.76 |
验证过 / 没验证
- 验证:proxy 单视图 6 个配置(上表);proxy2 与 X3 视图能跑通且
vec-check通过(表达调整在两视图上都被保护开关跳过,因此与父节点同输出,X3 应仍为 50.0)。 - 未验证:γ=-1.6 的 B 半与多种子(rank3);final 视图(E9.5 池是否触发退化保护未实测);填补参数未再扫(首个点已判死)。
- de_recovery 在本节点的 6 个配置里恒为 52.48(只有零值填补能撬动它,而填补的代价远大于收益),继续印证全树观察:该组对连续表达值的微调免疫。
生物学知识来源
仅用通用细胞周期/增殖基因功能注释(cell-cycle markers,非阶段特异),无保留阶段或保留基因型的任何测量信息;未读 uns.celltype_palette。
调研员的计划
| 名称 | 类型内dropout零值中位数填补 + 斜率调整幅度上界约束 |
|---|---|
| 动机 | 父节点7四组中 de_recovery 最弱(51.69),且全树7+节点(18/21/22/23/26/28/30)一致表明该组对所有表达级扰动免疫——γ从-0.8到-1.6、SLOPE_MIN从0.05到0.15、PC投影、通路平滑、分解式调整均无法突破51.69。这提示de_recovery的瓶颈不在连续表达值的微调,而在零值(dropout)遮蔽了真实的DE模式:单细胞数据中大量真实表达的基因因技术噪声记为0,copy_last原样保留这些0使预测的DE信号被稀释。同时,父节点covariation 52.88在γ=-1.6子代中降至52.42(-0.46),斜率调整对个别基因的极端位移可能破坏基因间相关结构。两个问题需要不同机制:填补零值针对de_recovery,约束调整幅度针对covariation。 |
| 做法 | 在节点7的run.py上做两处改动,均受外部/退化保护开关控制(is_external或n_target≥池大小时跳过): 【改动1:类型内零值中位数填补(targeting de_recovery)】 在加权抽样选出目标细胞之后、斜率调整之前,对每个细胞类型(≥MIN_TYPE_CELLS=20个源细胞): 1. 在源数据中统计每个基因在该类型内的表达频率 freq_g = (x>0的比例) 和非零中位数 med_g = median(x[x>0]); 2. 对每个被选中细胞i,若 x[i,g]==0 且 freq_g ≥ FREQ_MIN(初值0.5,扫描{0.3,0.5,0.7}),则 x[i,g] = ALPHA_IMP × med_g(ALPHA_IMP初值0.3,扫描{0.1,0.3,0.5}); 3. 非零值不做任何改动(区别于节点15的kNN去噪,后者平滑所有值); 4. 实现:对选中子矩阵逐类型处理,稀疏矩阵按行分块(1024行),用 np.asarray 转稠密后操作再转回,内存与现有分块一致; 5. 单输入阶段退路:该步骤完全在单一快照内计算类型统计量,无需第二个时间点,proxy/final/X3逻辑一致。 【改动2:斜率调整幅度上界(targeting covariation)】 在现有 x_adj = x + γ·slope·(tmean−p_i) 之后,增加逐基因上界: |adjustment_g| ≤ CLIP_MAX × std_type_g,其中 std_type_g 是该基因在源数据该类型内的标准差,CLIP_MAX初值2.0(扫描{1.5,2.0,3.0})。 这防止斜率大但表达方差小的基因被过度推移,保护基因间相关结构。 实现:在现有 c·S[trow] 计算后加 np.clip(D, -clip_lo, clip_hi),其中clip按基因从类型std预计算。 【查分策略(≤20次vec-score)】 1. 先跑对照(γ=0, 无填补)确认基线≈56.28(1次) 2. 仅填补(γ=0, ALPHA_IMP=0.3, FREQ_MIN=0.5)proxy seed0+seed1(2次)→ 看de_recovery是否>52.7(超噪声) 3. 若有效,叠加γ=-0.8(父参数)跑2 seeds(2次) 4. 扫ALPHA_IMP∈{0.1,0.5}×FREQ_MIN∈{0.3,0.7},每个1 seed(4次) 5. 加CLIP_MAX=2.0,跑2 seeds(2次)→ 看covariation是否回升且de_recovery保持 6. 最优配置跑proxy2 seed0 + X3 seed0(2次)确认不伤外部视图 7. 余量用于复验最优配置(2-3次) 总计≤15次。若第2步de_recovery无… |
| 风险 | 1. de_recovery可能对零值填补同样免疫(如果对零值不敏感),第2步即可发现,此时快速转向仅测CLIP_MAX;2. 填补可能引入人为的基因间相关(所有同类型细胞的同一基因被填为相同值),损害covariation——用ALPHA_IMP≤0.3和FREQ_MIN≥0.5限制填补范围来缓解,若cov下降>1分则提高FREQ_MIN或降低ALPHA_IMP;3. CLIP_MAX可能过度约束有效调整,若总分下降则放宽至3.0或关闭;4. 30分钟时限紧张,实现应优先填补(改动1),CLIP_MAX(改动2)若时间不够可跳过;5. 填补改变稀疏结构(零变非零),需确认write_prediction和下游评分器对非整数/小数值无异常。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 460e9acb2e。改动的文件:solution/METHOD.md +30 −36、solution/run.py +64 −4
diff --git a/solution/METHOD.md b/solution/METHOD.mdindex 88d77db..34e61e8 100644--- a/solution/METHOD.md+++ b/solution/METHOD.md@@ -1,38 +1,32 @@-# copy_last 两级增殖重加权(β_type=-4、β_cell=-1)+ 增殖-表达回归斜率的逐细胞表达放大(γ=-0.8),外部/退化视图跳过表达调整。+copy_last(最新官方阶段)+两级增殖重加权抽样(β_type=-4,β_cell=-1)+类型内增殖-表达OLS斜率逐细胞放大(γ=-1.6,|slope|>0.05);本节点实测的dropout零值填补与斜率幅度上界均无效/有害,默认关闭。 ## 方法--基底(继承节点 4/6,已验证):输出 = 最新「官方」输入阶段的加权无放回抽样(Efraimidis–Spirakis)。权重两级相乘:-- 类型级 w_type = max(1e-6, 1 + β_type·(prolif_type − mean_prolif)),β_type = **-4**(节点 4 扫出);-- 细胞级 w_cell = max(1e-6, 1 + β_cell·(prolif_cell − prolif_type)),β_cell = **-1**(节点 6 方向,本节点以乘法形式叠加)。--prolif 得分 = PROLIF 基因(Mki67, Top2a, Pcna, Cdk1, Ccna2, Ccnb1, Aurkb, Bub1, Cenpf, Nusc1,通用 cell-cycle 标记,非阶段特异知识;与面板取交集,≥3 个才启用)log 表达的逐细胞均值,完全在输入快照内计算。--新增表达调整(本节点,PLAN 机制但**符号与预期相反**):-1. 对每个细胞类型(细胞数 ≥20),用该类型**全部**源细胞做 OLS:slope_g = cov(x_g, prolif)/var(prolif)(稀疏矩阵-向量积实现,无需稠密化全矩阵);只保留 |slope_g| > 0.05 的基因。-2. 对每个被选中细胞 i:x_adj[i,g] = x[i,g] + γ·slope_g·(type_mean_prolif − prolif_i),clip ≥0,按 1024 行分块稠密计算。-3. γ 扫描(proxy A 半):0 → 56.28;+0.05/+0.15/+0.3 → 56.24/55.89/55.31(PLAN 预设的正 γ **单调降分,证伪**);**-0.05/-0.1/-0.2/-0.4/-0.8/-1.6 → 56.40/56.58/56.68/56.83/57.20/57.37**。负 γ = 沿斜率**放大**细胞自身的增殖偏离(增强类型内增殖梯度对比),选 γ = **-0.8**(-1.6 总分仅 +0.17 且 covariation 从 53.6 掉到 51.6,判为 A 半过拟合风险,弃用)。-4. 跳过条件:所选阶段为外部来源,或抽样退化(n_target ≥ 池大小,如 X3)。X3 上未加保护时 γ=-0.8 使分数 50.0 → 43.2(covariation 28.8),加保护后恢复 50.0(已查分验证)。--## 查分记录(A 半)--- proxy seed0 γ=-0.8:**57.20**(de_recovery 52.48 / direction 59.72 / cell_state 61.45 / covariation 53.56)-- proxy seed1 γ=-0.8:56.89(一致)-- proxy2 seed0:57.20(外部 Qiu E9.0 被忽略,输出与 proxy 逐字节相同,md5 已核)-- X3 seed0:50.0(保护生效,= copy_last)-- 基底 γ=0(β_cell=-1 乘法叠加):56.28,已高于节点 4(55.23)与节点 6(55.81)的 A 半查分-- β_type 重扫(γ=0):-3 → 55.62,-5 → 55.34,均低于 -4(56.28),维持 -4-- 预期节点分 ≈ (57.2+57.2+50)/3 ≈ 54.8 A 半(父 53.48)--## 验证过--- 三视图(proxy/proxy2/X3)跑通、vec-check ok、运行 ~5 s、内存远低于 28 GB 限额。-- 确定性:仅 np.random.default_rng(seed);proxy 与 proxy2 输出 md5 相同。-- γ=0 时与父逻辑等价(β_cell 乘法叠加版)。--## 没验证 / 风险--- γ=-0.8 与 -0.4/-1.6 的差距(<0.6 分)在 T1 噪声(~2 分)内;-0.8 是折中(de_recovery +1、covariation -1.3 相对基底)。-- 负 γ 的机制解释:放大类型内增殖-表达耦合让群体在增殖轴上更分散,mmd_u 与 de_score 同升;B 半是否重现未验证。-- final 视图(E8.5+E9.5→E10.5)未测:若 E9.5 池 ≤ 目标细胞数,表达调整会被退化保护跳过,只剩 copy_last(安全但无增益)。-- 「退化即跳过」保护对 X3 有效,但若某视图池恰等于目标数而调整本可有益,也会被跳过。+基底与父节点7完全相同:+1. 取 manifest 中最新的**官方**输入阶段(外部阶段永不直接当输出;proxy 只有 E8.5,final 用 E9.5)。+2. 增殖得分 = 面板内通用细胞周期基因(Mki67/Top2a/Pcna/Cdk1/Ccna2/Ccnb1/Aurkb/Bub1/Cenpf/Nusc1)的均值,全部在输入快照内现场计算。+3. 两级 Efraimidis–Spirakis 加权无放回抽样:类型级 w=1+β_type·(type_score−mean),细胞级 w=1+β_cell·(score−type_score),β_type=-4、β_cell=-1。+4. 表达调整:每个细胞类型内对每个基因做 expression ~ proliferation 的 OLS 斜率(|slope|>0.05 才用,类型 ≥20 细胞),x_adj = x + (−γ)·slope·(score_i − type_score),clip ≥0。**γ=-1.6**(本节点在 A 半确认优于父的 -0.8:57.197→57.369)。+5. 保护开关:外部来源输入阶段或退化抽样(n_target ≥ 池大小,如 X3)时完全跳过表达调整。++## 本节点新增(均默认关闭)+- `IMPUTE_ALPHA`/`FREQ_MIN`:类型内 dropout 零值填补(零 → α·该类型该基因非零均值,仅 freq≥FREQ_MIN 的基因,非零值不动)。**实测 α=0.3、FREQ_MIN=0.5 在 proxy A 半总分 46.26(对照 57.20),covariation 从 53.56 崩到 21.03** —— 把零填成同一常数会摧毁细胞间共变结构,de_recovery 只 +0.5(53.0 vs 52.48)完全不抵。放弃。+- `CLIP_MAX`:逐基因把调整幅度限制在 CLIP_MAX·类型内标准差。实测 γ=-0.8 时 clip=2.0 与不 clip 逐位相同(约束从不生效);γ=-1.6 时 clip=2.0 → 57.369(=不 clip),clip=1.0 → 57.328,clip=0.5 → 57.235,即**越紧越差,covariation 并不因放宽 γ 而受损到需要上界**。默认 0(关闭)。+- γ=-2.4+clip=1.0 → 56.943(covariation 49.76),确认 -1.6 附近是边界。++## 查分记录(proxy A 半,seed 0)+| 配置 | board | de_rec | direction | cell_state | covar |+|---|---|---|---|---|---|+| γ=-0.8(父默认) | 57.197 | 52.48 | 59.72 | 61.45 | 53.56 |+| γ=-0.8 + 填补 α=0.3 | 46.256 | 53.00 | 56.76 | 48.70 | 21.03 |+| γ=-1.6, clip=2.0 | 57.369 | 52.48 | 59.76 | 63.31 | 51.59 |+| γ=-1.6, clip=1.0 | 57.328 | 52.48 | 59.76 | 63.15 | 51.62 |+| γ=-1.6, clip=0.5 | 57.235 | 52.48 | 59.77 | 62.76 | 51.73 |+| γ=-2.4, clip=1.0 | 56.943 | 52.48 | 59.70 | 63.15 | 49.76 |++## 验证过 / 没验证+- 验证:proxy 单视图 6 个配置(上表);proxy2 与 X3 视图能跑通且 `vec-check` 通过(表达调整在两视图上都被保护开关跳过,因此与父节点同输出,X3 应仍为 50.0)。+- 未验证:γ=-1.6 的 B 半与多种子(rank3);final 视图(E9.5 池是否触发退化保护未实测);填补参数未再扫(首个点已判死)。+- de_recovery 在本节点的 6 个配置里恒为 52.48(只有零值填补能撬动它,而填补的代价远大于收益),继续印证全树观察:该组对连续表达值的微调免疫。++## 生物学知识来源+仅用通用细胞周期/增殖基因功能注释(cell-cycle markers,非阶段特异),无保留阶段或保留基因型的任何测量信息;未读 `uns.celltype_palette`。diff --git a/solution/run.py b/solution/run.pyindex 71f82b5..ec15dc2 100644--- a/solution/run.py+++ b/solution/run.py@@ -39,7 +39,10 @@ from src.task1_temporal.view_io import ( BETA_TYPE = -4.0 # tuned on T1 proxy A-half (node 4) BETA_CELL = -1.0 # within-type weight (node 6)-GAMMA = -0.8 # expression-adjustment strength (negative tuned on proxy A-half)+GAMMA = -1.6 # expression-adjustment strength (A-half: -1.6 > -0.8, 57.37 vs 57.20)+IMPUTE_ALPHA = 0.0 # dropout fill fraction of within-type nonzero mean (0 = off)+FREQ_MIN = 0.5 # only fill genes detected in >= this fraction of type cells+CLIP_MAX = 0.0 # cap |adjustment| by CLIP_MAX * within-type std (0 = off) SLOPE_MIN = 0.05 # only adjust genes with |slope| above this MIN_TYPE_CELLS = 20 @@ -72,10 +75,16 @@ def main() -> None: parser.add_argument("--gamma", type=float, default=None) parser.add_argument("--beta-cell", type=float, default=None) parser.add_argument("--beta-type", type=float, default=None)+ parser.add_argument("--impute-alpha", type=float, default=None)+ parser.add_argument("--freq-min", type=float, default=None)+ parser.add_argument("--clip-max", type=float, default=None) args = parser.parse_args() gamma = GAMMA if args.gamma is None else args.gamma beta_cell = BETA_CELL if args.beta_cell is None else args.beta_cell beta_type = BETA_TYPE if args.beta_type is None else args.beta_type+ imp_a = IMPUTE_ALPHA if args.impute_alpha is None else args.impute_alpha+ freq_min = FREQ_MIN if args.freq_min is None else args.freq_min+ clip_max = CLIP_MAX if args.clip_max is None else args.clip_max manifest = load_manifest(args.data) genes = panel_genes(args.data, manifest)@@ -117,9 +126,50 @@ def main() -> None: # labels) the within-type proliferation regression proved harmful # (X3 A-half 50.0 -> 43.2), so we copy the cells untouched there. degenerate = n_target >= last.n_obs # no real subsampling (e.g. test X3)- if gamma != 0.0 and score is not None and not is_external(entry) and not degenerate:- n_types = int(inv.max()) + 1+ skip = is_external(entry) or degenerate+ n_types = int(inv.max()) + 1 if inv is not None else 0++ # ---- dropout imputation: fill technical zeros with a fraction of the+ # within-type nonzero mean (per gene), only for genes detected in >=+ # freq_min of that type's cells. Nonzeros are left untouched. ----+ if imp_a > 0.0 and score is not None and not skip:+ ones = np.ones(len(rows), dtype=np.float32)+ F = np.zeros((n_types, X.shape[1]), dtype=np.float32)+ chunk = 1024+ for t in range(n_types):+ idx = np.flatnonzero(inv == t)+ if len(idx) < MIN_TYPE_CELLS:+ continue+ cnt = np.zeros(X.shape[1], dtype=np.float64)+ tot = np.zeros(X.shape[1], dtype=np.float64)+ for a in range(0, len(idx), chunk):+ b = min(a + chunk, len(idx))+ B = X[idx[a:b]]+ cnt += np.asarray((B > 0).sum(axis=0)).ravel()+ tot += np.asarray(B.sum(axis=0)).ravel()+ freq = cnt / len(idx)+ mnz = np.divide(tot, cnt, out=np.zeros_like(tot), where=cnt > 0)+ F[t] = np.where(freq >= freq_min, imp_a * mnz, 0.0).astype(np.float32)+ if np.any(F):+ trow = inv[rows]+ parts = []+ for a in range(0, len(rows), chunk):+ b = min(a + chunk, len(rows))+ D = np.asarray(Xsel[a:b].todense(), dtype=np.float32)+ V = F[trow[a:b]]+ np.copyto(D, V, where=(D == 0.0))+ parts.append(sparse.csr_matrix(D))+ Xsel = sparse.vstack(parts).tocsr()++ # Guard: only adjust expression on official stages. In external-only views+ # (e.g. test question X3: different platform/technology, author cell-type+ # labels) the within-type proliferation regression proved harmful+ # (X3 A-half 50.0 -> 43.2), so we copy the cells untouched there.+ if gamma != 0.0 and score is not None and not skip: S = np.zeros((n_types, X.shape[1]), dtype=np.float32)+ C = None+ if clip_max > 0.0:+ C = np.zeros((n_types, X.shape[1]), dtype=np.float32) for t in range(n_types): idx = np.flatnonzero(inv == t) if len(idx) < MIN_TYPE_CELLS:@@ -131,6 +181,12 @@ def main() -> None: slope = np.asarray(X[idx].T @ pc, dtype=np.float64).ravel() / denom slope[np.abs(slope) <= SLOPE_MIN] = 0.0 S[t] = slope.astype(np.float32)+ if C is not None:+ m1 = np.asarray(X[idx].sum(axis=0)).ravel() / len(idx)+ m2 = (X[idx].multiply(X[idx])).sum(axis=0)+ m2 = np.asarray(m2).ravel() / len(idx)+ sd = np.sqrt(np.maximum(m2 - m1 * m1, 0.0))+ C[t] = (clip_max * sd).astype(np.float32) if np.any(S): c = (-gamma) * (score[rows] - type_score[inv[rows]]) trow = inv[rows]@@ -139,7 +195,11 @@ def main() -> None: for a in range(0, len(rows), chunk): b = min(a + chunk, len(rows)) D = np.asarray(Xsel[a:b].todense(), dtype=np.float32)- D += (c[a:b, None] * S[trow[a:b]]).astype(np.float32)+ A = (c[a:b, None] * S[trow[a:b]]).astype(np.float32)+ if C is not None:+ lim = C[trow[a:b]]+ np.clip(A, -lim, lim, out=A)+ D += A np.clip(D, 0.0, None, out=D) parts.append(sparse.csr_matrix(D)) Xsel = sparse.vstack(parts).tocsr()
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k041 | Within-stage pseudotime and graph toolkit offline: scanpy DPT/PAGA/Leiden, Palantir, CellRank 2 | 10.1186/s13059-019-1663-x (PAGA); 10.1038/s41587-019-0068-4 (Palantir); 10.1038/s41592-024-02303-9 (CellRank 2) |
| k031 | Offline OT toolkit in the sandbox: moscot TemporalProblem, wot OTModel, POT, geomloss | 10.1038/s41586-024-08453-2 (moscot); 10.1016/j.cell.2019.01.006 (Waddington-OT) |
| k018 | Damped per-type shift: shrinkage alpha on the observed delta | notes/plan/cards/T1.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 在父节点7基底上新增两个默认关闭的开关(类型内dropout零值填补 IMPUTE_ALPHA/FREQ_MIN、斜率调整幅度上界 CLIP_MAX),实测两者均无效/有害后提交配置只把 GAMMA 从 -0.8 改为 -1.6,保护开关不变。 |
|---|---|
| 各组分数的变化 | cell_state:变好但幅度在 T1 噪声(~2分)边缘内:56.59 → 57.68(+1.09),来自 γ=-1.6 放大增殖梯度 covariation:变坏但在噪声内:52.88 → 51.75(-1.13),γ 加强的已知代价 de_recovery:噪声内/无变化:51.69 → 51.69(+0.00),de_recovery 对填补和斜率调整均不响应 direction:噪声内:56.25 → 56.27(+0.03) 总分:噪声内:54.54 → 54.64(+0.11) |
| 假设是否成立 | 否 |
| 经验 |
|
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 4 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 2、write 1 |
| 用时 | 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 10,957 · 输出 1,102 · 思考 1,575 |
| 任务(第一行) | 分析节点 n31 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/analyst.jsonl 8 KB /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 15 |
| 工具调用 | 共 15 次:bash 15 |
| 用时 | 4 分 |
| token 数 | 输入 32,708 · 输出 5,630 · 思考 2,577 |
| 任务(第一行) | 按计划修改程序:类型内dropout零值中位数填补 + 斜率调整幅度上界约束 |
| 最后的回答(摘录) | **做了什么**:在父节点7上加了两个 PLAN 机制(类型内 dropout 零值中位数/均值填补、斜率调整幅度上界 CLIP_MAX),均带默认关闭开关;proxy 上扫了 6 个配置(5 次查分)。 **查分(proxy A 半,seed 0)**: - γ=-0.8(父)57.197 → **填补 α=0.3 崩到 46.256**(covariation 53.56→21.03,de_recovery 仅 +0.5)→ 判死,`IMPUTE_ALPHA=0`。 - CLIP_MAX 在 γ=-0.8 从不生效(逐位相同);γ=-1.6 时 clip=2.0→57.369(=不 clip)、1.0→57.328、0.5→57.235,越紧越差 → `CLIP_MAX=0`。γ=-2.4→56.943。 - 最终提交 = 父机制 + `GAMMA=-1.6`(A 半最优 57.369),保护开关不变;proxy2 / X3 跑通且 vec-check 通过(外部/退化视图跳过表达调整)。de_recovery 在全部 5 个非填补配置恒为 52.48。 **下一步最值得试**:de_recovery 只对“零值结构”敏感、且填补代价极大 → 应改为**保持零值位置不变、只放大非零值幅度**(如类型内乘性缩放/按 slope 的非零值微调),或直接把力气放到 cell_state(γ=-1.6 已 +1.9)与 covariation 的权衡边界(γ∈[-1.2,-1.6] 多种子确认,避免 A/B 半过拟合)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/engineer.jsonl 62 KB /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 2 次 |
| 轮数 | 2 |
| 工具调用 | 共 0 次:— |
| 用时 | 7 分 |
| token 数 | 输入 18,500 · 输出 2,269 · 思考 15,603 |
| 任务(第一行) | 为节点 n31(改进,父节点 n7)写改进计划 PLAN.json |
| 最后的回答(摘录) | ropout)遮蔽了真实的DE模式:单细胞数据中大量真实表达的基因因技术噪声记为0,copy_last原样保留这些0使预测的DE信号被稀释。同时,父节点covariation 52.88在γ=-1.6子代中降至52.42(-0.46),斜率调整对个别基因的极端位移可能破坏基因间相关结构。两个问题需要不同机制:填补零值针对de_recovery,约束调整幅度针对covariation。",
"approach": "在节点7的run.py上做两处改动,均受外部/退化保护开关控制(is_external或n_target≥池大小时跳过):\n\n【改动1:类型内零值中位数填补(targeting de_recovery)】\n在加权抽样选出目标细胞之后、斜率调整之前,对每个细胞类型(≥MIN_TYPE_CELLS=20个源细胞):\n1. 在源数据中统计每个基因在该类型内的表达频率 freq_g = (x>0的比例) 和非零中位数 med_g = median(x[x>0]);\n2. 对每个被选中细胞i,若 x[i,g]==0 且 freq_g ≥ FREQ_MIN(初值0.5,扫描{0.3,0.5,0.7}),则 x[i,g] = ALPHA_IMP × med_g(ALPHA_IMP初值0.3,扫描{0.1,0.3,0.5});\n3. 非零值不做任何改动(区别于节点15的kNN去噪,后者平滑所有值);\n4. 实现:对选中子矩阵逐类型处理,稀疏矩阵按行分块(1024行),用 np.asarray 转稠密后操作再转回,内存与现有分块一致;\n5. 单输入阶段退路:该步骤完全在单一快照内计算类型统计量,无需第二个时间点,proxy/final/X3逻辑一致。\n\n【改动2:斜率调整幅度上界(targeting covariation)】\n在现有 x_adj = x + γ·slope·(tmean−p_i) 之后,增加逐基因上界:\n|adjustment_g| ≤ CLIP_MAX × std_type_g,其中 std_type_g 是该基因在源数据该类型内的标准差,CLIP_MAX初值2.0(扫描{1.5,2.0,3.0})。\n这防止斜率大但表达方差小的基因被过度推移,保护基因间相关结构。\n实现:在现有 c·S[trow] 计算后加 np.clip(D, -clip_lo, clip_hi),其中clip按基因从类型std预计算。\n\n【查分策略(≤20次vec-score)】\n1. 先跑对照(γ=0, 无填补)确认基线≈56.28(1次)\n2. 仅填补(γ=0, ALPHA_IMP=0.3, FREQ_MIN=0.5)proxy seed0+seed1(2次)→ 看de_recovery是否>52.7(超噪声)\n3. 若有效,叠加γ=-0.8(父参数)跑2 seeds(2次)\n4. 扫ALPHA_IMP∈{0.1,0.5}×FREQ_MIN∈{0.3,0.7},每个1 seed(4次)\n5. 加CLIP_MAX=2.0,跑2 seeds(2次)→ 看covariation是否回升且de_recovery保持\n6. 最优配置跑proxy2 seed0 + X3 seed0(2次)确认不伤外部视图\n7. 余量用于复验最优配置(2-3次)\n总计≤15次。若第2步de_recovery无改善(<52.5),放弃填补,仅测CLIP_MAX对covariation的效果。\n\n【判定标准】\n- de_recovery需>53.7(父51.69+2噪声)才算真实改善;\n- covariation不应低于52.5;\n- 总分需>56.5(proxy A半,对应榜分>55)才值得提交;\n- X3必须≥50.0(保护生效)。",
"expected_groups": ["de_recovery", "covariation"],
"risks": "1. de_recovery可能对零值填补同样免疫(如果对零值不敏感),第2步即可发现,此时快速转向仅测CLIP_MAX;2. 填补可能引入人为的基因间相关(所有同类型细胞的同一基因被填为相同值),损害covariation——用ALPHA_IMP≤0.3和FREQ_MIN≥0.5限制填补范围来缓解,若cov下降>1分则提高FREQ_MIN或降低ALPHA_IMP;3. CLIP_MAX可能过度约束有效调整,若总分下降则放宽至3.0或关闭;4. 30分钟时限紧张,实现应优先填补(改动1),CLIP_MAX(改动2)若时间不够可跳过;5. 填补改变稀疏结构(零变非零),需确认write_prediction和下游评分器对非整数/小数值无异常。"
} |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/researcher.jsonl 4 KB /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/researcher.1.jsonl 5 KB /home/spark-longxinyang/vec/runs/formal/20261001-233756-search-t1-abc-r0-B-population/nodes/31/researcher.stderr |