当我把全世界人群的基因 PCA 跑出来后,看见了一个倒 L 型

最近我把之前学的一些分子人类学知识,终于真正落地了。

不是停留在看论文、看别人画图、看别人解释“人群结构”这些概念,而是自己把数据处理完,自己跑 PCA,自己把全世界不同人群放到一张图上。

然后那一刻,我真的被击中了。

图上出现了一个非常漂亮的倒 L 型

一端是非洲,另一端逐渐拉向东亚,中间有中东、欧洲、南亚、欧亚大陆上的各种过渡人群。它不是那种随机散点图,而是有方向、有骨架、有历史感的结构。

我第一眼看到的时候,脑子里直接冒出一句话:

这不像是一张普通统计图,这像是人类迁徙史在二维空间里留下的影子。

当然,后来我也提醒自己,PCA 不能被过度浪漫化。它不是地图,也不是时间轴,更不是“谁从哪里走到哪里”的直接证据。PCA 本质上是把高维基因差异压缩到几个主成分上,用最大方差方向把样本摊开。它可以帮助我们观察人群结构、相似性、分化和混合,但不能单独承担全部历史解释。PCA 在群体遗传学里常用于观察 population structure 和 admixture,但解释时必须谨慎。(PMC)

但即便这样,那张图依然让我非常兴奋。

因为这不是我在书上看到的图。

这是我自己跑出来的。


倒 L 型:像极了“走出非洲”的宏观骨架

在全世界人群 PCA 上,非洲人群往往会和非洲外人群拉开很大距离。非洲内部遗传多样性本来就非常深,非洲和欧亚人群之间的差异也会形成非常强的主轴。

所以当我看到图上从非洲一端,经过中东、欧洲、南亚,再到东亚方向展开的时候,很自然会联想到“走出非洲”。

这个联想不是完全没有道理。

因为现代人类的主要扩散确实是从非洲走向欧亚,再沿着不同路线分化、扩张、混合。PCA 把这些深层差异压缩之后,就会出现某种“地理-遗传连续性”的视觉效果。

但关键点是:

PCA 图像看起来像迁徙路线,不等于它就是迁徙路线。

它更像是一张“遗传相似性地图”。

离得近,通常表示基因频率结构更相似;离得远,通常表示差异更大。至于这个差异来自古老分化、地理隔离、遗传漂变、混合,还是样本选择影响,需要继续分析。

这也是我这次最大的收获之一:

图很震撼,但不能只靠震撼解释图。


PC2、PC3 才是真正打开细节的地方

以前我也和很多人一样,看到 PCA 就只看 PC1 vs PC2。

但真正跑起来之后才发现,PC2、PC3、PC4 这些后面的主成分,才是继续拆结构的地方。

PC1 vs PC2 更像世界地图,负责展示最宏观的人群分化。

PC2 vs PC3 可能会把原来挤在一起的区域展开,比如东亚内部、南亚内部、中亚和西亚之间的梯度。

PC3 vs PC4 则更像显微镜,能看到更局部、更细的人群结构。

所以现在我对 PCA 的理解变成了:

PC1/PC2:看宏观骨架
PC2/PC3:看区域结构
PC3/PC4:看局部细节

而且还有一个很重要的点:

PC1、PC2、PC3 没有固定含义。

不是说 PC1 永远代表“非洲 vs 非洲外”,PC2 永远代表“欧洲 vs 东亚”。它取决于你放进来的样本是谁、每个人群样本量多少、有没有做 LD pruning、有没有去亲缘、有没有异常点。

所以正确问题不是:

“PC2 到底是什么意思?”

而是:

“在我这批样本里,PC2 把哪些人群拉开了?”

这个思路一下子让我觉得 PCA 活了起来。


最有意思的意外:马达加斯加人出现在空白处

本来我以为这个倒 L 型已经够震撼了。

结果我又注意到一个特别有意思的点:马达加斯加人群

他们在 PCA 上出现在一个有点“空白”的位置。第一眼看,很容易让人误以为:这是不是“走出非洲”的另一条路线?是不是非洲到东亚之间还有一条经由马达加斯加的古老支线?

这个想法很诱人。

但继续查资料之后,我发现不是这么回事。

马达加斯加人,也就是 Malagasy 人群,本身就是一个非常特殊的混合人群。他们主要有两股祖源:一股是非洲东部/班图相关祖源,另一股是南岛/东南亚相关祖源。2014 年 PNAS 的研究认为,研究中的 Malagasy 人群来自 Austronesian 和 Bantu 遗传成分的近期混合,其中 Bantu 相关成分至少约 60%,Austronesian 成分约 30%,而南岛相关来源可能与 Java-Kalimantan-Sulawesi 区域有关。(PMC)

这就解释了为什么他们会出现在 PCA 的“空白处”。

因为 PCA 里有一个很重要的现象:

混合人群经常会落在源人群之间。

如果一个人群同时有非洲祖源和东南亚/南岛祖源,它就不会单纯落在非洲团里,也不会单纯落在东亚或东南亚团里,而是会被两个方向一起拉到中间。

于是图上看起来就像多了一条“路线”。

但这条线不是远古迁徙路线。

它更像是一个混合投影:

非洲/班图相关祖源  +  东南亚/南岛祖源
                  ↓
              Malagasy

这也是为什么当我把这些人群加进 PCA 后,原来的倒 L 型会变得像三角形。

因为图上突然出现了第三个强拉力点。


南岛人真的到达了马达加斯加,而且时间并不算远古

更神奇的是,南岛人真的跨过印度洋到达了马达加斯加。

这个事情第一次意识到的时候,我觉得很不可思议:一群和今天婆罗洲、印尼、南岛世界相关的人,居然一路到了非洲旁边的马达加斯加。

这不是几万年前“走出非洲”级别的古老事件,而更像是历史时期或中世纪前后的跨海迁徙和混合。

2018 年 Nature Communications 的研究提到,Malagasy 人群来自 Asian/Austronesian 和 African/Bantu 背景的混合,混合大约发生在 27 代前。(Nature) 2017 年关于马达加斯加人群多样性的研究也指出,马达加斯加全岛个体共享近期 Austronesian 和 Bantu 祖源,并估计 proto-Malagasy 与南部非洲 Bantu 相关人群的分化大约在 1500 年前,与南婆罗洲相关人群的分化约在 3000 到 2000 年前。(PMC)

所以这件事的时间深度大概不是几万年,而是几千年到一千年左右这个尺度。

一开始我还觉得:那好像和尼安德特人混合、丹尼索瓦人混合、走出非洲这些远古事件比起来,不算太“深”。

但后来一想,它的价值不在于远古。

它的价值在于:

这是一个非常远距离、非常戏剧性的历史时期跨海迁徙。

从东南亚到马达加斯加,这条线如果画在地图上,本身就非常震撼。更有意思的是,Malagasy 语言属于南岛语系,这说明南岛人不只是留下了一点基因痕迹,而是在语言和文化层面也留下了非常深的影响。关于 Malagasy 的亚洲来源,2016 年的研究也支持东南婆罗洲相关人群在 Malagasy 亚洲祖源形成中扮演重要角色。(PMC)

也就是说,PCA 上那个点不是普通的离群点。

它背后是一段印度洋上的人类故事。


这次真正让我兴奋的,不只是图,而是理解方式变了

我以前可能会把 PCA 当成一种“工具”。

现在感觉不一样了。

它像一个入口。

你把全世界的人群放进去,它会先给你一个宏观骨架:非洲、欧亚、东亚、南亚、美洲、大洋洲,各自被拉到不同方向。

然后你换 PC2/PC3、PC3/PC4,它会继续打开更细的结构。

你再加入特殊人群,比如马达加斯加人,它又会突然告诉你:这里有混合,这里有跨海迁徙,这里不是简单的线性历史。

所以我现在越来越觉得,PCA 最有意思的地方不是“它告诉了我答案”。

而是它不断逼我问更好的问题:

这个轴到底拉开了谁?
这个中间位置是连续迁徙,还是混合?
这个三角形是三个源人群,还是样本结构造成的?
这个离群点是历史事件,还是数据处理问题?

这才是真正好玩的地方。


最后:PCA 不是历史本身,但它能让历史浮现出来

这次做完之后,我最大的感受是:

人类历史不是只存在于文字、遗址和传说里。它也藏在基因频率的结构里。

当然,PCA 不是万能的。

它不能单独证明迁徙路线,不能单独给出混合时间,也不能替代 ADMIXTURE、f-statistics、qpAdm、TreeMix、IBD、单倍群、古 DNA 等更深入的分析。

但它可以作为第一张地图。

它告诉你哪里有结构,哪里有梯度,哪里有混合,哪里有异常。

而我这次最兴奋的地方就在这里:

我不是看别人画了一张图。

我是真的自己把数据跑出来,然后在图上看见了一个倒 L 型。

那一瞬间,我感觉自己不是在看一堆点。

我是在看人类迁徙、分化、混合和重逢,被压缩成二维之后留下的痕迹。

这就是分子人类学最迷人的地方。

一张图,既是数学,也是历史。

既是数据,也是人类自己。

发现了这本书 嘿嘿 开始阅读

Read more

Mac 上 Skill CLI 无法执行的坑:最后其实一条命令就够了

我在做 Amazon skills 的过程中,逐步把本地 CLI 从 Python 脚本切到 Go 二进制。这样做的好处很明显:用户不用装 Python、不用配依赖,解压 skill 后直接运行。但在 macOS 上,我们反复遇到一个看起来很玄的问题:同一个二进制,在 Linux/Windows 上正常,在 Mac 上就是执行不了。 当时遇到的现象 常见报错大概有几类: * 双击或 agent 调用 CLI 时,系统提示文件来自未知开发者,无法打开。 * 终端里执行时提示 Permission denied。 * 已经 chmod +x 了,仍然被 macOS 拦截。 * Apple

By ladydd

吞吐与延迟:一个厨房比喻讲透性能压测

写于 2026-06-26。背景: MCP 服务 跑在 3 台 ClickHouse(每台 16 核 / 64G,1 分片 3 副本)上。 我们花了一整轮做公网压测,把这套系统的极限、天花板和杠杆全摸清了。这篇把"吞吐 / 延迟 / 排队"这三个最容易混的概念讲透,配我们自己的真实实测数据。 一句话结论 我们这套系统的吞吐天花板 ≈ 76 req/s。 往里塞再多并发(100、200、300、500),每秒"做完"的还是大约 76 个,多出来的全在排队。系统不会崩,只会让每个人等得更久。 天花板能不能抬?

By ladydd

四卡 3090 本地模型部署复盘:Ollama 跑通 35B,以及 GPU0 掉卡问题

这次做的是一轮真实的本地模型部署摸底。 目标不是搭一个临时 Demo,而是把一台四卡 3090 GPU 机器接进自己的日常 AI 使用环境:本机跑 Open WebUI,负责账号、会话和前端配置;GPU 机器只负责模型推理。这样以后换模型、换推理框架、重启服务,都尽量不影响本机的使用入口。 最后结论比较清楚:qwen3.5:35b 的 GGUF Q4_K_M 量化版已经通过 Ollama 跑通,本机 Open WebUI 可以接入,热加载后的聊天速度也能用;但 GPU0 存在明显稳定性问题,重启后能短暂恢复,跑过负载后又会掉到 NVML 异常状态。 状态快照 当前能用的部分: * 本机 Open WebUI 已部署,

By ladydd

面向 AI Agent 的 ClickHouse 集群调优实战:从病根定位到"近乎白捡"

我们最近把一套面向 AI agent 的分析型数据服务,从单机迁到了 ClickHouse 集群(1 分片 × 3 副本 + HAProxy 入口),并做了一轮系统的性能调优。 这篇不止于"我们改了哪些参数",更想讲清楚背后的思路:怎么用数据定位病根、怎么在"空间/复杂度/收益"之间取舍、怎么做到改完能验证、出事能秒回滚、上线不断服务。如果你也在为高重复、只读、模板化的负载(AI agent、看板、报表 API)调 ClickHouse,这套方法可以直接借鉴。 一条主线贯穿全文:先吃透流量特征,再分层优化,每一步都可验证、可回滚。 一、起点:先吃透你的流量长什么样 任何优化的第一步不是动手,

By ladydd
陕公网安备61011302002223号 | 陕ICP备2025083092号