AutoPlait Python实现:无需平滑的时间序列自动分段与聚类

简介:这份资源是AutoPlait(SIGMOD'14)的Python实现,面向从事时间序列挖掘、模式发现与变化点检测的研究者与工程师。AutoPlait针对大量共同演化时间序列,能在无参数、无需训练与调参的前提下自动完成分割与摘要,且与输入规模呈线性关系,适合处理多序列聚类、时序分段等场景。当前版本不含平滑算法,更贴近原始算法逻辑,便于理解核心流程。资源包共8个文件,约281KB,包含Python主程序、Shell运行脚本、示例数据文件、结果示意图、说明文档及Git忽略配置,其中数据文件用于演示多序列输入,脚本可直接复现实验流程。已有463人学习下载,说明其在时序挖掘方向具有一定关注度。读者可借此获得可运行的算法实现、示例数据与结果图,用于复现论文效果、对比自身方法或作为二次开发的基础,尤其适合需要快速验证自动摘要与变化点检测思路的中高级开发者。

1. 时间序列自动分段这件事,AutoPlait 的 Python 实现到底能帮你省多少事

如果你手头有一堆传感器日志、业务指标曲线或者运维监控数据,想自动找出「哪几段是同一类行为模式」,又不想先做平滑、不想手工定阈值,那 AutoPlait 这个思路值得花时间拆一遍。它是 SIGMOD'14 上提出的一种时间序列自动摘要与聚类方法,核心卖点就一句话:不需要平滑预处理,直接在原始序列上做分段和聚类,把一条长曲线压缩成若干段「模式标签」。这份资源是它的 Python 实现,定位很明确——给做时序分析、异常检测、行为识别的开发者一个能跑、能改、能嵌进自己 pipeline 的代码底座。适合谁?适合已经会用 numpy/pandas 做基础时序处理,但被「分段点怎么定、聚类数怎么选」折磨过的人。

2. 项目定位与技术选型:为什么它敢说「无需平滑」

2.1 它解决的不是预测,而是「摘要」

大多数时序库把精力放在预测上,ARIMA、Prophet、LSTM 那一套。AutoPlait 走的是另一条路:给你一条长度为 N 的序列,输出的是若干个连续区间,每个区间打上一个模式编号,模式编号相同代表这两段「行为相似」。这本质上是分段(segmentation)加聚类(clustering)的联合问题。传统做法是先平滑去噪,再滑窗提特征,再聚类,最后把聚类结果映射回时间轴——每一步都会引入误差,平滑窗口选大了丢细节,选小了噪声全进来。AutoPlait 的设计动机就是绕开这个链条,用概率模型直接对原始观测建模,分段和聚类一起推断。

从工程角度看,这个定位决定了它的输入输出非常干净:输入是一维或多维浮点序列,输出是分段边界加模式标签。你不需要准备标签,不需要指定聚类个数,模型自己根据数据决定。这对探索性分析特别友好——很多时候你根本不知道这段数据里有几种模式。

2.2 技术栈与依赖假设

这份 Python 实现没有绑死某个深度学习框架,走的是数值计算路线。常见做法是 numpy 做矩阵运算、scipy 做统计分布和优化、pandas 做数据加载与结果整理。如果你要可视化分段结果,matplotlib 是顺手的选择。这种选型的直接好处是环境轻,不需要 GPU,一台普通开发机就能跑;代价是当序列特别长(百万点级别)时,纯 Python 循环会成为瓶颈,需要自己用向量化或 numba 加速。

我一般会建议先把依赖锁在一个独立虚拟环境里,因为 scipy 的版本差异有时会影响优化器的收敛行为。下面是一个最小依赖清单的写法:

# 建议 Python 3.9+,避免过老的 scipy 在优化时行为不一致 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install numpy scipy pandas matplotlib

这里没有写具体版本号,是因为不同系统上 wheel 的可用性不一样。原则是 numpy 和 scipy 尽量用较新的稳定版,pandas 只要能和你的数据格式对上就行。装完之后先跑一个python -c "import numpy, scipy; print(numpy.__version__, scipy.__version__)"确认没有报错,再往下走。

2.3 目录结构应该怎么看

拿到一份时序算法实现,我习惯先看三处:入口脚本、核心模型文件、示例数据。入口脚本告诉你「怎么调用」,核心模型文件告诉你「算法怎么实现」,示例数据告诉你「输入长什么样」。这份实现大概率是类似这样的组织方式:

autoplait/ ├── autoplait/ │ ├── __init__.py │ ├── model.py # 核心:分段+聚类的联合推断 │ ├── segment.py # 分段相关的似然计算与边界搜索 │ ├── cluster.py # 模式聚类与参数更新 │ └── utils.py # 数据加载、结果格式化 ├── examples/ │ ├── demo_basic.py # 最小可跑示例 │ └── data/ # 示例序列文件 ├── tests/ │ └── test_model.py └── README.md

如果你的实际目录和这个不完全一样,不影响理解——关键是找到model.py或同义文件,那里是算法的心脏。segment.py和cluster.py的分工体现了 AutoPlait 的核心思想:分段和聚类不是两个独立阶段,而是交替优化。先假设一组模式参数,据此找最优分段;再固定分段,更新模式参数;循环到收敛。

3. 核心模块拆解:一次推断从数据到标签的完整链路

3.1 数据入口与预处理边界

虽然 AutoPlait 宣称无需平滑,但不代表对输入格式没有要求。最常见的坑是时间轴不等距、缺失值用 0 填充、多列量纲差异巨大。这三件事不处理,模型跑出来的分段基本没有参考价值。我一般会在进入模型前做三件事:确认采样间隔一致、缺失值用插值而不是填零、多维度做标准化。

import numpy as np import pandas as pd def load_series(path, time_col="timestamp", value_cols=None): """ 加载时序数据并做最小预处理。 time_col: 时间列名,用于检查采样间隔 value_cols: 参与建模的数值列,None 表示除时间列外全部 """ df = pd.read_csv(path, parse_dates=[time_col]) df = df.sort_values(time_col).reset_index(drop=True) if value_cols is None: value_cols = [c for c in df.columns if c != time_col] # 检查采样间隔是否大致均匀,不均匀会直接影响分段似然 diffs = df[time_col].diff().dropna().dt.total_seconds() if diffs.std() > 0.1 * diffs.mean(): print("警告:采样间隔不均匀,建议先重采样到固定频率") # 缺失值用线性插值,不要填 0,0 会被模型当成真实观测 df[value_cols] = df[value_cols].interpolate(method="linear").bfill().ffill() # 多列标准化,避免量纲大的列主导似然 values = df[value_cols].values.astype(float) mean, std = values.mean(axis=0), values.std(axis=0) std[std == 0] = 1.0 values = (values - mean) / std return values, df[time_col].values

这段代码里三个参数值得注意:time_col决定你能不能发现采样间隔问题;value_cols让你可以只选真正想分析的维度,避免无关列干扰聚类;标准化那一步的std == 0保护是防止某一列恒定导致除零。逻辑上,预处理的目标不是「洗干净」,而是「让模型的似然假设成立」——AutoPlait 假设观测在给定模式下有稳定的分布,量纲和缺失值会直接破坏这个假设。

3.2 分段与聚类的联合推断

核心循环可以概括成:给定当前模式参数,用动态规划找最优分段;给定分段,用最大似然更新每个模式的参数。这个交替过程类似 EM 算法,但分段边界是离散的,所以用动态规划而不是梯度。

import numpy as np from scipy.stats import norm def segment_dp(values, mode_params, max_len=None): """ 动态规划找最优分段。 values: (T, D) 标准化后的序列 mode_params: 每个模式的 (mean, var),列表形式 max_len: 单段最大长度,None 表示不限制 返回: 分段边界列表和每段模式标签 """ T = len(values) K = len(mode_params) # cost[t] 表示前 t 个点的最小负对数似然 cost = np.full(T + 1, np.inf) cost[0] = 0.0 back = np.zeros(T + 1, dtype=int) # 记录最优前驱 back_mode = np.zeros(T + 1, dtype=int) # 记录最优模式 for t in range(1, T + 1): start_min = 0 if max_len is None else max(0, t - max_len) for s in range(start_min, t): seg = values[s:t] for k, (mu, var) in enumerate(mode_params): # 该段在该模式下的负对数似然 ll = -np.sum(norm.logpdf(seg, loc=mu, scale=np.sqrt(var))) c = cost[s] + ll if c < cost[t]: cost[t] = c back[t] = s back_mode[t] = k # 回溯 bounds, labels = [], [] t = T while t > 0: s = back[t] bounds.append((s, t)) labels.append(back_mode[t]) t = s bounds.reverse() labels.reverse() return bounds, labels

这段是理解成本最高的部分,几个点拆开说。cost[t]是前 t 个点的最小代价,代价用负对数似然衡量,越小说明拟合越好。内层对每个可能的起点s和每个模式k算一次似然,所以复杂度是 O(T²·K),序列很长时会慢。max_len是工程上最实用的参数——限制单段最大长度,既加速又防止模型把整条序列判成一段。back和back_mode是回溯用的,动态规划只算代价不记录路径的话,最后拿不到分段结果。

模式参数更新那一步相对直接:把当前分到同一模式的所有段拼起来,重新估计均值和方差。

def update_modes(values, bounds, labels, K): """根据当前分段结果,重新估计每个模式的均值和方差""" sums = [np.zeros(values.shape[1]) for _ in range(K)] sq_sums = [np.zeros(values.shape[1]) for _ in range(K)] counts = [0] * K for (s, e), k in zip(bounds, labels): seg = values[s:e] sums[k] += seg.sum(axis=0) sq_sums[k] += (seg ** 2).sum(axis=0) counts[k] += len(seg) params = [] for k in range(K): if counts[k] == 0: # 空模式给一个默认参数,避免除零 params.append((np.zeros(values.shape[1]), np.ones(values.shape[1]))) continue mu = sums[k] / counts[k] var = sq_sums[k] / counts[k] - mu ** 2 var = np.maximum(var, 1e-6) # 方差下限,防止退化成尖峰 params.append((mu, var)) return params

var的1e-6下限是血泪经验:如果不加,某个模式可能收敛到方差接近零,似然变成无穷大,整个模型就崩了。counts[k] == 0的处理也是必须的,否则空模式会让后续计算出现 NaN。

3.3 主循环与收敛判断

把上面两块拼起来就是完整推断。收敛判断一般看总似然的变化,连续两轮变化小于阈值就停。

def fit(values, K=3, max_iter=50, tol=1e-4, max_len=None): """ AutoPlait 主循环。 K: 模式数量,需要事先给定或外层搜索 max_iter: 最大迭代轮数 tol: 收敛阈值 """ # 初始化:用均匀分段粗略估计初始模式参数 T = len(values) init_bounds = [(i * T // K, (i + 1) * T // K) for i in range(K)] init_labels = list(range(K)) params = update_modes(values, init_bounds, init_labels, K) prev_cost = np.inf for it in range(max_iter): bounds, labels = segment_dp(values, params, max_len=max_len) params = update_modes(values, bounds, labels, K) # 计算当前总负对数似然 total = 0.0 for (s, e), k in zip(bounds, labels): mu, var = params[k] total += -np.sum(norm.logpdf(values[s:e], loc=mu, scale=np.sqrt(var))) if abs(prev_cost - total) < tol: print(f"第 {it} 轮收敛,总代价 {total:.2f}") break prev_cost = total return bounds, labels, params

K这个参数是使用门槛:AutoPlait 论文里有一套基于 MDL 的自动选 K 机制,但工程实现里很多人直接给定 K 或者外层循环试几个 K 看效果。max_len建议设成你预期最短模式长度的 2 到 3 倍,太大会让分段变粗,太小会切碎。tol设 1e-4 在标准化数据上一般够用,如果数据噪声大可以放宽到 1e-3。

4. 跑起来:从示例数据到可视化分段结果

4.1 最小可跑示例

假设你已经按第 3 章的load_series拿到了values,下面这段就是端到端跑通的最小代码:

import matplotlib.pyplot as plt # values 来自 load_series,形状 (T, D) bounds, labels, params = fit(values, K=3, max_iter=50, max_len=200) # 把分段结果画出来,只看第一维 fig, ax = plt.subplots(figsize=(12, 4)) ax.plot(values[:, 0], color="lightgray", label="原始序列") colors = ["tab:blue", "tab:orange", "tab:green", "tab:red", "tab:purple"] for (s, e), k in zip(bounds, labels): ax.plot(range(s, e), values[s:e, 0], color=colors[k % len(colors)], linewidth=2) ax.set_title("AutoPlait 分段与聚类结果") ax.legend() plt.tight_layout() plt.savefig("segmentation_result.png", dpi=150)

跑完你会得到一张图:灰色是原始曲线,彩色段是模型判定的不同模式。如果彩色段在视觉上确实对应不同的行为区间,说明参数基本合理;如果颜色乱跳,多半是 K 设大了或者max_len太小。

4.2 参数怎么调

参数作用调大后果调小后果
K模式数量过拟合,段被切得很碎欠拟合,不同模式被合并
max_len单段最大长度分段变粗,可能漏掉短模式分段变碎,计算变慢
max_iter最大迭代轮数收敛更充分,但可能过拟合可能没收敛就停
tol收敛阈值迭代次数减少,结果略粗迭代次数增加,结果更稳

我一般会先用 K=3 到 5 跑一遍看整体结构,再根据可视化结果决定要不要加 K。max_len先设成序列长度的十分之一左右,再微调。

4.3 结果怎么用

bounds和labels是最有用的输出。bounds是(start, end)列表,labels是对应模式编号。你可以把它们转成 DataFrame 做后续分析:

import pandas as pd result = pd.DataFrame({ "start": [b[0] for b in bounds], "end": [b[1] for b in bounds], "mode": labels, }) result["length"] = result["end"] - result["start"] print(result)

这个表可以直接接到你的业务逻辑里:比如 mode 0 代表正常、mode 1 代表异常,那就把 mode 1 的区间拿出来做告警;或者统计每个 mode 的持续时间分布,看哪种行为占主导。

5. 避坑与排查:跑不通时先看这几条

5.1 现象:分段结果全是同一段或每点一段

原因通常是 K 和max_len的组合不合理。K=1 时模型没有选择,整条序列必然是一段;max_len=1时每段最多一个点,自然每点一段。解决方法是先确认 K 大于 1,max_len至少是预期最短模式长度的两倍。如果还是不对,检查数据标准化是否生效——量纲差异过大会让似然被某一维主导。

5.2 现象:迭代过程中总代价变成 NaN

原因多半是某个模式的方差收敛到零,norm.logpdf返回无穷。第 3 章update_modes里的var = np.maximum(var, 1e-6)就是防这个的。如果你自己改写了参数更新逻辑,务必保留方差下限。另一个可能是数据里有 NaN,预处理阶段的插值要确保覆盖所有列。

5.3 现象:跑得特别慢,序列才几万点就卡住

原因是segment_dp的 O(T²·K) 复杂度。几万点还能忍,几十万点就必须优化。常见做法是限制max_len把内层循环截断,或者先用降采样把序列缩到几千点跑出大致分段,再在原分辨率上细化边界。我一般会先看数据量,超过五万点就先降采样。

5.4 现象:每次跑结果都不一样

如果初始化是随机的,结果会有波动。第 3 章的fit用的是均匀分段初始化,结果是确定的。如果你改成了随机初始化,建议固定随机种子,或者多跑几次取总代价最低的那次。另外 scipy 优化器在某些版本上对初值敏感,锁版本能减少这种玄学。

5.5 现象:可视化看着对,但业务上说不通

这通常不是代码问题,而是模式数量 K 和业务语义不匹配。模型只认统计相似性,不认业务含义。解决办法是把result表和业务时间轴对齐,人工检查每个 mode 对应的实际事件,再决定是调整 K 还是换特征维度。有时候加一维业务相关的特征比调 K 更有效。

6. 二次开发:把 AutoPlait 嵌进你自己的 pipeline

6.1 改造方向一:自动选 K

第 3 章的fit要求你给定 K,但实际项目里往往不知道有几个模式。一个实用的做法是外层循环 K 从 1 到 10,每个 K 跑一遍,用 BIC 或 MDL 准则选最优。BIC 的写法是BIC = total_cost + K * D * np.log(T),其中total_cost是收敛后的总负对数似然,D是维度,T是序列长度。选 BIC 最小的 K。这个改造不需要动核心算法,只在fit外面包一层循环。

6.2 改造方向二:在线分段

离线版一次处理整条序列,但监控场景需要流式更新。一个可行的思路是维护一个滑动窗口,窗口内跑fit,只取窗口末尾的分段结果作为当前点的标签,窗口向前滑动。代价是计算量随窗口大小线性增长,需要控制窗口长度。另一个思路是用已收敛的模式参数对新来的点做单点似然判断,只有似然低于阈值时才触发重新分段。

6.3 改造方向三:替换分布假设

当前实现用高斯分布,对连续值序列够用。如果你的数据是计数型(比如每分钟请求数),高斯假设不合适,可以换成泊松分布,把norm.logpdf换成poisson.logpmf,参数更新改成泊松的均值估计。这个改动集中在segment_dp和update_modes两个函数里,接口不变。

6.4 验证改造是否正确的习惯

每次改完核心逻辑,我会强制走一遍三步验证:第一步,用一段人工构造的、已知分段和模式的序列跑,看能不能恢复出正确边界;第二步,把 K 设成真实模式数,看收敛后的总代价是否低于随机分段;第三步,在真实数据上跑,把结果和业务事件对齐,至少抽查三个分段边界是否合理。这三步走完,基本能排除大部分低级错误。

从那以后我每次改时序算法的核心循环,都强制先跑人工构造数据验证,再碰真实数据。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

Docker容器技术演进:从资源隔离到应用交付的变革

Docker容器技术演进:从资源隔离到应用交付的变革

我最早接触容器这个概念&#xff0c;是被一个部署事故逼的。那时我维护一个内部工具&#xff0c;前后端加定时任务全装在同一台服务器上&#xff0c;依赖互相打架&#xff0c;升级一个库就要重新编译另一个&#xff0c;每次发布都像拆弹。后来团队引入Docker&#xff0c;把每个…

2026/10/19 17:28:05 阅读更多 →
E3神U+P106矿卡变身AI推理建站服务器实战

E3神U+P106矿卡变身AI推理建站服务器实战

坐拥 E3 神U 和 P106 矿卡这两块二手市场的大热门&#xff0c;把这套配置改造成一台集 AI 推理与建站于一体的全能服务器&#xff0c;是很多折腾党都想干的事。E3 的多核生产力在百元价位几乎没有对手&#xff0c;P106 这块被矿潮埋没的显卡又恰好拥有大显存和高吞吐量的底子&a…

2026/10/19 17:27:01 阅读更多 →
ROS多版本OpenCV共存实战:从符号冲突到RPATH隔离的完整方案

ROS多版本OpenCV共存实战:从符号冲突到RPATH隔离的完整方案

简介&#xff1a;这份资源面向在Ubuntu 20.04上使用ROS Noetic的开发者&#xff0c;尤其是需要运行依赖旧版OpenCV的开源算法、又不愿破坏系统默认OpenCV 4.2.0环境的用户。教程围绕多版本OpenCV与cv_bridge共存展开&#xff0c;涵盖依赖安装、OpenCV 3及contrib库源码编译、依…

2026/10/19 17:27:01 阅读更多 →

最新新闻

从零实现轻量级图表编辑器:Canvas渲染与数据驱动架构解析

从零实现轻量级图表编辑器:Canvas渲染与数据驱动架构解析

图表设计工具这类项目&#xff0c;名字叫 "diagram-design" 的其实蛮多的&#xff0c;但真正能让人愿意截图发出来的产品很少。我这次想聊的&#xff0c;是我自己从零搭起来的一个轻量级图表设计方案——一个跑在浏览器里的流程图、架构图编辑器。核心思路很简单&…

2026/10/19 18:04:45 阅读更多 →
从性能瓶颈到Canvas渲染:Vue 3打造高性能Markdown编辑器

从性能瓶颈到Canvas渲染:Vue 3打造高性能Markdown编辑器

直接从标题说开去。我最近在技术社区里看到这个开源项目时&#xff0c;第一反应是"又一个Canvas编辑器轮子"&#xff0c;但仔细看完性能和实现思路之后&#xff0c;忍不住动手折腾了一把。基于 Vue 3 Canvas 的高性能 Markdown 编辑器&#xff0c;宣称性能提升 10-4…

2026/10/19 18:04:45 阅读更多 →
ESP32量产级固件基座:OTA+BLE Mesh+低功耗唤醒一体化方案

ESP32量产级固件基座:OTA+BLE Mesh+低功耗唤醒一体化方案

简介&#xff1a;本资源是小智源码项目1.5.6_2版本的完整嵌入式开发包&#xff0c;面向ESP32系列&#xff08;含ESP32-S3、ESP32-C3&#xff09;硬件平台的IoT开发者与嵌入式学习者&#xff0c;聚焦于LCD驱动适配、触摸屏交互、多设备兼容性支持及低功耗感知应用开发。压缩包共…

2026/10/19 18:04:45 阅读更多 →
数字手工艺:材料数据驱动的创作闭环

数字手工艺:材料数据驱动的创作闭环

1. 项目概述&#xff1a;从“artcraft”这个词开始&#xff0c;我们到底在做什么&#xff1f;“artcraft”这个词乍看像一个合成词——art&#xff08;艺术&#xff09; craft&#xff08;工艺&#xff09;&#xff0c;但它不是某个具体软件、平台或开源项目的官方名称&#xf…

2026/10/19 18:04:45 阅读更多 →
从需求拆解到工具选型:架构图与流程图设计实战指南

从需求拆解到工具选型:架构图与流程图设计实战指南

1. diagram-design 到底在解决什么问题如果你也做过技术方案评审、给团队画过架构图、或者给开源项目写文档&#xff0c;那你大概率绕不开 diagram-design 这个词。说白了&#xff0c;这不是“会用某个画图软件”的层面&#xff0c;而是指一套把复杂逻辑转化为视觉图形的方法论…

2026/10/19 18:04:45 阅读更多 →
STM32智能交通灯系统:自适应车流、紧急干预与Proteus仿真实战

STM32智能交通灯系统:自适应车流、紧急干预与Proteus仿真实战

简介&#xff1a;本资源是一套基于STM32F103系列单片机的智能交通灯系统完整开发包&#xff0c;面向嵌入式初学者、电子信息类专业学生及课程设计实践者&#xff0c;解决交通灯控制逻辑实现、硬件仿真验证与工程代码落地等核心学习痛点。压缩包共370个文件&#xff0c;涵盖105个…

2026/10/19 18:03:37 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →