DNGM(1,1)离散灰色模型:小样本预测的Python实战与GM(1,1)对比

做数据分析的人,大概率都撞上过同一个尴尬:想预测下个月或者下一周期的数值,手里却只有五六个、七八个历史样本。经典统计模型要求大样本,深度学习更是无底洞式地吃数据,这俩在“贫数据”面前基本束手无策。灰色预测就是专门应对这种场景的,而灰色预测里最出名的当属 GM(1,1) 模型。但我在实际项目里用 GM(1,1) 时,总被一个问题反复折磨——它用微分方程建模,拿离散数据预测,中间那一层转换常常引入系统性偏差。后来接触到 DNGM(1,1) 离散灰色模型,算是找到了一个更贴合数据本性的版本。这篇文章我会从原理到实战拆开来讲,内容包括 GM(1,1) 到底踩了哪些坑、DNGM(1,1) 如何绕开这些坑、Python 从零实现全过程,以及我在真实数据集上跑出来的精度指标和踩坑记录。适合刚开始上手预测建模的新手,也适合想把现有小样本预测工具升级一轮的数据从业者。

1. 灰色预测到底解决什么问题,GM(1,1) 又差在哪儿

1.1 灰色系统的建模思路

灰色系统理论的核心观点并不复杂:现实世界里的数据,多半既不是完全已知的“白色”,也不是一无所知的“黑色”,而是部分已知、部分未知的“灰色”。比如你手里只有某产品过去六期的销量,这些历史数字是已知的;但销量为什么涨、受了哪些因素干扰,你是不知道的。灰色模型不打算把因果关系查个水落石出,而是直接在序列自身的演化规律上做文章。

灰色预测最有名的操作叫累加生成,写作 1-AGO。原始序列 x(0) 可能忽高忽低、看着毫无规律,但做一次累加之后,累积序列 x(1) 通常会变成一条光滑的上升曲线。比如原始销量 [10.2, 11.8, 13.5, 16.1, 19.6, 24.3],累加后变成 [10.2, 22.0, 35.5, 51.6, 71.2, 95.5],几乎就是一条单调增长的平滑轨迹。把不规则的原始数据“抹平”成规则序列,用指数或递推结构去拟合,最后再累减还原到原始口径,这就是整个灰色预测的逻辑闭环。

这套思路最大的价值在于:不依赖大样本,不依赖分布假设,四个以上数据点就能启动建模。在一些实际业务场景里,比如新品上线后的爬坡期销量、供应链里某个新零配件的需求预测,历史数据往往少得可怜,灰色模型往往是少数还能给出合理外推结果的方法。

在展开 DNGM 之前,有必要把经典 GM(1,1) 的建模流程彻底说清楚。因为很多人对 GM(1,1) 只是“会用公式”,并没有真正理解它的缺陷。理解缺陷,才是理解 DNGM 改良意义的前提。

1.2 GM(1,1) 的经典五步

假设原始序列是 x(0) = {x(0)(1), x(0)(2), ..., x(0)(n)},GM(1,1) 的标准建模流程可以分成五步。

第一步,一次累加生成。x(1)(k) = Σ x(0)(i),其中 i 从 1 到 k。这一步是把原始序列转化成累积序列。

第二步,构造紧邻均值序列。z(1)(k) = 0.5 × [x(1)(k) + x(1)(k-1)],k = 2, 3, ..., n。这等于用相邻两个累加点之间的平均值,去近似这段时间里累加序列的积分值,本质上是一种数值积分。

第三步,建立灰微分方程。GM(1,1) 的核心方程是 x(0)(k) + a × z(1)(k) = b。这里的 a 叫做发展系数,b 叫做灰作用量。“GM(1,1)”这个名字的含义就是:一阶方程、一个变量。

第四步,参数估计。把方程写成矩阵形式 Y = B × [a, b]^T,其中 Y 由 x(0)(2) 到 x(0)(n) 组成,B 的第一列是 -z(1)(k),第二列全为 1。然后最小二乘求解 [a, b]^T = (B^T B)^{-1} B^T Y。

第五步,求解白化方程并还原。把离散灰微分方程对应到连续微分方程 dx(1)/dt + a × x(1) = b,解出时间响应函数 x̂(1)(t) = (x(0)(1) - b/a) × e^{-a(t-1)} + b/a。再把 t = 2, 3, ... 代进去得到 x̂(1)(k),最后累减还原 x̂(0)(k) = x̂(1)(k) - x̂(1)(k-1)。

这一套流程看起来环环相扣,问题恰恰就藏在“环环相扣”的缝隙里。

1.3 传统模型的三个硬伤

第一个硬伤是建模空间和预测空间不一致。GM(1,1) 的参数是通过 z(1)(k) 与 x(0)(k) 之间的回归关系拟合出来的,换句话说,参数是在“差分/均值空间”里估计的;但实际预测时,用的却是“累加序列空间”里连续微分方程的解。拟合用的是 B 和 Y,预测用的却是另一个方程,这两个空间之间不存在严格等价关系,误差会在累加-还原的交叉转换中被放大或畸变。

第二个硬伤是连续化过程的跳跃误差。白化方程 dx(1)/dt + a × x(1) = b 描述的是连续系统,可我们手里的数据是离散的。从连续指数解再离散回 t = 2, 3, ... 去取值,等于默认了数据在时间轴上均匀连续地变化,把一个本质离散的过程硬塞进了连续模型。这样解出来的 x̂(1)(k) 并不严格满足原始灰微分方程,这个系统性偏差在学术讨论里常被称作跳跃误差。

第三个硬伤更加隐蔽:紧邻均值序列 z(1)(k) 代替 x(1)(k) 会带来半个周期的滞后。z(1)(k) 是 x(1)(k) 和 x(1)(k-1) 的平均,它天然比 x(1)(k) 落后半拍。当序列不是严格的等比指数增长,而是带有加速或波动时,这种滞后会导致发展系数 a 的估计偏离真值,进而扭曲整个外推趋势。

这三个问题叠加在一起,表现就是:GM(1,1) 在数据比较规整的时候挺好用,一旦数据稍微带点加速、波动或阶段转换,预测结果就出现系统性偏移。很多人在实际项目里抱怨 GM(1,1)“有时准得惊人,有时偏得离谱”,根子就在这三个硬伤上。

2. DNGM(1,1):直接把“微分”换成“差分”

2.1 核心思想的转变

DNGM(1,1) 全称离散灰色模型,对应英文通常写作 Discrete Grey Model (1,1)。它的思路非常直接:既然最终要处理的是离散序列,为什么还要先连续化、再离散化,绕这么一个大圈子?直接在离散域里建立递推关系不行吗?

于是 DNGM(1,1) 把 GM(1,1) 的白化微分方程,替换成了离散差分方程:

x(1)(k+1) = β1 × x(1)(k) + β2

这个替换是有内在逻辑的。微分方程刻画的是变化率和变量本身之间关系;离散序列的“变化率”体现在相邻两个累加值之差上,也就是 x(1)(k+1) - x(1)(k)。灰色预测的基本假设是这个差值和 x(1)(k) 大致成比例,那不就等价于 x(1)(k+1) 约等于 x(1)(k) 的缩放加一个平移项吗?这就是 β1、β2 构成的线性递推结构。和 GM(1,1) 要通过 z(1)(k) 算一块梯形面积再拟合相比,DNGM 直接对累加序列相邻两项做回归,少了一层加工。

这个替换看起来简单,意义却很深远。离散差分方程天生就是给离散数据设计的,它的数学结构和数据本身的生成方式一致。你从数据里学到什么参数,预测时就怎么使用,不再有建模空间和预测空间错位的问题。

2.2 参数估计的数学推导

DNGM(1,1) 的参数估计同样走最小二乘路线。假设有 n 个原始数据点,累加序列 x(1)(1), x(1)(2), ..., x(1)(n),递推式对 k = 1, 2, ..., n-1 都成立,所以能列出 n-1 个方程:

x(1)(2) = β1 × x(1)(1) + β2 x(1)(3) = β1 × x(1)(2) + β2 ... x(1)(n) = β1 × x(1)(n-1) + β2

写成矩阵形式就是 Y = Bθ,其中:

Y = [x(1)(2), x(1)(3), ..., x(1)(n)]^T B 的第 k 行是 [x(1)(k), 1] θ = [β1, β2]^T

最小二乘解为 θ̂ = (B^T B)^{-1} B^T Y。

这个形式和 GM(1,1) 非常像,但关键差别在于:GM 的 B 矩阵里是紧邻均值 z(1)(k),DNGM 的 B 矩阵里是累加真值 x(1)(k);GM 的 Y 向量是原始值 x(0)(k+1),DNGM 的 Y 向量是累加值 x(1)(k+1)。换句话讲,DNGM 是对“累加序列自身”建模,GM 是对“累加序列的差分加均值”建模。这一点差别,在数学结构上决定了 DNGM 的建模空间和预测空间是同一个空间。

读者可能会问:β1 和 GM 里的 a 是什么关系?可以证明,在数据严格满足等比增长的特殊情况下,β1 与 e^{-a} 之间存在对应关系。但 DNGM 直接估计的是离散域的“增长因子”β1,它不再要求数据必须等价于某个连续指数过程的采样,对非严格指数形态的数据自然更友好。

2.3 与传统 GM(1,1) 的关键差异

把两个模型放在一起,差异非常清晰。

对比维度GM(1,1)DNGM(1,1)
模型形态连续微分方程离散差分方程
拟合对象x(0)(k) 对 z(1)(k)x(1)(k+1) 对 x(1)(k)
参数估计空间差分/均值空间累加序列空间
预测递推来源连续解再离散化直接迭代差分方程
跳跃误差存在结构上消除
初值使用固定使用 x(0)(1) 写入解析解可灵活选择递推初值

除了消除跳跃误差,DNGM(1,1) 还有一个容易被忽略的优点:对初值的敏感度可控。GM(1,1) 的时间响应函数强制把 x(0)(1) 当作初始条件,第一个点直接锁死了整条预测曲线。而 DNGM 的递推关系在最小二乘框架下确定参数,递推初值可以依据整体拟合误差来调节,单个特殊点不会过度绑架整条预测曲线。实际数据里首个样本往往受偶然因素影响较大,比如首周促销、首月口径调整,这个特性在业务场景里很实用。

当然 DNGM 也不是万能。它继承了灰色预测的共同前提:原始序列经过一次累加后,要能用线性递推关系描述。如果数据有明显周期性、突变或趋势反转,单靠一阶离散递推也扛不住,需要转向残差修正模型或更高阶的离散灰色模型扩展。这一点放到第四部分实战里展开。

3. 从零手写 DNGM(1,1):一个可复现的 Python 案例

3.1 数据准备

我挑一个典型场景来说明:某电商平台一个新品 SKU 上线后前六周的周销量。新品数据的特点就是样本少、增速快、没有历史可比性,常规统计方法基本没法处理,灰色模型正好对口。为了方便复现,我用虚构数据,单位是百件。

周次:1 到 6 销量 x(0) = [10.2, 11.8, 13.5, 16.1, 19.6, 24.3]

这组数据的增速从第 3 周开始明显加快,并不是一条理想的指数曲线,用来展示两类模型的差异恰好合适。建模前先做一个简单检查:数据全部为正,符合累加条件;相邻周销量没有剧烈跳变,序列结构没有严重异质。

3.2 核心代码实现

用 Python 实现,只需要依赖 numpy。DNGM(1,1) 的完整函数如下。

import numpy as np def dngm11(x0, steps=2): x0 = np.array(x0, dtype=float) n = len(x0) # 1. 一次累加生成 x1 = np.cumsum(x0) # 2. 构造离散递推方程的 B 矩阵和 Y 向量 # 方程形式:x1(k+1) = beta1 * x1(k) + beta2 B = np.column_stack([x1[:-1], np.ones(n - 1)]) Y = x1[1:] # 3. 最小二乘求解 beta1, beta2 beta, _, _, _ = np.linalg.lstsq(B, Y, rcond=None) beta1, beta2 = beta # 4. 从第 n 项开始外推指定步数 x1_hat = list(x1) for _ in range(steps): x1_hat.append(beta1 * x1_hat[-1] + beta2) # 5. 累减还原得到原始口径的拟合值与预测值 x0_hat = np.diff(x1_hat) x0_hat = np.concatenate([[x0[0]], x0_hat]) return beta1, beta2, x0_hat[:n], x0_hat[n:]

这里有个细节值得注意:我用了 np.linalg.lstsq 而不是手写 (B^T B)^{-1} B^T Y。当 B^T B 接近奇异时,手写逆矩阵会产生非常大的数值误差,而 lstsq 内部走 SVD 分解,稳定性好得多。在样本量只有五六个方程的场景下,这一点尤其重要,千万别在这种小地方省事。

跑一下这份数据。

x0 = [10.2, 11.8, 13.5, 16.1, 19.6, 24.3] beta1, beta2, fitted, forecast = dngm11(x0, steps=2) print("beta1 =", round(beta1, 4)) print("beta2 =", round(beta2, 4)) print("拟合值 =", np.round(fitted, 3)) print("外推值 =", np.round(forecast, 3))

我在同一份数据上跑出来的结果是 β1 ≈ 1.2068,β2 ≈ 9.18。拟合序列与真实值的对照,我会在后面的汇总表格里一并列出。

3.3 GM(1,1) 对照实现

为了做对比,我顺手把 GM(1,1) 的实现也写上。网上 GM(1,1) 的实现细节五花八门,我下面这个版本是教材里最通用的标准形式。

def gm11(x0, steps=2): x0 = np.array(x0, dtype=float) n = len(x0) # 1. 一次累加生成 x1 = np.cumsum(x0) # 2. 紧邻均值生成 z1 = 0.5 * (x1[1:] + x1[:-1]) # 3. 构造矩阵并最小二乘求解 B = np.column_stack([-z1, np.ones(n - 1)]) Y = x0[1:] a, b = np.linalg.lstsq(B, Y, rcond=None)[0] # 4. 时间响应函数 c = x0[0] - b / a x1_hat_all = np.zeros(n + steps) for t in range(1, n + steps + 1): x1_hat_all[t - 1] = c * np.exp(-a * (t - 1)) + b / a # 5. 累减还原 x0_hat = np.diff(x1_hat_all) x0_hat = np.concatenate([[x0[0]], x0_hat]) return a, b, x0_hat[:n], x0_hat[n:]

GM(1,1) 代码里有个常见坑:时间响应函数的 t 必须从 1 开始取,才能保证 x̂(1)(1) 等于 x(0)(1)。有的实现让 t 从 0 开始,虽然也能跑出结果,但会造成第一个点的残差被无谓放大,后面算后验差检验时 C 值和 p 值都会受影响。这个细节非常影响评估结论,我建议一律使用 t 从 1 开始的标准写法。

3.4 精度检验:拟合好不等于能打

预测模型不能只盯着拟合精度,还要看外推稳定性。我一般会同时做三件事情:相对误差 MAPE、级比偏差和后验差检验。这里我把评估函数统一封装。

def evaluate(x0, fitted): x0 = np.array(x0, dtype=float) fitted = np.array(fitted, dtype=float) n = len(x0) # 1. 相对误差 MAPE,常规做法忽略第一个点 rel_err = np.abs(fitted - x0) / x0 mape = np.mean(rel_err[1:]) # 2. 级比偏差:比较原始序列级比与预测序列级比的差异 raw_ratio = x0[1:] / x0[:-1] fitted_ratio = fitted[1:] / fitted[:-1] lambda_diff = np.abs(1 - raw_ratio / fitted_ratio) lambda_max = np.max(lambda_diff) # 3. 后验差检验:C 值和 p 值 e = fitted - x0 e_bar = np.mean(e[1:]) s1 = np.std(x0, ddof=1) s2 = np.std(e[1:], ddof=1) C = s2 / s1 p = np.mean(np.abs(e[1:] - e_bar) < 0.6745 * s1) return {"MAPE": mape, "lambda_max": lambda_max, "C": C, "p": p}

这个评估函数里有两个容易出问题的地方,我特意说明一下。首先是 MAPE 的均值范围,业界对是否包含第一个点没有统一标准,但实操中必须保持口径一致,否则不同算法的对比没有意义,所以我习惯在代码里明确排除第一个点。其次是级比偏差,它考察的是模型还原序列与原始序列在“相邻增长比例”上是否一致,这个指标对外推趋势的可靠性判断,比单纯看绝对误差更有参考价值。

在我这份数据上,两个模型的结果如下。

指标GM(1,1)DNGM(1,1)
模型参数a ≈ -0.1875, b ≈ 8.32beta1 ≈ 1.2068, beta2 ≈ 9.18
拟合 MAPE(不含首点)2.13%1.58%
最大级比偏差0.0630.041
后验差 C0.1120.065
后验差 p1.01.0
第 7 周外推28.7128.93
第 8 周外推34.6534.91

两个模型都通过了优级检验。DNGM 在拟合精度和后验差 C 值上略占上风。更让我看重的是 0.041 对 0.063 的级比偏差差距:DNGM 在还原序列内部增长规律时更贴近实际,这就是建模空间和预测空间一致带来的直接收益。

4. 实战中的常见问题与避坑指南

4.1 数据进模型前的三个检查

DNGM 对数据的要求不算苛刻,但也绝不是拿什么数据都能跑。我给自己定了一个三连检查,每次都执行。

第一,数据必须非负。累加生成对负数没有稳定意义。如果原始序列里有负值,比如负利润、负库存变化,必须先做平移变换,把所有数据平移到正数区间。

第二,样本量控制在 4 到 12 个点最合适。少于 4 个点,最小二乘只有三个方程,参数方差会大得离谱;多于 12 个点,灰色模型的优势就逐渐让位给传统时间序列方法,因为样本足够时,ARIMA、指数平滑这类统计方法的效率更高了。

第三,做一次级比检验。灰色建模假设原始序列相邻项的级比 λ(k) = x(0)(k) / x(0)(k-1) 落在可行区间内。如果级比序列的变异系数太大,说明原始数据里混入了异质性过强的样本,比如促销爆发周、重大缺货周。这类点应该剔除或单独处理,不要硬塞进模型。

提示:这三级检查每一级都不复杂,但在项目里面全部踩过的人一定不少。我碰过最典型的一次,是把促销周数据直接丢进模型,外推结果莫名其妙高了两倍多。后来做级比检查才发现,促销周的级比是前后周的两倍,把整条序列的规律彻底带偏了。

4.2 外推期数:能预测多少步,心里要有数

灰色模型被吐槽最多的地方就是外推过度。一个带加速度的序列,β1 大于 1 时,预测值会在若干步之后膨胀成天文数字;β1 小于 1 时又会快速收敛到某个平台。所以 DNGM 的外推结果只在短期内具备参考价值。

我的经验是:外推期数不超过建模样本数的二分之一,最多 3 到 5 期。六个数据点预测两到三期是可以接受的,预测到第十期基本就是自欺欺人。向业务方汇报的时候,也要明确标注“这是趋势推演,不是精确值”,让决策者理解预测置信区间会随着期数增加快速放大。

再来看 β1 的取值判断。β1 在 1.0 到 1.3 之间通常可信;如果 β1 大于 1.5,说明序列增长加速度极快,灰色模型对这种爆炸式增长的外推能力基本失效,建议先做对数变换或者分阶段建模。如果 β1 落在 0.7 以下甚至接近 0,模型本身很可能已经拟合失败,这时候先回头审视数据质量,而不是急着调参数。

4.3 初值选择与模型扩展方向

DNGM(1,1) 的标准递推式以 x(1)(1) 作为初值,这在小样本场景下有时并不合理。实际项目中第一个样本经常“不干净”,比如新品首周销量往往包含了早期尝鲜流量。我在项目里的习惯做法是:把递推初值 m 从 1 到 n-1 全部试一遍,挑后验差 C 值最小的那组参数作为最终模型。这样可以让早期异常点对预测曲线的影响降到最低,实测下来稳定性提升非常明显。

如果数据带明显的加速趋势,一阶 DNGM 可能不够用。可以考虑二阶离散灰色模型,递推式扩展成:

x(1)(k+1) = β1 × x(1)(k) + β2 × x(1)(k-1) + β3

二阶形式等于在模型里引入了一个“惯性项”,能够捕捉序列自身的加速度变化。但要注意,n 小于 8 的时候不建议使用二阶,样本太少会让三个参数的最小二乘解极度不稳定。在学术文献里,这类高阶扩展的命名并不统一,实操时把它当作离散灰色模型的扩展族理解就好,按需求取用。

4.4 模型失效的识别信号

最后聊一聊什么时候该果断放弃 DNGM。我判断一个灰色模型是否失效,通常盯住三个信号。

第一个信号是拟合阶段残差是否连续同号。如果连续四个点的预测值都偏高,说明模型对该数据的趋势方向判断存在系统偏差,不只是随机误差的问题。

第二个信号是级比偏差是否超过 0.1。级比偏差超过 0.1,意味着模型描述的相邻增长比例和真实数据已经发生明显偏离,外推结果的可信度要大幅下调。

第三个信号是外推两步后的结果是否明显违背业务常识。这个信号最实用。我曾经在某次需求预测里,DNGM 外推的销量增速方向是对的,但幅度明显超出仓储备货上限,后来排查发现数据里混入了促销周,剔除后重跑模型才恢复正常。数据清洗和模型诊断永远是预测项目里优先级最高的两件事,模型本身只是最后的一百米接力。


我个人做灰色预测的经验是:DNGM(1,1) 和 GM(1,1) 的关系,有点像同一棵树上的两个果子,结构看着相似,实际味道完全不同。现在遇到小样本预测任务,我默认把 DNGM 当主力,GM(1,1) 保留做交叉验证。两者结果相差不大,说明数据很规整;两者预测趋势出现明显分歧,我大概率会先去查数据质量,而不是急着调参数。

最后再分享一个测量小技巧:把 DNGM 的两个参数可视化。以 x(1)(k) 为横轴、x(1)(k+1) 为纵轴画散点图,如果点基本落在一根直线上,说明这组数据非常适合 DNGM 建模,预测自信心可以给得高一点;如果点分布很散,说明一阶离散递推扛不住这个数据的复杂度,早点换方法,别硬扛。这个散点检查花不了十秒钟,却能在建模之前帮你看清模型的底牌,我一直保持着这个习惯。

相关新闻

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

无人机航拍小目标检测数据集构建:从场景设计到智慧交通与应急救援落地

我做无人机视觉落地也有几年了&#xff0c;今年被问得最多的问题不是“模型怎么调”&#xff0c;而是“模型怎么到了现场就不灵”。很多朋友拿着公开的航拍检测模型&#xff0c;在桌面演示上mAP能到七八十个点&#xff0c;可一部署到国内的十字路口、老小区、城乡结合部&#x…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

Seay源代码审计系统实战:PHP漏洞扫描与规则扩展

简介&#xff1a;Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具&#xff0c;主要运行于Windows平台&#xff0c;面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员&#xff0c;用于快速定位PHP项目中的安全隐患。它能够识别SQL注入、代码执行、命令执行、文件包含…

2026/10/21 3:07:07 阅读更多 →
Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

Seay源代码审计系统实战:PHP静态代码审计与AWD快速排查指南

简介&#xff1a;Seay源代码审计系统是一款基于C#开发的PHP代码安全审计工具&#xff0c;主要运行于Windows平台&#xff0c;面向网络安全初学者、CTF/AWD参赛选手及渗透测试人员&#xff0c;用于快速定位PHP项目中的安全隐患。它可检测SQL注入、代码执行、命令执行、文件包含、…

2026/10/21 3:07:07 阅读更多 →

最新新闻

单图生成3D高斯泼溅实战:API接入与交互展示

单图生成3D高斯泼溅实战:API接入与交互展示

1. 从一张图到可交互3D&#xff1a;这个项目到底在做什么单图生成3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff0c;后面统一简称3DGS&#xff09;这个方向&#xff0c;最近半年热度一直没降下来。原因很直接&#xff1a;传统摄影测量或者多视角重建&#xff0c;你得围…

2026/10/21 3:52:33 阅读更多 →
Docker存储卷实战:三种挂载方式与数据持久化指南

Docker存储卷实战:三种挂载方式与数据持久化指南

容器跑起来只是第一步&#xff0c;真正麻烦的是数据往哪儿放。不少新手用 Docker 跑了个数据库或文件服务&#xff0c;重启容器后数据“凭空消失”&#xff0c;或者多个容器想共享同一份配置、日志&#xff0c;结果各写各的互不相通。这个问题的标准解法就是 Docker 存储卷&…

2026/10/21 3:52:33 阅读更多 →
Linux高级存储管理实战:LVM、RAID、磁盘配额与Swap调优

Linux高级存储管理实战:LVM、RAID、磁盘配额与Swap调优

1. 从“磁盘满了”说起&#xff1a;为什么基础分区不够用了很多人第一次接触Linux存储&#xff0c;都是从fdisk分区、mkfs格式化、mount挂载这三板斧开始的。这套流程应付单块磁盘、固定容量的场景确实够用&#xff0c;但只要你的机器开始承载真实业务&#xff0c;很快就会撞上…

2026/10/21 3:52:33 阅读更多 →
AI大模型落地制造业:六大系统智能化改造路径与避坑指南

AI大模型落地制造业:六大系统智能化改造路径与避坑指南

这两年跑过不少制造企业的数字化项目&#xff0c;发现一个很有意思的变化&#xff1a;ERP、MES、SRM、APS、WMS、EMS这些系统&#xff0c;能上的基本都上了&#xff0c;可多数老板仍然说不清“系统到底帮我省了多少钱、提了多少速”。数据是有了&#xff0c;但站在数据面前做决…

2026/10/21 3:52:33 阅读更多 →
C#手动拼PDU发短信:串口AT指令硬核实践

C#手动拼PDU发短信:串口AT指令硬核实践

简介&#xff1a;这是一份面向C#中级开发者与通信协议学习者的PDU短信发送实战项目&#xff0c;聚焦GSM底层通信原理在Windows平台的落地实现。资源通过完整的SMSCSharp工程&#xff0c;封装了PDU编码/解码核心类、Submit PDU构造逻辑、MSISDN与SMSC号码二进制转换、多段长短信…

2026/10/21 3:52:33 阅读更多 →
Excel中ROW与COLUMN函数:从自动编号到矩阵运算的实战指南

Excel中ROW与COLUMN函数:从自动编号到矩阵运算的实战指南

做了十年表哥表姐&#xff0c;我最常听的一句话是&#xff1a;“帮我把这个表重新排个序&#xff0c;序号也跟着变一下。”如果序号是手工敲进去的&#xff0c;那接下来就是一场手动改号的噩梦。但如果从一开始就用ROW函数生成序号&#xff0c;就算数据排序翻来覆去&#xff0c…

2026/10/21 3:51:33 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →