自组织映射SOM:无监督聚类与降维的Python实战指南
简介这份资源提供完整的自组织映射SOM算法Python实现面向机器学习初学者与需要聚类、降维及可视化实践的开发者。SOM作为经典无监督神经网络可将高维数据映射到二维网格并保持拓扑结构代码覆盖网络初始化、BMU查找、权重更新等核心流程并支持高斯、墨西哥帽、气泡三种邻域函数与指数、线性两种衰减策略。压缩包共31个文件约3.55MB以9个py源码文件为主体搭配10张png可视化结果图、5个csv示例数据集及说明文档结构清晰便于按模块学习。示例涵盖螺旋数据聚类、鸢尾花降维、RGB颜色聚类与参数比较输出权重网格、U-Matrix、激活图及训练历史等图像并提供量化误差、拓扑误差、邻域保持度等评估指标。已有84人学习适合希望从代码层面理解SOM并快速复现实验的读者。1. 自组织映射SOM为什么它能在无标签数据里同时干聚类和降维手上有一批没有标签的数据可能是用户行为特征也可能是传感器采集的多维信号。你想看看里面有没有天然的分群又想把高维结构画到二维平面上直观感受一下。k-means 需要你预先指定簇数PCA 降维后得到的成分往往缺乏可解释的物理含义。自组织映射Self-Organizing MapSOM是我在遇到这类需求时经常拿出来的工具——它属于无监督神经网络的一种能在训练过程中同时完成向量量化和拓扑保序映射说白了就是一边聚类、一边把高维数据压到低维网格上而且保留原始空间中样本之间的邻接关系。SOM 和普通的前馈神经网络不同它没有反向传播的梯度计算用的是竞争学习策略。每个输出神经元代表一个原型向量训练时找到与输入最匹配的那个神经元BMUBest Matching Unit然后把它和它邻域内的神经元一起往输入样本的方向拉。这个过程反复迭代最终整个网格会形成一张对输入分布有拓扑保持能力的“地图”。对于做聚类和降维可视化的场景SOM 最大的价值在于你不需要标签不需要预设簇数量训练完之后直接看 U-Matrix 就能判断哪些区域是边界、哪些区域是簇心。Python 生态里MiniSom是最轻量的实现之一几行代码就能跑通一个可用的模型。接下来我会从原理到代码到调参到踩坑把这条链路完整走一遍。2. SOM 的训练逻辑与 Python 实现路径2.1 竞争学习、邻域函数与权重更新SOM 的核心机制可以拆成三步竞争、合作、适应。竞争阶段对每个输入样本 x计算它与所有输出神经元权重向量 w_i 的距离通常用欧氏距离距离最小的那个神经元获胜成为 BMU。合作阶段BMU 会带着它的邻居一起更新邻居的范围由邻域函数决定最常见的是高斯邻域距离 BMU 越远的神经元受到的影响越小。适应阶段按照学习率和邻域半径对权重进行更新。权重更新公式是w_i(t1) w_i(t) η(t) · h_{c,i}(t) · (x - w_i(t))其中 η(t) 是随时间衰减的学习率h_{c,i}(t) 是邻域函数c 是 BMU 的索引。学习率和邻域半径都随迭代次数衰减前期大步调整拓扑结构后期精细微调。这个衰减策略直接决定了最终映射的质量——衰减太快网格还没铺开就固化了衰减太慢训练结束时还在震荡。拓扑结构上常见的有六边形网格和矩形网格。六边形网格的邻居关系更均匀可视化时边界伪影少一些但矩形网格在代码实现和索引操作上更直观。我一般先用矩形网格快速验证如果发现簇边界模糊再换六边形。2.2 用 MiniSom 跑通第一个聚类与可视化安装 MiniSom 只需要一条命令pip install minisom下面是一个完整的可运行示例用 sklearn 自带的鸢尾花数据集做聚类和降维可视化import numpy as np import matplotlib.pyplot as plt from minisom import MiniSom from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler # 加载数据并归一化到 [0,1]SOM 对尺度敏感 iris load_iris() X iris.data scaler MinMaxScaler() X_scaled scaler.fit_transform(X) # 初始化 SOM输出层 10x10 网格输入维度 4 som MiniSom( x10, y10, input_len4, sigma1.0, # 初始邻域半径 learning_rate0.5, # 初始学习率 neighborhood_functiongaussian, topologyrectangular, random_seed42 ) # 随机初始化权重 som.random_weights_init(X_scaled) # 训练10000 次迭代 som.train_random(X_scaled, num_iteration10000, verboseFalse) # 获取每个样本的 BMU 坐标 winner_coordinates np.array([som.winner(x) for x in X_scaled]) # 绘制 U-Matrix统一距离矩阵 plt.figure(figsize(10, 8)) plt.pcolor(som.distance_map().T, cmapbone_r) plt.colorbar(labelDistance) # 在 U-Matrix 上叠加样本点按真实标签着色 markers [o, s, D] colors [r, g, b] for i, x in enumerate(X_scaled): w som.winner(x) plt.plot(w[0] 0.5, w[1] 0.5, markers[iris.target[i]], markeredgecolorcolors[iris.target[i]], markerfacecolorNone, markersize10, markeredgewidth2) plt.title(SOM U-Matrix with Iris Samples) plt.show()这段代码的逻辑链条是先归一化消除量纲影响再初始化一个 10×10 的 SOM 网格每个神经元有一个 4 维权重向量。train_random每次随机抽一个样本做竞争和更新10000 次迭代后权重收敛。som.winner(x)返回样本对应的 BMU 坐标这个坐标就是降维后的二维表示。U-Matrix 展示的是每个神经元与邻居的平均距离颜色越亮表示距离越大通常对应簇与簇之间的边界。参数方面sigma1.0控制初始邻域半径网格是 10×10 的话1.0 大约覆盖相邻一圈的神经元。learning_rate0.5是初始值MiniSom 内部会按指数衰减。num_iteration一般取样本数的 50 到 500 倍数据量大时适当降低倍数。random_seed固定后结果可复现这在调参对比时很重要。2.3 从 BMU 坐标到聚类标签量化误差与簇分配SOM 训练完之后每个样本都映射到了网格上的某个神经元。但网格上的神经元数量通常远少于样本数所以多个样本会共享同一个 BMU。这时候有两种做法一种是把每个 BMU 当作一个微簇再用层次聚类把相邻的 BMU 合并成更大的簇另一种是直接对 BMU 的权重向量做 k-means得到最终的簇标签。我一般用第二种因为 BMU 权重向量已经是对原始数据分布的一种压缩表示在上面跑 k-means 比在原始高维空间跑更稳定。代码示例如下from sklearn.cluster import KMeans # 获取所有 BMU 的权重向量 weights som.get_weights().reshape(-1, 4) # 对权重向量做 k-means假设聚成 3 类 kmeans KMeans(n_clusters3, random_state42, n_init10) cluster_labels kmeans.fit_predict(weights) # 把簇标签映射回每个样本 sample_clusters np.array([ cluster_labels[w[0] * 10 w[1]] for w in winner_coordinates ]) # 计算量化误差每个样本到其 BMU 的距离均值 quantization_error np.mean([ np.linalg.norm(x - som.get_weights()[som.winner(x)]) for x in X_scaled ]) print(fQuantization Error: {quantization_error:.4f})量化误差是衡量 SOM 拟合质量的核心指标值越小说明 BMU 权重向量越贴近输入样本。如果量化误差偏大可能是网格太小、迭代次数不够或者学习率衰减过快。拓扑误差则是衡量邻接保持能力的指标计算方式是看每个样本的 BMU 和次优 BMU 在网格上是否相邻不相邻的比例就是拓扑误差。这两个指标配合看基本能判断模型有没有训练到位。3. 参数调优网格尺寸、学习率与邻域半径的配合3.1 网格尺寸怎么定从数据量和簇数反推网格尺寸是 SOM 最关键的参数之一。太小多个真实簇会被挤到同一个神经元上量化误差降不下来太大网格会过度稀疏很多神经元成为“死神经元”永远不更新。经验公式是网格神经元总数约为样本数的 5 到 20 倍开平方。比如 150 个样本5×5 到 10×10 比较合适10000 个样本50×50 到 100×100 是常见范围。但样本量只是起点还要看数据的固有维度。如果数据本身簇结构清晰小网格也能分开如果簇之间边界模糊需要更大的网格来提供足够的分辨率。我通常的做法是先用一个中等尺寸比如 15×15跑一遍看 U-Matrix 上有没有明显的亮带分隔区域。如果整个 U-Matrix 颜色均匀说明网格不够大或者数据本身没有明显簇结构。另一个判断依据是死神经元比例。训练完后统计每个神经元被激活的次数如果超过 30% 的神经元从未成为 BMU说明网格过大或者初始化有问题。MiniSom 的random_weights_init从数据中随机采样初始化权重比纯随机初始化更不容易产生死神经元。3.2 学习率与邻域半径的衰减策略学习率和邻域半径的衰减曲线直接决定了训练过程的稳定性。MiniSom 默认使用指数衰减η(t) η₀ · exp(-t / τ)其中 τ 是时间常数由总迭代次数决定。初始学习率一般设 0.5 到 1.0最终学习率在 0.01 左右。邻域半径初始值通常设为网格对角线长度的一半最终衰减到 0.5 到 1.0 左右。如果发现训练过程中量化误差震荡不收敛大概率是学习率衰减太慢。可以手动传入decay_function参数MiniSom 支持linear、exponential和inverse三种。我一般用指数衰减因为它在前期快速下降、后期平稳符合 SOM 从粗调到细调的需求。邻域函数的选择上高斯函数是最常用的但如果你希望训练更快收敛可以用bubble邻域它只更新半径内的神经元计算量小但拓扑保持能力稍弱。mexican_hat邻域在某些数据集上能产生更清晰的簇边界但参数更敏感新手不建议一上来就用。3.3 用 U-Matrix 和命中图判断聚类质量U-Matrix 是 SOM 可视化的核心工具。它的每个像素值是该神经元与所有直接邻居的平均距离。距离大意味着这个神经元处在簇的边界上距离小意味着它和邻居很相似处在簇的内部。看 U-Matrix 时找那些形成连续亮带的区域它们就是簇之间的分界线。命中图Hit Map则是统计每个神经元被多少个样本命中。把 U-Matrix 和命中图叠在一起看如果某个区域在 U-Matrix 上颜色暗距离小且在命中图上密度高那它就是一个可靠的簇心。如果某个神经元在 U-Matrix 上很亮但命中图上也有不少样本说明这个区域可能是噪声或者过渡带。# 绘制命中图 hit_map np.zeros((10, 10)) for w in winner_coordinates: hit_map[w[0], w[1]] 1 plt.figure(figsize(10, 8)) plt.pcolor(hit_map.T, cmapBlues) plt.colorbar(labelHit Count) plt.title(SOM Hit Map) plt.show()这两个图配合使用基本能替代一部分人工检查的工作。如果 U-Matrix 上亮带清晰、命中图上簇心突出那聚类结果大概率是可靠的。反之如果 U-Matrix 一片模糊、命中图均匀分布要么是数据本身没有簇结构要么是 SOM 参数没调好。4. 避坑与排查SOM 落地时最容易翻车的五个地方4.1 数据未归一化导致某个维度主导距离计算现象训练出来的 SOM 把所有样本都映射到网格的同一个角落U-Matrix 几乎全是亮的看不出任何簇结构。原因SOM 用欧氏距离找 BMU如果某个特征的数值范围是 0 到 10000另一个是 0 到 1前者会完全主导距离计算后者相当于不存在。解决训练前必须做归一化。MinMaxScaler把每个维度压到 [0,1] 是最常用的做法。如果数据有极端离群值改用StandardScaler或者先做对数变换。记住SOM 对尺度敏感程度不亚于 k-means。4.2 网格过大产生大量死神经元现象训练完后统计发现超过一半的神经元从未被激活U-Matrix 上大片区域颜色异常。原因网格尺寸远超数据的内在维度所需或者初始化权重全部集中在某个小区域导致竞争阶段只有少数神经元能获胜。解决先用som.random_weights_init(X_scaled)从数据中采样初始化而不是用som.random_weights_init的默认随机初始化。如果死神经元比例仍然高缩小网格尺寸或者增加迭代次数。判断标准死神经元比例控制在 10% 以内比较健康。4.3 学习率衰减过快导致拓扑结构未展开现象U-Matrix 上簇边界模糊量化误差偏大但增加迭代次数也没有明显改善。原因学习率或邻域半径衰减太快训练早期网格还没来得及铺开就固化了后续迭代只能做微小调整。解决检查 MiniSom 的sigma和learning_rate初始值是否合理。10×10 网格的sigma初始值建议在 1.0 到 2.0 之间learning_rate在 0.5 到 1.0 之间。如果还是不行手动传入decay_functionlinear让衰减更平缓。4.4 把 BMU 坐标直接当聚类标签用现象用 BMU 坐标做下游任务时效果很差比如分类器准确率远低于预期。原因BMU 坐标是二维网格位置相邻坐标之间的欧氏距离并不直接对应原始空间中的相似度。两个样本的 BMU 坐标相邻不代表它们在原始空间中就相似。解决如果需要聚类标签对 BMU 的权重向量做 k-means 或层次聚类而不是对坐标做。如果需要降维后的特征向量用 BMU 的权重向量代替坐标。坐标只适合做可视化不适合做数值特征。4.5 忽略随机种子导致结果不可复现现象每次重新运行代码U-Matrix 和聚类结果都不一样调参时无法判断是参数变了还是随机性导致的。原因SOM 的权重初始化和训练时的样本抽样都是随机的不固定种子的话每次结果都不同。解决初始化 MiniSom 时传入random_seed42并且在train_random之前调用som.random_weights_init时也固定 numpy 的随机种子。调参对比时固定种子是基本前提否则你调的不是参数是玄学。5. 进阶技巧用 SOM 做高维数据的可视化与异常检测5.1 把 SOM 当降维器与 PCA、t-SNE 的配合使用SOM 降维和 PCA、t-SNE 的定位不同。PCA 是线性投影擅长保留全局方差结构t-SNE 擅长保留局部邻接关系适合可视化但计算量大SOM 介于两者之间既能保留拓扑结构又能直接给出聚类结果。我通常先用 PCA 把维度降到 50 以下再喂给 SOM这样能显著减少训练时间同时过滤掉一部分噪声。from sklearn.decomposition import PCA # 先用 PCA 降到 20 维 pca PCA(n_components20, random_state42) X_pca pca.fit_transform(X_scaled) # 再用 SOM 做聚类和可视化 som MiniSom(x15, y15, input_len20, sigma1.5, learning_rate0.5, random_seed42) som.random_weights_init(X_pca) som.train_random(X_pca, num_iteration20000)这个组合在高维数据上特别实用。PCA 负责去冗余SOM 负责拓扑映射和聚类。注意 PCA 之后仍然要做归一化因为 PCA 各主成分的方差不同不归一化的话第一主成分会主导距离计算。5.2 基于量化误差的异常检测SOM 还有一个被低估的用法异常检测。正常样本在训练后会映射到 BMU 附近量化误差小异常样本因为和所有 BMU 的权重向量都距离较远量化误差会明显偏大。设定一个阈值超过阈值的样本就标记为异常。# 计算每个样本的量化误差 qe np.array([ np.linalg.norm(x - som.get_weights()[som.winner(x)]) for x in X_pca ]) # 用 95 分位数作为阈值 threshold np.percentile(qe, 95) anomalies X_pca[qe threshold] print(fDetected {len(anomalies)} anomalies out of {len(X_pca)} samples)阈值的选择取决于你对异常比例的预期。如果业务上异常占比大约 5%用 95 分位数如果异常很稀少用 99 分位数。这个方法的优势是不需要标签而且能给出每个样本的异常分数方便排序和人工复核。5.3 增量训练与在线更新的注意事项MiniSom 支持train和train_random两种模式后者每次随机抽一个样本更新适合在线学习场景。但增量训练有个坑如果新数据的分布和旧数据差异很大直接更新权重会导致旧知识被覆盖。我一般会保留一个验证集每次增量更新后检查量化误差有没有突增。如果突增说明新数据分布偏移太大需要重新训练而不是增量更新。另外MiniSom 的train_random在增量场景下需要手动控制学习率因为默认的衰减策略是按总迭代次数算的。如果分多次调用每次的学习率都会从初始值重新开始导致后期更新幅度过大。解决办法是每次调用时传入较小的learning_rate或者自己实现衰减逻辑。5.4 一个我常用的调参习惯我调 SOM 参数时习惯先固定random_seed然后按这个顺序调先定网格尺寸看死神经元比例和 U-Matrix 的簇分离度再调sigma初始值看拓扑误差最后调learning_rate和迭代次数看量化误差的收敛曲线。每次只动一个参数记录量化误差和拓扑误差的变化。这套流程走下来基本能在半小时内找到一个可用的配置。踩过最深的坑是一次做用户分群数据没归一化就直接跑 SOM结果所有用户都被映射到网格的同一个角落U-Matrix 一片白。排查了半天以为是网格太小后来发现是某个特征的范围是 0 到 100000完全主导了距离计算。从那以后我养成了一个习惯任何距离-based 的算法第一步永远是检查数据尺度。希望这个经验能帮你少走一段弯路。本文还有配套的精品资源点击获取

相关新闻

哈希算法在系统安全中的关键作用:从密码存储到完整性校验

哈希算法在系统安全中的关键作用:从密码存储到完整性校验

你有没有遇到过这样的情况:下载一个软件安装包时,官网页面会贴出一串长长的十六进制字符,比如e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855。大多数人都把这串字符当成可有可无的“官网装饰”,但你有没有想…

2026/10/12 9:43:27 阅读更多 →
Java函数复写深度解析:从语法规则到Android实战避坑

Java函数复写深度解析:从语法规则到Android实战避坑

1. 从一次编译报错说起:为什么函数复写值得单独拎出来讲刚接触Java4Android那会儿,我写了一个继承自父类的子类,想当然地给某个方法换了个参数类型,以为这就是"复写"。结果运行起来,程序走的还是父类的逻辑&…

2026/10/12 9:43:27 阅读更多 →
JSP+MySQL构建BBS论坛:核心架构与完整开发实战

JSP+MySQL构建BBS论坛:核心架构与完整开发实战

简介:基于JSP与MySQL构建的BBS论坛项目源码包,面向正在学习Java Web开发的学生与开发者,完整演示了论坛系统的核心业务流程:用户注册登录、板块管理、主题发帖、回复互动、关键词搜索以及后台权限控制等。包内共493个文件&#xf…

2026/10/12 9:43:27 阅读更多 →

最新新闻

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

Git+Repo+Gerrit代码评审服务器搭建实战:多仓库协作与权限管理

简介:本资源是一份面向运维工程师、后端开发及代码管理初学者的代码评审服务器搭建文档,围绕 Git、Repo 与 Gerrit 三大工具,讲解如何从零构建一套功能完整的代码服务器,解决团队代码托管、多仓库统一管理与代码评审流程落地的问题…

2026/10/12 10:21:08 阅读更多 →
零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

零侵入监控:node_exporter、mtail 与 Prometheus、Grafana 组合实战

1. 先统一认知:node_exporter、mtail、Prometheus、Grafana 各管哪一段我见过很多团队做监控,第一反应是“先装一套 Prometheus Grafana”,装上之后发现只有 CPU、内存、磁盘这些机器指标,业务到底跑得好不好完全看不见。后来有人…

2026/10/12 10:21:08 阅读更多 →
Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

Wi-FiTestSuite Control API v10.12.0规范解析:面向Wi-Fi 6E自动化测试的会话化控制

简介:本资源是Wi-Fi联盟官方发布的《Wi-Fi Test Suite Control API Specification Version 10.12.0》PDF规范文档,面向Wi-Fi设备认证工程师、无线协议开发者及测试工具集成人员,用于指导Wi-Fi认证测试套件的开发、调试与合规性验证。文档系统…

2026/10/12 10:21:08 阅读更多 →
安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17 Beta版修复待机耗电:原理、实测与开发者适配指南

安卓17最新Beta版的推送消息出来后,论坛上不少刷过测试版的人开始讨论同一个话题:这次官方终于对“待机耗电”动手了。说实话,“Beta版更新修复耗电”并不是新闻,每代大版本更新都会经历类似的阶段,但这次修复的幅度和…

2026/10/12 10:21:08 阅读更多 →
Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

Spring事务失效陷阱:Closing non transactional SqlSession排查与修复

1. 从一个诡异的线上故障说起"Closing non transactional SqlSession"——这行日志第一次出现在我视野里的时候,是一个再普通不过的周三下午。某个业务系统在批量处理数据时,偶发地出现部分数据写入成功、部分数据回滚的诡异现象。日志里没有明…

2026/10/12 10:21:08 阅读更多 →
Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

Nginx基于IP的虚拟主机配置:多IP绑定、listen指令与踩坑实战

做运维这些年,配置虚拟主机绝大多数时候都在跟域名打交道,但有一类需求绕不开基于IP的场景:客户拿着独立IP的SSL证书要求绑定;内网有多套环境要用不同IP做物理隔离;服务器上买了多个公网IP想分别承载不同业务。今天把基…

2026/10/12 10:20:06 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →