从感知机到SVM:三次升级解锁分类算法核心
1. 为什么把感知机和SVM放在一起讲一谈到基础分类算法感知机和支持向量机SVM这两兄弟总是被放在一起讲。很多人学完一轮课程感知机会用SVM也会调包但问一句“SVM到底比感知机强在哪”十个里有八个答不完整。我这两年带过不少入门的人发现问题的根源在于大家把这两个算法当成两个孤立的知识点来背而不是一条进化链上的两个阶段。其实完全可以换个思路理解SVM就是感知机的“三次升级版”。感知机是那个只会蛮干、找到一个可行解就停手的愣头青SVM则是在感知机基础上依次解决了“解不唯一”“抗噪能力差”“没法处理非线性”三个问题最终长成的实战派选手。把这根主线理清楚两个算法你都不会再忘。这篇文章我会先把感知机的数学原理和手写实现拉通然后故意让它在一个非线性数据集上翻车再顺着翻车的三个原因一层层引出SVM的最大间隔、软间隔和核技巧。文章定位是总结实操向适合刚学完基础机器学习、正在做复盘笔记的读者也适合准备面试、想用一条逻辑串起分类算法的人。代码用Python跑依赖很少自己敲一遍收获最大。2. 感知机最朴素的线性分类器2.1 分类问题就是画一条分界线感知机做的事情用一句话说就是在一个特征空间里找一条直线二维或者一个超平面高维把正负样本分开。打个比方你是个班主任手里有一批学生的平时成绩和作业完成度两个特征要判断他们期末会不会挂科。你不需要知道精确的分数分布只拿一把尺子在坐标纸上画一条线线这边的大概率过线那边的大概率挂。这就是一个线性分类器。感知机要找的就是这条线只不过它是用数学规则自动去找的。假设样本的特征向量是 (x (x_1, x_2, \dots, x_n))标签 (y) 只取 1 或 -1。感知机的模型长这样[ f(x) \text{sign}(w \cdot x b) ](w) 是权重向量决定分界线怎么倾斜(b) 是偏置决定分界线平移多少。(\text{sign}) 是符号函数结果大于 0 输出 1小于 0 输出 -1。这个形式非常朴素朴素到1990年代之前大家觉得这是理所当然的分类方式。你只需要记住一件事感知机学到的就是 (w) 和 (b)学完之后拿它们对新的 (x) 做一个点积加判断。2.2 损失函数为什么是误分类点到超平面的距离感知机的训练目标很直接如果所有样本都被正确分类那分类器就是好的如果有样本被判错就要调整 (w) 和 (b)。关键问题是错得多离谱怎么衡量。感知机采用了一个非常聪明的度量误分类点到超平面的总距离。点到直线的距离公式大家高中都见过在 (n) 维空间里点 (x_i) 到超平面 (w \cdot x b 0) 的距离是[ \frac{|w \cdot x_i b|}{|w|} ]对于误分类样本(y_i (w \cdot x_i b) 0)所以 (|w \cdot x_i b| -y_i (w \cdot x_i b))。把所有误分类点的距离加起来就是感知机的损失函数[ L(w, b) -\sum_{x_i \in M} y_i (w \cdot x_i b) ]注意这里把分母 (|w|) 省略掉了因为感知机只关心错没错不关心分界线距离样本多远。这个省略在感知机里无所谓但正好是后面SVM要补回来的地方。2.3 随机梯度下降一有错就改传统梯度下降会把所有样本一次性算一遍然后更新参数。感知机用的是更“急性子”的随机梯度下降每发现一个误分类样本立刻调整参数。更新公式如下[ w \leftarrow w \eta \cdot y_i \cdot x_i ][ b \leftarrow b \eta \cdot y_i ]为什么是这么个形式因为 (L) 对 (w) 的梯度是 (-y_i x_i)对 (b) 的梯度是 (-y_i)。梯度下降往负梯度方向走所以加上 (\eta y_i x_i) 就是把损失变小。这个更新的几何意义也很直观把一个被误分类的点往正确的方向“拽”一下。(y_i 1) 时如果它被分到了负侧就在 (w) 上加上样本向量让超平面往样本方向靠拢一点(y_i -1) 时同理反向调整。学习率 (\eta) 控制每次“拽”的幅度。感知机对学习率不太敏感只要别太大导致来回震荡一般取 0.1 或 1 都行。我这里取 0.1稳妥。3. 手撕感知机代码与小数据集实测3.1 用numpy实现一个能跑的感知机直接上代码依赖只有numpy。我把训练过程写成一个类逻辑非常清晰每次循环遍历所有样本遇到误分类就更新参数直到一轮里没有误分类样本或者达到最大迭代次数。import numpy as np class Perceptron: def __init__(self, lr0.1, max_epoch1000): self.lr lr self.max_epoch max_epoch self.w None self.b 0 def fit(self, X, y): n_samples, n_features X.shape self.w np.zeros(n_features) self.b 0 for epoch in range(self.max_epoch): errors 0 for i in range(n_samples): # 误分类条件y_i * (w·x_i b) 0 if y[i] * (np.dot(self.w, X[i]) self.b) 0: self.w self.lr * y[i] * X[i] self.b self.lr * y[i] errors 1 if errors 0: break return self.w, self.b def predict(self, X): return np.sign(np.dot(X, self.w) self.b)代码里有三个细节值得注意。第一(w) 初始化为零向量这在感知机里没问题但在后面讲到SVM时会变成一个必须绕开的坑。第二误分类条件用的是 (\le 0)等于 0 时样本正好落在分界线上也算误分类。第三一旦某一轮全对就提前退出实测中线性可分数据往往几十轮就收敛了根本走不到1000轮。造一组线性可分的数据来验证。我用随机数生成两个簇一个中心在 (2, 2)一个中心在 (-2, -2)正负样本各100个np.random.seed(42) X1 np.random.randn(100, 2) [2, 2] X2 np.random.randn(100, 2) [-2, -2] X np.vstack([X1, X2]) y np.hstack([np.ones(100), -np.ones(100)]) # 打乱顺序避免感知机学到数据本身的顺序 idx np.random.permutation(len(X)) X, y X[idx], y[idx] model Perceptron() model.fit(X, y) print(w:, model.w, b:, model.b) print(训练集准确率:, np.mean(model.predict(X) y))我本地跑的结果是训练集准确率 100%(w \approx [0.9, 0.8])(b \approx 0.1)。分界线差不多是一条从左上到右下的直线和两个簇的相对位置吻合。到这里感知机的基本工作流就通了。3.2 非线性可分数据的翻车现场接下来故意让感知机翻车。我构造一个环形数据内部一个圆是负类外面一圈环是正类。这种数据在现实中很常见比如“故障点在中心区域、正常点在周边”的场景。from sklearn.datasets import make_circles X, y make_circles(n_samples300, noise0.05, factor0.5, random_state42) y np.where(y 0, -1, 1) model Perceptron(lr0.1, max_epoch2000) model.fit(X, y) print(训练集准确率:, np.mean(model.predict(X) y))你猜结果怎么样跑了2000轮都没收敛准确率只有 50% 左右跟乱猜差不多。这是必然结果感知机只会在“线性可分”的数据集上收敛。环形数据里正负样本不可能用一条直线分开算法会陷入死循环不断把分界线这边拽一下、那边拽一下永远找不到那个不存在的完美解。我见过不少新手在这时候就准备放弃这个算法了。别急这个翻车现场特别有价值你后面会发现SVM的每一步进化本质上都是在补感知机在这里暴露出来的窟窿。4. 感知机的两大硬伤异或困境与解不唯一4.1 XOR问题为什么是经典“命门”上面翻车属于直观的“非线性”但历史上真正让感知机从C位跌落的是异或XOR问题。异或逻辑很简单两个输入 ((0,0)) 和 ((1,1)) 输出 0((0,1)) 和 ((1,0)) 输出 1。如果把这四个点画在二维平面上你会发现任何一条直线都分不开它们——你能画的只有一条对角线而对角线只能把其中一对对角点分出来另外一对必然出错。当年研究者们正是因为发现感知机连这种简单逻辑都学不会一度对神经网络的前景产生了深深的怀疑。现在回头看谁都知道解决办法是加一层隐藏层但在当时确实让这个方向冻了十年之久。这个事件告诉我们一个道理算法的局限往往不是参数问题而是模型表达能力的结构性局限。感知机本质是线性函数加了一个符号函数的壳表达能力天生有限后面SVM用核技巧绕开了这个天花板而不是在感知机结构上硬补。4.2 收敛解不唯一模型缺乏稳定性线性可分数据上感知机一定会收敛这是理论保证。但它收敛到哪里却有很大的随机性。我做了个实验同一份线性可分数据只把训练集的样本顺序打乱跑十次感知机得到十个不同的 (w) 和 (b)。准确率都是100%但分界线位置差距很大。有的分界线贴着正类最近点有的贴着负类最近点。这在训练集上没什么区别但在新样本上就危险了——分界线贴得越近越容易被噪声干扰新来的点稍微波动一点就可能越过线。我常拿“停车位”类比感知机找车位有个毛病只要停进去就行不关心停得正不正。如果左边柱子近它就贴着左边停如果右边柱子近它就贴着右边停。虽然每次都不违法但开门、下人、周围车走动的容错性很差。这个“不稳定性”就是感知机作为一个生产级分类器最大的硬伤。4.3 三条升级需求浮出水面把上一节的翻车和实验总结一下感知机要成为实战算法至少需要解决三件事分界线不能随便停得停在一个最“居中”的位置这就是“最大间隔”思想。数据不可能永远线性可分得有办法容忍少量错误这是“软间隔”思想。环形、异或这类非线性结构要有办法处理这引出了“核函数”。这三条正好对应SVM进化链上的三次升级。下面我一次讲一个。5. SVM第一重升级让分界线尽量“居中”5.1 从“找到一个解”到“找到最稳的解”SVM的第一重升级思路特别朴素既然你感知机能找到无数条能把数据分开的线那我不如加一个约束——在所有能分开数据的线里选那条离正负样本都尽可能远的线。这个“尽可能远”用专业术语说就是最大间隔。间隔大说明分界线两边留的空地大新的点哪怕有噪声扰动也不容易越过线被误分类。这就是机器学习里常说的“泛化能力”的来源你在训练集上留的余量越足对未知点的容错能力越强。回顾感知机它只有“分类正确”这个 0/1 要求SVM要求的是“分类正确且离最近样本的距离最大化”。这就是理解SVM全部数学推导的那扇门。5.2 函数间隔与几何间隔必须分清的两个概念讲到间隔必须先把两个容易混淆的量讲明白。函数间隔定义为[ \hat{\gamma}_i y_i (w \cdot x_i b) ]它看的是样本 (x_i) 是否被正确分类并且离超平面有多远。但函数间隔有个问题如果你把 (w) 和 (b) 同时放大两倍超平面本身没变(w \cdot x b 0) 和 (2w \cdot x 2b 0) 是同一个平面函数间隔却变成了两倍。这就好比说同一堵墙用厘米量是300用米量是3数字变了墙没变。所以还需要几何间隔它才是真正意义上点到平面的距离[ \gamma_i \frac{y_i (w \cdot x_i b)}{|w|} ]几何间隔消除了 (|w|) 的尺度影响。把感知机损失函数里被省略的 (|w|) 请回来就得到了几何间隔。这也是为什么我之前说感知机的省略不心疼因为SVM需要的正是这个量。5.3 硬间隔SVM的优化目标是怎么来的现在目标明确了在所有能把数据正确分类的超平面里选几何间隔最大的那个。用数学语言写就是[ \max_{w, b} \frac{\hat{\gamma}}{|w|} ]受限于所有样本都能正确分类。因为我们可以任意缩放 (w) 和 (b) 而不改变超平面所以不妨直接令函数间隔 (\hat{\gamma} 1)这样目标就从“最大化一个分数”变成“最小化 (|w|)”更习惯写成[ \min_{w, b} \frac{1}{2} |w|^2 ]受限于 (y_i (w \cdot x_i b) \ge 1)。这就是教科书里硬间隔SVM的标准形式。那个 (\frac{1}{2}) 纯粹是为了求导方便凑出来的系数没有任何物理含义。这个约束优化问题用拉格朗日乘子法求解最终会变成一个只和样本内积 (x_i \cdot x_j) 有关的对偶问题。为什么强调这个因为“只依赖内积”这一点是后面核技巧能成立的根本前提。这里我建议你亲手推一遍拉格朗日对偶不用急慢慢推。我在某高校跟人交流时发现一个规律能自己把对偶问题写出来的人后面理解核函数基本无障碍跳过这段推导的人反复看三遍核技巧也总觉得隔了一层。6. SVM第二重升级软间隔允许少量错误6.1 松弛变量到底在干嘛硬间隔SVM有一个严格的假设所有样本都必须满足 (y_i (w \cdot x_i b) \ge 1)。但现实数据几乎总是带噪声比如两个类别的点混在一起、个别异常点待在不该在的位置。这时候硬间隔的最优超平面可能根本不存在或者即使存在也会为了迁就一个离群点导致分界线扭曲得不像话。解决办法是“松绑”——给每个样本引入一个松弛变量 (\xi_i \ge 0)把硬约束放松成[ y_i (w \cdot x_i b) \ge 1 - \xi_i ]如果样本离群很严重(\xi_i) 就到1以上如果只是轻微越界(\xi_i) 是个小正数如果样本正常(\xi_i 0)。目标函数相应变成[ \min_{w, b, \xi} \frac{1}{2} |w|^2 C \sum_{i1}^{n} \xi_i ]这里 (C) 是惩罚系数。你可以把它想象成班主任对违纪学生的容忍度(C) 大说明眼里揉不得沙子宁可复杂度高也要把错分样本压到最少(C) 小说明更宽容允许班级里有几个“刺头”追求整体氛围的平衡。现实项目里 (C) 几乎总是需要调的后面我会给经验值。6.2 惩罚系数C的直觉与调参方向我最早用SVM的时候以为 (C) 越大越好毕竟谁不希望训练集准确率高一点。结果在一个带噪声的数据集上把 (C) 调到1000以后模型在验证集上反而垮了。原因很简单过拟合。模型把所有异常点都硬掰回来了分界线变得弯弯曲曲本质上是把训练集的噪声当成了信号。后来我形成了一套自己的调参习惯先跑一个默认值 (C1)看混淆矩阵里的错误分布。如果误分类都是轻微的只是灰度样本之间的边界混淆不要急着拉高 (C)如果误分类集中在明显离群的极端点可以试探性加大 (C)。每次按10倍步长试1、10、100同时用交叉验证看验证集分数分数不再上升就停下来。6.3 sklearn实践带上噪声跑一遍软间隔SVM实际工程里我不会手写SVM的求解器直接用库更高效。用之前那个环形数据来演示。这个数据感知机翻车了但SVM配合稍后要讲的核技巧可以完美处理。先看代码框架from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42 ) scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) model SVC(kernelrbf, C1.0, gammascale) model.fit(X_train, y_train) print(训练集得分:, model.score(X_train, y_train)) print(测试集得分:, model.score(X_test, y_test))注意这里我先做了标准化。SVM对特征的尺度极其敏感因为间隔是按几何距离算的一个取值范围1000的特征和取值范围0.1的特征会直接把距离计算绑架走。标准化这一步很多人图省事跳过结果就是模型莫名其妙地差我踩过好几次这个坑。测试集得分我这边跑出来在 0.98 到 1.0 之间。同样一份数据感知机只有50%准确率SVM几乎满分——这个对比每次演示都很有冲击力。但注意这里用的是RBF核也就是第三次升级的功劳。下面专门讲。7. SVM第三重升级核函数低维解决不了就换个维度解决7.1 核技巧为什么能“既不升维、又等于升维”先想一个经典例子一维数据上负样本在 -1 到 1 之间正样本在两边。一维空间里你没法用一条直线一个点把它们分开因为这是一个“线段在中间”的结构。但如果把特征做一次映射(x \rightarrow (x, x^2))把一维点映射到二维平面你会看到所有点落在一个抛物线上。此时负样本在抛物线的中间凹陷段正样本在两端很容易画一条水平线把它们分开。这给了我们启示把数据映射到高维空间原本线性不可分的问题可能变成线性可分的。但直接做高维映射有个致命问题如果原始特征是100维映射到多项式高维空间可能变成上万维计算量爆炸。于是核技巧登场。回顾上一章说的SVM对偶问题——它只依赖样本间的内积 (x_i \cdot x_j)。如果我们能找到某个函数 (K(x_i, x_j))它的值恰好等于“把两个样本映射到高维之后再做内积”的结果那我们就不需要真的在高维空间里算直接在低维空间用核函数替代内积就行了。这就像是你不需要真正飞到北京才能见到某人只要打个视频电话就能达到对话的目的而且不用花机票钱。这个 (K) 就是核函数。最常用的几个我会在下面列出来。7.2 常用核函数的选择逻辑核函数形式示意适合场景关键参数线性核(K(x_i,x_j) x_i \cdot x_j)特征维度高、样本量大的线性问题无多项式核(K(x_i,x_j) (x_i \cdot x_j r)^d)有先验的多项式关系次数 (d)高斯核RBF(K(x_i,x_j) \exp(-\gamma |x_i - x_j|^2))默认首选非线性且无明显先验(\gamma)我自己的选择经验是特征数非常多比如文本TF-IDF出来后几千维时先试线性核又快又稳特征维度不高、样本量几千到几万的中小数据集无脑优先RBF。RBF的 (\gamma) 参数控制单个样本的影响半径(\gamma) 小每个样本影响范围大决策边界平滑(\gamma) 大每个样本只管自己附近边界复杂容易过拟合。调 (\gamma) 和调 (C) 有点互补关系。我常用的网格搜索范围是 (C \in {0.1, 1, 10, 100})、(\gamma \in {0.01, 0.1, 1, 10})。先粗搜定位量级再细搜精调。有很多工具可以自动搜索但建议手动跑过一两次建立对参数变化的直觉。7.3 一句话记住感知机与SVM的关系到这里三次升级全部完成最大间隔解决了“解不唯一”软间隔解决了“噪声容忍”核函数解决了“非线性表达”。三者拼起来就是感知机到SVM的完整进化路线。你可以这样记忆SVM 感知机的目标函数 最大间隔约束 松弛变量 核技巧。每个感知机的痛点都被SVM用一套更精细的数学工具对症下药处理掉了。8. 一张对照表和实战中我惯用的选型经验8.1 感知机 vs SVM 全维度对比对比维度感知机SVM以RBF核为例模型形式(f(x)\text{sign}(w \cdot x b))(f(x)\text{sign}(\sum \alpha_i y_i K(x_i, x) b))目标误分类点总和最小间隔最大化 误分类惩罚解是否唯一不唯一依赖初始化和顺序唯一凸优化线性不可分无法处理软间隔核函数均可处理参数数量学习率惩罚系数 (C)、核函数参数训练速度极快中小数据集快大数据集偏慢理论保证线性可分时收敛结构风险最小化泛化界理论适用场景教学、快速基线模型中小样本分类的默认选择之一这张表不是让谁踩谁而是方便你按需选用。感知机我现在的用途主要有两个一是给新手讲分类器原理时当第一课二是做数据集的快速基线换KNN糙跑一下更靠谱但感知机胜在极简单。真正干活的时候SVM出现的频率高得多。8.2 数据预处理对两类算法的影响两类算法都属于“距离敏感”模型。我在某个客户现场处理过一份销量预测数据特征里既有“月份编号”1到12也有“库存金额”几千到几百万。没做标准化直接喂给SVM结果模型几乎只看库存金额这一个特征月份信息全废了。做了标准化之后特征真正公平参与计算效果天壤之别。如果你的特征还有其他量级差异记得先看一眼描述性统计再做标准化StandardScaler或归一化MinMaxScaler。这一步对感知机同样重要只是感知机对最终分界线的形态没那么敏感标准化后迭代收敛会更快、更稳。8.3 什么时候用感知机什么时候直接用SVM我的个人建议很简单除非你是在教学、演示或者调试代码流程否则真实项目里直接上SVM。这不是说感知机一无是处而是它的问题太明显——解不唯一、边界贴边、对离群点零容忍。这三个问题放在真实数据上会以各种诡异方式爆雷。比如你线上运行一个感知机模型每天凌晨定时重训一次因为训练数据顺序每天在变你得到的模型可能每天都在微调线上结果随之抖得像心电图。SVM因为目标函数是凸优化解是全局唯一的同样条件重训得到的分界线完全一样稳定压倒一切。顺便提一句在大规模文本分类场景比如上百万样本、几万维特征线性SVM被用得很多因为它和感知机一样快但又有间隔最大化的稳定性和理论保证。这类场景反而比RBF核更常见因为维度已经很高数据在高维空间里通常线性可分程度已经足够。9. 我把这两个算法串起来之后的一点心得当时我把感知机和SVM放在一起系统整理整整写了一周笔记最后一稿把整个推导链和实验代码串起来之后发现一个很明显的变化以前看到SVM的公式会觉得是“天书”理解了三条升级线之后每个符号都有了落点。自己也碰到过几个值得记录的小坑分享出来。第一个坑是SVM的模型文件在sklearn里默认保存的决策函数对未标准化的新样本会直接判错。原因是训练时用的标准化参数均值和方差只拟合了训练集预测时如果忘了调用相同的StandardScaler实例新样本等于裸奔。这个错误极隐蔽我甚至在一次部署上线之后才被人提醒。第二个坑是网格搜索时别贪心。我见过有人把 (C) 和 (\gamma) 的候选值分别设了20个组合400次每个组合跑5折交叉验证从下午等到深夜还没跑完。合理做法是先用粗网格把量级定下来再在最优量级附近细化整个过程控制在半个小时内。第三个坑是感知机代码里打乱样本顺序。前面实验里我特意加了np.random.permutation因为感知机对样本顺序敏感如果数据本身有某种时间或标签上的排序作训练时顺序不变会让收敛结果很偏。这个细节很多资料不提实际跑数据时却能明显改变分界线位置。如果你也在学这块内容我建议你按这个顺序走一遍先手写感知机跑通线性数据再制造环形数据看它翻车然后按最大间隔、软间隔、核函数三个主题逐一读SVM推导最后用sklearn在同一份数据上复现“感知机失败而SVM成功”的对比。走完这条线你对这两个算法的理解绝对不止停留在调参数层面而是能把它们放进同一个深层框架里灵活取用。

相关新闻

乳腺MRI预处理:多序列标准化与配准关键技术解析

乳腺MRI预处理:多序列标准化与配准关键技术解析

简介:本资源是一篇聚焦医疗影像预处理的学术论文PDF,面向医学影像分析、人工智能辅助诊断方向的研究者与研究生,解决乳腺癌MRI原始数据噪声大、形变明显导致后续特征提取不准的核心问题。全文基于RIDER Breast MRI公共数据集,系统…

2026/10/12 9:41:22 阅读更多 →
DeepGEMM实践:为深度学习定制高性能矩阵乘法内核

DeepGEMM实践:为深度学习定制高性能矩阵乘法内核

1. 为什么我为一个“老掉牙”的矩阵乘法写了个专用库如果说有哪种计算,十年前只待在HPC论文里,今天却撑起了整个深度学习软件栈的底层,那非矩阵乘莫属。线性层是矩阵乘,注意力打分是矩阵乘,卷积用im2col变换后还是矩阵…

2026/10/12 9:41:22 阅读更多 →
红外图像非均匀性校正:神经网络场景自适应方法解析

红外图像非均匀性校正:神经网络场景自适应方法解析

简介:这份PDF是一篇基于神经网络的红外图像非均匀性校正学术论文,面向红外探测、图像处理与机器学习领域的工程技术人员和研究者。论文针对红外焦平面材料、制造工艺及多路模拟信号输出导致的像元响应不一致问题,详细介绍了盲元检测与补偿、双…

2026/10/12 9:41:22 阅读更多 →

最新新闻

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

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

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

2026/10/12 10:20:06 阅读更多 →
大模型推理引擎vLLM(7):Chunked-Prefills 分块预填充机制与 TaoToken 统一 Key 通道实践

大模型推理引擎vLLM(7):Chunked-Prefills 分块预填充机制与 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/12 10:20:06 阅读更多 →
[工具分享] CCSwitch 接入 Claude 无限 token:把 settings 改到 TaoToken 的完整配置

[工具分享] CCSwitch 接入 Claude 无限 token:把 settings 改到 TaoToken 的完整配置

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

2026/10/12 10:20:06 阅读更多 →
AIOps基本包实战:用Python搭建监控异常检测与告警系统

AIOps基本包实战:用Python搭建监控异常检测与告警系统

简介:面向智能运维开发与运维人员的Python工具包资源,聚焦异常检测、告警收敛、时间序列预测与告警关联分析四大核心模块。包内功能以即插即用的模块化方式实现,用户可直接导入对应模块集成到现有监控或运维流程中,适合具备一定Py…

2026/10/12 10:20:06 阅读更多 →
X光安检目标检测数据集落地四步法:VOC转YOLO避坑指南

X光安检目标检测数据集落地四步法:VOC转YOLO避坑指南

简介:本资源是面向计算机视觉初学者与目标检测算法研发者的X光安检场景专用数据集,覆盖打火机、刀具、充电宝等10类违禁物品,专为YOLO、Faster R-CNN等主流检测模型训练与测试提供高质量标注支持。压缩包共2000个文件,含1999份Pas…

2026/10/12 10:20:06 阅读更多 →
大型前端 Monorepo 依赖图防腐:基于 pnpm catalog 与依赖约束的统一架构治理

大型前端 Monorepo 依赖图防腐:基于 pnpm catalog 与依赖约束的统一架构治理

在现代大厂的前端工程体系中,Monorepo(单体多包仓库) 几乎已经成为标准的基础设施形态。将几十个业务应用(Apps)、通用 UI 组件库、领域业务服务(Services)与构建插件收拢在同一个 Git 仓库中&a…

2026/10/12 10:19:05 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →