总览 · ← 返回运行 20261001-204440-search-t1-g21q-C
节点 n4
copy_last(校准后回退:簇级 EB 收缩位移在 X3/X4/X5 上均低于地板)
| 运行?一次完整的自动搜索或 Agent 会话,有自己的锁定配置和证据包。 | 20261001-204440-search-t1-g21q-C |
|---|---|
| 父节点 | n1 |
| 子节点 | — |
| 操作?种子:人写的起点;改进:在父节点上改;草稿:从头写;修复:修父节点的报错。 | 改进 |
| 状态 | 已打分 |
| 分数 | 搜索目标分 50.00(+0.0) · X3 50.00(+0.0) · X4 50.00(+0.0) · X5 50.00(+0.0) · 3 次复测均分 50.00 |
| 审查 | 未审查 |
| 用时?从运行开始到结束(或到现在)的挂钟时间。 | 10 分 |
| 程序版本 | c28627b09b4b02c2a1efe8381ad3695c1495f2ad (programs.git) |
方法说明?节点程序自带的 METHOD.md:这个程序做了什么、为什么。
来自 programs.git c28627b09b:solution/METHOD.md
copy_last(校准后回退:簇级 EB 收缩位移在 X3/X4/X5 上均低于地板)
一句摘要:实现时间比例外推的簇级 EB 收缩伪批量位移并在三个外部视图上校准两档幅度,均低于 copy_last 地板,按预案回退提交 copy_last(位移代码保留、幅度置 0)。
做了什么
父节点为 copy_last(三把外部尺子均为地板 50.00)。本节点按 PLAN 实现了主分支方法:
- 读最后两个输入阶段(三个视图均为 E8.75、E9.0,来自同一外部数据集);
- 对 last 阶段做 TruncatedSVD(50) + KMeans(k=12) 聚类,prev 细胞按最近质心归簇,prev 同簇细胞 <30 的簇 delta=0;
- 每簇每基因 delta=mean(last)−mean(prev),tau²=var_l/n_l+var_p/n_p,EB 收缩 s=delta²/(delta²+tau²);
- 每细胞 x+SHIFT_SCALE·h·s·delta,h=(t_target−t_last)/(t_last−t_prev) 从 manifest 时间现场计算(X3=2.0、X4≈1.19、X5=1.0,h 截断 ≤2),clip≥0,clip 率 >5% 自动减半;
- 与父节点相同 sample_rows + write_prediction。
校准结果(A 半,seed 0,共 7 次查分)
| 配置 | X3 | X4 | X5 | 均分 |
|---|---|---|---|---|
| copy_last(父节点=回退提交) | 50.00 | 50.00 | 50.00 | 50.00 |
| shift scale 0.5 | 44.34 | 48.89 | 46.65 | 46.63 |
| shift scale 0.25 | 45.90 | 49.48 | 47.96 | 47.78 |
失败模式:X3 covariation 随幅度单调崩塌(24.2→30.6,mmd_u 0.0357/0.0348 高于 copy 的 0.0340);X4/X5 的 de_direction 为负(−0.17/−0.14,direction 43.9/44.3),说明 E8.75→E9.0 的差值方向与真实 E9.0→target 变化反相关——两个输入阶段的差值很可能被胚胎间批次效应主导(X4/X5 目标仅 ahead 0.25–0.3 天,真实时间信号很小),外推放大的是批次噪声。EB 收缩和减小幅度都只能趋近、无法超过地板。
按 PLAN 的保守规则(两次查分均分都不比 copy_last 高 2 分即提交 copy_last),将 SHIFT_SCALE 置 0(数学上即 copy_last,位移代码保留在 run.py 中供后续节点复用),并用一次查分确认回退输出在三把尺子之一的 X3 上为 50.00。
验证过 / 没验证
- 验证:run.py 在 X3/X4/X5 三个视图上跑通(6–16 s,<2 GB)并通过 vec-check;在 proxy 视图(单输入 E8.5,含外部 Qiu E9.0 时 inputs_by_time 默认返回它,本代码取最后一个输入即 copy)跑通,输出 5118 细胞、基因顺序与 genes.txt 一致、无 NaN/负值;seed 确定(np.random.default_rng + sklearn random_state 全部定死)。
- 没验证:final 视图(官方 E8.5+E9.5,代码路径与 proxy 相同:SHIFT_SCALE=0 走 copy 分支);scale<0.25 的更小幅度(外推趋势表明只会渐近 50,不值得查分额度);全局(不分簇)delta 变体——de_direction 为负表明问题在差值方向本身,分簇粒度改不了符号。
生物学知识来源
无。程序不含任何来自保留阶段/禁窗的知识;仅使用 manifest 中的输入阶段时间做外推系数(已被校准否定,现幅度为 0)。
给后续节点的信号
外部心脏测试题(X3/X4/X5)上,E8.75→E9.0 两输入差值外推是净伤害(direction 反相关、covariation 崩塌),与官方 T1 上 pseudobulk_shift 失败(节点 3)一致。要超过 copy_last 需要与"两阶段差值"正交的信号(如仅用 last 阶段内部结构的保守重加权),或先证明差值方向与真实方向相关(de_direction>0)再加幅度。
调研员的计划
| 名称 | 簇级 EB 收缩阻尼位移(alpha 校准,单输入退路) |
|---|---|
| 动机 | 父节点 1(copy_last)四组均为地板 50.00,任何真实信号都应是净提升。实验表显示两个失败模式:节点 3 pseudobulk_shift(alpha=1 全量按类型位移)总分 39.98,其中 covariation 崩到 20.41、de_recovery 49.29——说明在 log 空间硬加 delta 并 clip 到 0 会破坏基因间协方差,且噪声基因的位移是净伤害;节点 2 heart_jcf_peri 的 cell_state 51.19 略高于地板但 covariation 48.30、de_recovery 47.80。文献卡 k018 明确指出 alpha=1 低于 copy_last,需要 alpha∈[0,1] 收缩且噪声基因少动,但单输入 proxy 无法估 alpha,必须靠外部测试题校准——本 run 恰好只用 X3/X4/X5 三把外部尺子计分,具备直接校准 alpha 的条件。 |
| 做法 | 第一步:Engineer 对 X3/X4/X5 每个视图调用 view_io.inputs_by_time 确认输入阶段数,两条分支都在 30 分钟内可实现。【主分支:≥2 个输入】(1) 读最后两个输入阶段(panel_genes 基因,log 空间);(2) 对 last 阶段做 PCA(≤50 维)+KMeans 聚成 k=15 簇(k 可试 10/20),prev 阶段细胞按最近质心归簇;prev 中同簇细胞数 <30 的簇视为新生,delta=0(保持 copy);(3) 每簇每基因算 delta_cg=mean(last)−mean(prev),同时算均值差抽样噪声 tau_cg²=var_last/n_last+var_prev/n_prev,做经验贝叶斯收缩 s_cg=delta²/(delta²+tau²),使噪声基因几乎不动、强信号基因保留位移;(4) 对 last 的每个细胞 x_new=x+alpha·s_cg·delta_cg,clip 下限 0 并统计被 clip 条目比例,>5% 则降 alpha;(5) 与父节点相同 sample_rows 抽到 target_n_cells 后 write_prediction。alpha 初值 0.5,用 vec-score 在 {0.25, 0.5, 0.75, 1.0} 上校准(约 4 次查分),取 X3/X4/X5 平均最高者;若最优 alpha 的均分对 50.0 的优势 <2 分(噪声),保守选更小 alpha。【退路:仅 1 个输入(无 delta 可算)】用快照内伪时间外推(方向库 T1-06):对 last 阶段做扩散映射/PCA 取主导轨迹轴作伪时间 t,逐基因线性拟合表达~t 得斜率 b_g,对斜率做与主分支同式的 EB 收缩后 x_new=x+h·s_g·b_g,h 以伪时间标准差为单位试 {0.5, 1.0}(约 2 次查分);若两次查分均分都不比 copy_last 高 2 分以上,直接提交 copy_last(保底 50)。【预算】copy_last 基线分已知(50.00)不必重查;主分支 4 次 + 退路 2 次 + 复核 2 次 ≈ 8 次,远低于 20 次上限。查分前先跑本地自检:无 NaN/负值、每簇方差比(预测/输入)≥0.8、预测云的基因-基因协方差与输入云的相关 >0.9(防节点 3 式 covariation 崩塌)。 |
| 风险 | (1) covariation 重蹈节点 3 覆辙(20.41):根源是大幅硬位移+clip 压缩;EB 收缩、alpha≤0.75、clip 率>5% 即降档、以及查分前的协方差相关自检应尽早暴露,若 alpha=0.25 仍使任一把尺子明显低于 50,放弃位移改交 copy_last。(2) A 半过拟合:查分用 A 半、正式分用 B 半,只信 ≥2 分的差距,差距在噪声内一律选更保守配置。(3) Qiu/Imaz 与官方数据技术不同,簇跨阶段匹配可能不稳:用最近质心匹配+新生簇 delta=0 兜底,匹配率(prev 细胞被归入 <30 细胞簇以外的比例)<50% 时改用全体细胞的全局 delta(不分簇)作为降级方案。(4) 单输入退路的伪时间轴可能不代表真实发育方向:h 只试两档且不达标即回退 copy_last,不会低于父节点。(5) 运行时间风险低:父节点 1.5s/0.54GB,聚类+收缩在同量级。 |
代码改动?这个节点的程序和父节点程序的逐行差别:绿色是新增,红色是删除。
对比:父节点版本 65b97e3dd7。改动的文件:solution/METHOD.md +38 −0、solution/run.py +98 −4
diff --git a/solution/METHOD.md b/solution/METHOD.mdnew file mode 100644index 0000000..1c56374--- /dev/null+++ b/solution/METHOD.md@@ -0,0 +1,38 @@+# copy_last(校准后回退:簇级 EB 收缩位移在 X3/X4/X5 上均低于地板)++一句摘要:实现时间比例外推的簇级 EB 收缩伪批量位移并在三个外部视图上校准两档幅度,均低于 copy_last 地板,按预案回退提交 copy_last(位移代码保留、幅度置 0)。++## 做了什么++父节点为 copy_last(三把外部尺子均为地板 50.00)。本节点按 PLAN 实现了主分支方法:++1. 读最后两个输入阶段(三个视图均为 E8.75、E9.0,来自同一外部数据集);+2. 对 last 阶段做 TruncatedSVD(50) + KMeans(k=12) 聚类,prev 细胞按最近质心归簇,prev 同簇细胞 <30 的簇 delta=0;+3. 每簇每基因 delta=mean(last)−mean(prev),tau²=var_l/n_l+var_p/n_p,EB 收缩 s=delta²/(delta²+tau²);+4. 每细胞 x+SHIFT_SCALE·h·s·delta,h=(t_target−t_last)/(t_last−t_prev) 从 manifest 时间现场计算(X3=2.0、X4≈1.19、X5=1.0,h 截断 ≤2),clip≥0,clip 率 >5% 自动减半;+5. 与父节点相同 sample_rows + write_prediction。++## 校准结果(A 半,seed 0,共 7 次查分)++| 配置 | X3 | X4 | X5 | 均分 |+|---|---|---|---|---|+| copy_last(父节点=回退提交) | 50.00 | 50.00 | 50.00 | 50.00 |+| shift scale 0.5 | 44.34 | 48.89 | 46.65 | 46.63 |+| shift scale 0.25 | 45.90 | 49.48 | 47.96 | 47.78 |++失败模式:X3 covariation 随幅度单调崩塌(24.2→30.6,mmd_u 0.0357/0.0348 高于 copy 的 0.0340);X4/X5 的 de_direction 为负(−0.17/−0.14,direction 43.9/44.3),说明 E8.75→E9.0 的差值方向与真实 E9.0→target 变化**反相关**——两个输入阶段的差值很可能被胚胎间批次效应主导(X4/X5 目标仅 ahead 0.25–0.3 天,真实时间信号很小),外推放大的是批次噪声。EB 收缩和减小幅度都只能趋近、无法超过地板。++按 PLAN 的保守规则(两次查分均分都不比 copy_last 高 2 分即提交 copy_last),将 SHIFT_SCALE 置 0(数学上即 copy_last,位移代码保留在 run.py 中供后续节点复用),并用一次查分确认回退输出在三把尺子之一的 X3 上为 50.00。++## 验证过 / 没验证++- 验证:run.py 在 X3/X4/X5 三个视图上跑通(6–16 s,<2 GB)并通过 vec-check;在 proxy 视图(单输入 E8.5,含外部 Qiu E9.0 时 inputs_by_time 默认返回它,本代码取最后一个输入即 copy)跑通,输出 5118 细胞、基因顺序与 genes.txt 一致、无 NaN/负值;seed 确定(np.random.default_rng + sklearn random_state 全部定死)。+- 没验证:final 视图(官方 E8.5+E9.5,代码路径与 proxy 相同:SHIFT_SCALE=0 走 copy 分支);scale<0.25 的更小幅度(外推趋势表明只会渐近 50,不值得查分额度);全局(不分簇)delta 变体——de_direction 为负表明问题在差值方向本身,分簇粒度改不了符号。++## 生物学知识来源++无。程序不含任何来自保留阶段/禁窗的知识;仅使用 manifest 中的输入阶段时间做外推系数(已被校准否定,现幅度为 0)。++## 给后续节点的信号++外部心脏测试题(X3/X4/X5)上,E8.75→E9.0 两输入差值外推是净伤害(direction 反相关、covariation 崩塌),与官方 T1 上 pseudobulk_shift 失败(节点 3)一致。要超过 copy_last 需要与"两阶段差值"正交的信号(如仅用 last 阶段内部结构的保守重加权),或先证明差值方向与真实方向相关(de_direction>0)再加幅度。diff --git a/solution/run.py b/solution/run.pyindex aa4bbf0..dd956b4 100644--- a/solution/run.py+++ b/solution/run.py@@ -1,5 +1,12 @@ #!/usr/bin/env python3-"""copy_last: the latest input stage, subsampled into the board's cell range."""+"""copy_last: the latest input stage, subsampled into the board's cell range.++Time-aware cluster-level EB-shrunk shifts were calibrated on X3/X4/X5 at+amplitudes 0.5 and 0.25 of the time-ratio extrapolation; both scored below+copy_last (means 46.6 / 47.8 vs 50.0), driven by covariation loss (X3+mmd_u/variogram). The shift path is therefore disabled (SHIFT_SCALE=0 makes+it mathematically identical to copy) and copy_last is submitted.+""" from __future__ import annotations @@ -17,6 +24,20 @@ from src.task1_temporal.view_io import ( write_prediction, ) +SHIFT_SCALE = 0.0 # calibrated: any positive amplitude tested scored below copy_last+N_CLUSTERS = 12+MIN_PREV_PER_CLUSTER = 30+BLOCK = 2048+++def _col_stats(X, rows=None):+ sub = X if rows is None else X[rows]+ n = sub.shape[0]+ mean = np.asarray(sub.mean(axis=0)).ravel().astype(np.float64)+ sq = np.asarray(sub.multiply(sub).mean(axis=0)).ravel().astype(np.float64)+ var = np.maximum(sq - mean**2, 0.0)+ return mean, var, n+ def main() -> None: parser = argparse.ArgumentParser()@@ -27,10 +48,83 @@ def main() -> None: manifest = load_manifest(args.data) genes = panel_genes(args.data, manifest)- last = read_stage(args.data, inputs_by_time(manifest)[-1], genes)+ inputs = inputs_by_time(manifest) rng = np.random.default_rng(args.seed)- rows = sample_rows(last.n_obs, target_n_cells(manifest, last.n_obs), rng)- write_prediction(last.X[rows], genes, args.out, seed=args.seed)++ last_entry = inputs[-1]+ last = read_stage(args.data, last_entry, genes)++ do_shift = SHIFT_SCALE > 0.0+ h = 0.0+ if do_shift and len(inputs) >= 2:+ t_prev = float(inputs[-2].get("time", last_entry.get("time", 0.0)))+ t_last = float(last_entry.get("time", 0.0))+ t_target = float(manifest.get("target", {}).get("time", t_last))+ do_shift = t_last > t_prev and t_target > t_last+ h = (t_target - t_last) / (t_last - t_prev)++ if not do_shift:+ rows = sample_rows(last.n_obs, target_n_cells(manifest, last.n_obs), rng)+ write_prediction(last.X[rows], genes, args.out, seed=args.seed)+ return++ import scipy.sparse as sp+ from sklearn.cluster import KMeans+ from sklearn.decomposition import TruncatedSVD++ prev = read_stage(args.data, inputs[-2], genes)+ Xl = sp.csr_matrix(last.X, dtype=np.float32)+ Xp = sp.csr_matrix(prev.X, dtype=np.float32)++ n_comp = min(50, Xl.shape[0] - 2, Xl.shape[1] - 2)+ svd = TruncatedSVD(n_components=n_comp, random_state=args.seed)+ emb = svd.fit_transform(Xl)+ emb = emb / (np.linalg.norm(emb, axis=1, keepdims=True) + 1e-9)+ k = int(min(N_CLUSTERS, max(2, Xl.shape[0] // 100)))+ km = KMeans(n_clusters=k, n_init=10, random_state=args.seed).fit(emb)+ lab_last = km.labels_++ emb_p = svd.transform(Xp)+ emb_p = emb_p / (np.linalg.norm(emb_p, axis=1, keepdims=True) + 1e-9)+ lab_prev = km.predict(emb_p)++ shifts = np.zeros((k, Xl.shape[1]), dtype=np.float32)+ amp = SHIFT_SCALE * min(h, 2.0)+ for c in range(k):+ rl = np.flatnonzero(lab_last == c)+ rp = np.flatnonzero(lab_prev == c)+ if len(rl) == 0 or len(rp) < MIN_PREV_PER_CLUSTER:+ continue+ ml, vl, nl = _col_stats(Xl, rl)+ mp, vp, npp = _col_stats(Xp, rp)+ delta = ml - mp+ tau2 = vl / nl + vp / npp+ shrink = delta**2 / (delta**2 + tau2 + 1e-12)+ shifts[c] = (amp * shrink * delta).astype(np.float32)++ n_out = target_n_cells(manifest, Xl.shape[0])+ rows = np.sort(sample_rows(Xl.shape[0], n_out, rng))+ out_blocks = []+ clipped = 0+ total = 0+ for start in range(0, len(rows), BLOCK):+ r = rows[start : start + BLOCK]+ dense = np.asarray(Xl[r].todense(), dtype=np.float32)+ moved = dense + shifts[lab_last[r]]+ clipped += int((moved < 0).sum())+ total += moved.size+ np.maximum(moved, 0.0, out=moved)+ out_blocks.append(sp.csr_matrix(moved))+ if total and clipped / total > 0.05:+ shifts *= 0.5+ out_blocks = []+ for start in range(0, len(rows), BLOCK):+ r = rows[start : start + BLOCK]+ dense = np.asarray(Xl[r].todense(), dtype=np.float32)+ moved = np.maximum(dense + shifts[lab_last[r]], 0.0)+ out_blocks.append(sp.csr_matrix(moved))+ Xout = sp.vstack(out_blocks, format="csr")+ write_prediction(Xout, genes, args.out, seed=args.seed) if __name__ == "__main__":
调研来源?调研员查到并用到的知识条目和文献检索结果(只列标题和编号)。
用到的知识库条目
| 编号 | 标题 | 出处 |
|---|---|---|
| k018 | Damped per-type shift: shrinkage alpha on the observed delta | notes/plan/cards/T1.md |
| k012 | Official T1 scoring, output contract and adversarial controls | notes/official/来件/virtualembryo.ai/task1-temporal.md; notes/official/来件/virtualembryo.ai/baselines.md |
| k016 | Degenerate-solution checks for population predictions | notes/handover/02_知识学习路线.md |
分析结果?分析员写的 ANALYSIS.json:改了什么、各组分数怎么变、假设是否成立、经验和下一步建议。
| 改了什么 | 实现了簇级 EB 收缩伪批量位移(SVD50+KMeans12、最近质心匹配、时间比例外推 h、clip 率超限自动减半),在 X3/X4/X5 上校准 scale 0.5 与 0.25 后按预案将 SHIFT_SCALE 置 0,实际提交与父节点相同的 copy_last。 |
|---|---|
| 各组分数的变化 | cell_state:噪声内(50.00,+0.00) covariation:噪声内(50.00,+0.00);校准中 X3 covariation 随幅度单调崩塌(24.2→30.6),与节点 3 失败模式一致 de_recovery:噪声内(提交=copy_last,50.00 vs 50.00,+0.00);但校准阶段的位移变体低于地板:scale 0.5 均分 46.63、scale 0.25 均分 47.78 direction:噪声内(50.00,+0.00);校准数据显示位移变体 de_direction 为负(X4 −0.17、X5 −0.14),方向反相关 |
| 假设是否成立 | 否 |
| 经验 |
|
| 下一步建议 |
|
对话摘要?每个角色和大模型对话的统计:轮数、工具调用、用时、token 数和最后的回答摘录;原始记录只给路径。
只给统计和最后回答的摘录;完整对话请到原始记录位置里列出的文件看。
分析员
| 角色?调研员写计划、工程师改代码、分析员解读分数、审查员检查作弊。 | 分析员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数?大模型一共回复了几轮(每轮可以调用多个工具)。 | 3 |
| 工具调用?大模型调用读文件、执行命令等工具的次数,按工具名统计。 | 共 3 次:bash 1、read 1、write 1 |
| 用时 | 不到 1 分 |
| token 数?输入 / 输出(含思考)的 token 数,来自接口返回的用量。 | 输入 8,216 · 输出 985 · 思考 126 |
| 任务(第一行) | 分析节点 n4 的打分结果,写 ANALYSIS.json |
| 最后的回答(摘录) | ANALYSIS.json written |
| 原始记录位置?完整对话记录在 Spark 上的文件路径;看板不复制原始内容。 | /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/analyst.jsonl 10 KB /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/analyst.stderr |
工程师
| 角色 | 工程师 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 18 |
| 工具调用 | 共 19 次:bash 15、write 3、edit 1 |
| 用时 | 7 分 |
| token 数 | 输入 35,351 · 输出 8,046 · 思考 4,554 |
| 任务(第一行) | 按计划修改程序:簇级 EB 收缩阻尼位移(alpha 校准,单输入退路) |
| 最后的回答(摘录) | **节点 4 完成。** - **做了什么**:实现 PLAN 主分支——簇级(SVD+KMeans,最近质心匹配)EB 收缩伪批量位移,外推系数 h 由 manifest 时间现场计算(X3=2.0/X4=1.19/X5=1.0),clip 率超限自动减半。 - **查分**(7/20 次):scale 0.5 → X3 44.3/X4 48.9/X5 46.6(均 46.6);scale 0.25 → 45.9/49.5/48.0(均 47.8);均低于 copy_last 地板 50。X4/X5 的 de_direction 为负(−0.17/−0.14),说明 E8.75→E9.0 差值方向与真实发育方向反相关(批次效应主导),X3 covariation 崩塌(24–31)。按预案回退 SHIFT_SCALE=0(=copy_last),确认查分 50.00,三视图+proxy 跑通、vec-check 通过、seed 确定。 - **下一步最值得试**:在两阶段差值之外找信号——先用 de_direction>0 作门槛检验任何"方向"来源(如 last 阶段内部伪时间、prior/ 通路约束的保守基因子集),只有方向验证为正再加幅度;或转向不依赖差值的分布重加权(保 covariation 的细胞状态微调)。 |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/engineer.jsonl 68 KB /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/engineer.stderr |
调研员
| 角色 | 调研员 alibaba-token-plan-cn/qwen3.8-max |
|---|---|
| 调用次数 | 1 次 |
| 轮数 | 2 |
| 工具调用 | 共 1 次:bash 1 |
| 用时 | 2 分 |
| token 数 | 输入 9,992 · 输出 1,260 · 思考 4,054 |
| 任务(第一行) | 为节点 n4(改进,父节点 n1)写改进计划 PLAN.json |
| 最后的回答(摘录) | 校准,单输入退路)",
"motivation": "父节点 1(copy_last)四组均为地板 50.00,任何真实信号都应是净提升。实验表显示两个失败模式:节点 3 pseudobulk_shift(alpha=1 全量按类型位移)总分 39.98,其中 covariation 崩到 20.41、de_recovery 49.29——说明在 log 空间硬加 delta 并 clip 到 0 会破坏基因间协方差,且噪声基因的位移是净伤害;节点 2 heart_jcf_peri 的 cell_state 51.19 略高于地板但 covariation 48.30、de_recovery 47.80。文献卡 k018 明确指出 alpha=1 低于 copy_last,需要 alpha∈[0,1] 收缩且噪声基因少动,但单输入 proxy 无法估 alpha,必须靠外部测试题校准——本 run 恰好只用 X3/X4/X5 三把外部尺子计分,具备直接校准 alpha 的条件。",
"approach": "第一步:Engineer 对 X3/X4/X5 每个视图调用 view_io.inputs_by_time 确认输入阶段数,两条分支都在 30 分钟内可实现。【主分支:≥2 个输入】(1) 读最后两个输入阶段(panel_genes 基因,log 空间);(2) 对 last 阶段做 PCA(≤50 维)+KMeans 聚成 k=15 簇(k 可试 10/20),prev 阶段细胞按最近质心归簇;prev 中同簇细胞数 <30 的簇视为新生,delta=0(保持 copy);(3) 每簇每基因算 delta_cg=mean(last)−mean(prev),同时算均值差抽样噪声 tau_cg²=var_last/n_last+var_prev/n_prev,做经验贝叶斯收缩 s_cg=delta²/(delta²+tau²),使噪声基因几乎不动、强信号基因保留位移;(4) 对 last 的每个细胞 x_new=x+alpha·s_cg·delta_cg,clip 下限 0 并统计被 clip 条目比例,>5% 则降 alpha;(5) 与父节点相同 sample_rows 抽到 target_n_cells 后 write_prediction。alpha 初值 0.5,用 vec-score 在 {0.25, 0.5, 0.75, 1.0} 上校准(约 4 次查分),取 X3/X4/X5 平均最高者;若最优 alpha 的均分对 50.0 的优势 <2 分(噪声),保守选更小 alpha。【退路:仅 1 个输入(无 delta 可算)】用快照内伪时间外推(方向库 T1-06):对 last 阶段做扩散映射/PCA 取主导轨迹轴作伪时间 t,逐基因线性拟合表达~t 得斜率 b_g,对斜率做与主分支同式的 EB 收缩后 x_new=x+h·s_g·b_g,h 以伪时间标准差为单位试 {0.5, 1.0}(约 2 次查分);若两次查分均分都不比 copy_last 高 2 分以上,直接提交 copy_last(保底 50)。【预算】copy_last 基线分已知(50.00)不必重查;主分支 4 次 + 退路 2 次 + 复核 2 次 ≈ 8 次,远低于 20 次上限。查分前先跑本地自检:无 NaN/负值、每簇方差比(预测/输入)≥0.8、预测云的基因-基因协方差与输入云的相关 >0.9(防节点 3 式 covariation 崩塌)。",
"expected_groups": ["de_recovery", "direction", "cell_state"],
"risks": "(1) covariation 重蹈节点 3 覆辙(20.41):根源是大幅硬位移+clip 压缩;EB 收缩、alpha≤0.75、clip 率>5% 即降档、以及查分前的协方差相关自检应尽早暴露,若 alpha=0.25 仍使任一把尺子明显低于 50,放弃位移改交 copy_last。(2) A 半过拟合:查分用 A 半、正式分用 B 半,只信 ≥2 分的差距,差距在噪声内一律选更保守配置。(3) Qiu/Imaz 与官方数据技术不同,簇跨阶段匹配可能不稳:用最近质心匹配+新生簇 delta=0 兜底,匹配率(prev 细胞被归入 <30 细胞簇以外的比例)<50% 时改用全体细胞的全局 delta(不分簇)作为降级方案。(4) 单输入退路的伪时间轴可能不代表真实发育方向:h 只试两档且不达标即回退 copy_last,不会低于父节点。(5) 运行时间风险低:父节点 1.5s/0.54GB,聚类+收缩在同量级。"
}
``` |
| 原始记录位置 | /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/researcher.jsonl 6 KB /home/spark-longxinyang/vec/runs/formal/20261001-204440-search-t1-g21q-C/nodes/4/researcher.stderr |