K-means聚类算法核心原理与工程实践详解
最近在处理一份用户行为数据的时候我计划做分群分析。第一次直接调现成的K-means实现K值随手填了个5数据也没有做标准化跑出来的结果怎么看怎么别扭——有两个簇几乎完全重叠还有一个簇里塞进了明显不属于同一类的样本。后来我花了一个下午把K-means从原理到实现重新过了一遍才发现很多问题不是算法不行而是我压根没搞清楚它到底在优化什么。这篇笔记就是把那次重新学习的过程完整记录下来包括K-means的数学目标、手写实现时的工程细节、K值的确定方法、数据预处理里的坑以及最后怎么判断聚类结果到底能不能用。如果你也经常调包跑聚类但说不清结果为什么是这样或者面试前想把K-means彻底弄明白这篇笔记应该能给你一些参考。1. K-means到底在优化什么目标函数与迭代收敛1.1 聚类不是分类K-means一开始就说好了硬分配初学者最容易混淆的一件事是把聚类和分类当成一回事。分类是有标签的学习模型要学的是输入到标签的映射聚类是无标签的探索性分析目标是把数据分成若干组让组内相似、组间差异大。K-means属于最典型的划分式聚类它有一个非常明确的预设每个样本只能属于一个簇不能同时属于多个簇这就是所谓硬分配。这个硬分配假设直接决定了K-means的能力边界。因为它的分配规则是哪个簇中心离我最近我就归哪个簇所以K-means天然认为数据在空间中呈现的是一团一团的凸结构。说得再直白一点它默认每个簇都长得像圆润的球最多是半径不同的球。如果你的数据实际是弯的、环形的、嵌套的K-means会把它们强行切出几条直线边界来结果就会很奇怪。我在实际中的体会是拿到一份数据先不要急着跑算法先问自己一个问题这些数据真的能用离谁近就归谁来描述吗如果答案是应该可以那K-means值得一试如果答案是否定的那从一开始就应该换密度聚类或者层次聚类而不是后面拿一堆参数去补救。1.2 从误差平方和看K-means的数学本质K-means要优化的目标函数很简洁就是所有样本到它所属簇中心的误差平方和SSE写成公式是J Σᵢ ₌ ₁ⁿ ||xᵢ - μ_c(i)||²其中xᵢ是第i个样本c(i)是这个样本被分配到的簇编号μ_c是第c个簇的中心也叫质心。这个式子可以拆解成k个簇各自计算内部距离再求和所以K-means的任务本质上是找出k个代表点让所有样本距离自己所属代表点的平方距离总和最小。这里有个数学细节值得留意为什么用欧氏距离的平方而不是直接用欧氏距离或者绝对值距离因为目标对质心μ求导后最优解恰好是这个簇内所有样本的均值。均值是收到了平方这个操作的加持才成立的——只有误差平方和的梯度是线性的能让每个簇的最优中心直接以解析形式写出来。这也是K-means每次迭代里更新质心这一步如此简单的根本原因。目标函数本身对簇的分配和质心位置是联合优化的这个问题在计算上是NP难的没办法一步到位求全局最优。所以K-means选择了一种贪心式的迭代策略先固定质心分配样本再固定样本更新质心反复试探着往山下走。它能找到的通常是一个局部最优解而不是全局最优解。1.3 为什么分配—更新交替迭代能收敛K-means的迭代过程其实是最简单的EM思想虽然作者在原始论文里没有用EM这个说法但骨架完全一致每一轮干两件事分配步骤E步固定所有质心把每个样本分给距离最近的质心。更新步骤M步固定所有分配结果把每个簇的均值当作新质心。为什么这两步不断重复就会收敛关键在于每一步都不会让目标函数变大。分配步骤取的是最近质心即使某个样本分到别的簇会更差我们也只会选择最近的那个所以SSE至少不会上升更新步骤取均值而均值恰好是最小化簇内平方误差的点所以同样不会让SSE上升。一个单调不增、又有下界0的序列必然是收敛的。用一个生活类比一群人站在操场上先随机指定几个领队然后大家各自走向最近的领队并站好接着每个领队走到自己队伍的正中央大家再重新看看哪个领队最近、重新站队……这样反复几次队形就会稳定下来。K-means就是这个逻辑只是它用数学把领队和正中央都精确化了。不过注意收敛不等于找到最优解。因为起始质心的位置不同最终停下来的局部最优也不同。所以稍微靠谱一点的实现都会多次随机初始化取SSE最小的那次结果。2. 从零手写K-means三个容易被忽略的工程细节2.1 初始化随机初始化与K-means的区别我建议每个人都亲手写一遍K-means不是为了造轮子而是因为写完之后你再回头看现成库的文档很多参数就知道它是干什么用的了。第一个需要重视的环节是初始化。最朴素的初始化是从样本里随机抽k个点当作初始质心但这样做有两个风险抽到的质心可能扎堆在同一片区域导致K-means要花很长时间才能把质心推开也可能抽到离群点直接把一个簇带偏。为此K-means提供了一种更聪明的初始化方式先随机抽第一个质心之后每抽一个新质心时让距离已有质心越远的样本有越大概率被选中。这样初始质心天然分散收敛更快最终结果也更稳定。下面是一个带K-means初始化的手写实现代码不多用于理解原理足够import numpy as np def kmeans(X, k, max_iter100, tol1e-4, seedNone): rng np.random.default_rng(seed) n, d X.shape # K-means 初始化 centers [X[rng.integers(n)]] for _ in range(1, k): dist_sq np.min([ np.linalg.norm(X - c, axis1) ** 2 for c in centers ], axis0) # 加一个小常数避免概率全为0导致除零 prob dist_sq / (dist_sq.sum() 1e-12) centers.append(X[rng.choice(n, pprob)]) centers np.array(centers) history [] for _ in range(max_iter): # 分配步骤每个样本选择最近的质心 distances np.linalg.norm( X[:, None, :] - centers[None, :, :], axis2 ) labels np.argmin(distances, axis1) # 更新步骤重新计算每个簇的均值 new_centers np.zeros_like(centers) for j in range(k): mask labels j if mask.any(): new_centers[j] X[mask].mean(axis0) else: # 空簇保留原质心避免除零 new_centers[j] centers[j] sse 0.0 for j in range(k): mask labels j sse np.sum((X[mask] - centers[j]) ** 2) history.append(sse) # 收敛判据质心移动距离小于阈值 if np.linalg.norm(new_centers - centers) tol: centers new_centers break centers new_centers return centers, labels, history这段代码分成三个部分初始化、迭代主循环、收敛判断。你拿这个实现跑一些自己造的数据能很直观地感受到质心是怎么一步步移动的。2.2 主循环中的三个隐藏细节手写版本麻雀虽小但有几个细节是实际工程里绕不开的坑我在标注里只点了一下这里展开说。第一个是空簇问题。分配步骤结束后如果某个簇一个样本都没有均值计算就会碰到除零。常见做法有两个一个是直接保留上一轮的质心让它在下一轮再参与竞争另一个是重新随机选一个样本作为质心。保留原质心实现简单但弱化了探索能力重新初始化可能让结果变得更差更差需要结合收敛曲线去判断。我一般用保留原质心的方案然后把这种空簇事件打印出来看看数据里是不是有极端的密度不均。第二个是收敛判据。代码里用的是新旧质心的欧氏距离小于tol这是最简单的一种。更严格一点可以同时看SSE的变化量比如连续两轮SSE相差小于tol就停止。但要注意K-means在某些数据上会出现质心在两个点之间来回振荡的情况SSE在原地上小幅抖动tol设得太小会导致永远不收敛所以必须配合max_iter做兜底。我在实际项目里通常设置max_iter100左右很少需要跑满。第三个是记录SSE历史。很多初学教程只让你输出簇标签不让你看loss曲线。但SSE随迭代下降的曲线非常有用如果曲线一路平缓下滑然后稳定说明收敛正常如果曲线一直在跳说明数据可能根本不具备球形簇结构或者初始化有问题。每次跑完K-means我习惯把history打出来看一眼比任何高级评估指标都直观。2.3 复杂度与数据规模预估K-means每一轮的时间复杂度是O(n·k·d)其中n是样本数k是簇数d是特征维度。分配步骤需要算每个样本到每个质心的距离这是大头更新步骤只有O(n)。迭代次数T一般不大几十轮到几百轮所以整体复杂度是O(n·k·d·T)。这个复杂度意味着K-means对样本量是比较友好的。几万样本、几十个特征、k不大直接跑完全没问题。但如果样本量到了百万级问题就来了n·k·d的距离矩阵在n1,000,000、k100、d50时要占的内存大约是1,000,000 × 100 × 8字节 800MB这还只是存储一个矩阵如果一次性广播计算距离内存直接爆炸。这时候要么用Mini-Batch K-means——每次抽一小批样本来做分配和更新速度飞快代价是精度略降要么先做降维把d降下来再跑。还有一个经验如果数据点非常多可以先用随机抽样跑一次K-means得到质心然后把全量数据分配到最近质心也不失为一种快速方案。总之K-means虽然简单但真正用到大规模数据时还是要动点脑筋的。3. K值怎么定手肘法、轮廓系数与业务倒推3.1 手肘法的肘在哪里最明显哪里会骗人K值是K-means里最让人头疼的参数。最常见的方法是手肘法原理很简单随着K增大SSE一定会下降因为簇多了每个样本离簇中心更近但下降速度会有变化K小于真实簇数时每多一个簇都能大幅减少SSEK超过真实簇数后继续增加簇带来的收益就很有限了。SSE对K的曲线会像一条胳膊拐弯的地方就是肘。实际操作上我会对K从1到10逐一跑多次每次取最优SSE然后把折线图画出来看。但真到了真实数据上这条曲线往往是平滑下降的很少出现教科书里那种锐利的拐角。有时候曲线在K4时有个小拐弯在K6时又有个小拐弯你就得判断哪个更符合后续需求。更麻烦的是K-means每次跑都收敛到不同的局部最优SSE会抖动。如果每个K只跑一次折线图甚至可能出现K5的SSE比K4还大的不单调情况肘点就完全没法看了。所以我强烈建议手肘法必须搭配每个K重复多次初始化并取最优SSE这个条件来用否则画出来的曲线根本不是这条K-means算法真实能力的曲线。3.2 轮廓系数在什么情况下会误导你手肘法之外轮廓系数是另一个高频使用的指标。对单个样本轮廓系数定义为s (b - a) / max(a, b)其中a是该样本与同簇其他样本的平均距离b是该样本与最近的其他簇中所有样本的平均距离。s接近1表示样本被归得很好簇内紧簇间远接近0表示样本恰好落在两个簇边界接近-1说明样本可能被分错了。把所有样本的s取平均就得到整个聚类的平均轮廓系数一般用它来比较不同K值。但轮廓系数有一个隐含偏好它奖励的是凸且紧致的簇。如果业务上的真实分组本来就是长条形的、嵌套的比如城市里沿河分布的店铺、环路上的住宅区轮廓系数会给很低的分值让你误判为聚类失败。另外平均轮廓系数是全局的一个小而清晰的簇和一个大而混乱的簇可能互相抵消导致总体数字中等偏上但你知道其中一堆簇根本没法用。我的做法是轮廓系数只用来做初筛选两三个候选K值然后人工看簇的内容。它告诉我几何上哪个K更合理但最终决定权必须交给业务上下文。3.3 用业务问题反推K的三种方式数学指标只能给建议真正定K值往往要回到业务问题上来。这里有三个我自己常用的思路供参考。第一种是运营可解释性。比如给用户分群是为了做差异化运营运营团队一般能承接的群数也就三到五个你硬是按数学指标选出一个K8最后没法落地那这个K就是无效的。我一般先问业务方你预想中能接受几套策略把这个数作为K的上界。第二种是簇的可描述性。聚类完成后把每个簇的质心特征拿出来对比如果两个簇在几乎所有维度上的均值都差不多只有微小的数字差异说明这两个簇在实际意义上是同一个群K取大了反过来如果一个簇的样本方差极大明显比别的簇大得多说明这个簇内部可能还藏着子群K取小了。第三种是利用先验标签验证。如果数据里有部分业务自带的标签比如已知的老客/新客可以看聚类结果和这些标签的对应关系。但要注意聚类本来就是在发现标签之外的结构强行要求它和标签完全一致反而会掩盖新的洞察。所以这种方式更适合用来评估合理性而不是约束聚类的形状。4. 数据进聚类之前标准化、离群点与高维处理4.1 量纲与标准化Z-score还是Min-MaxK-means的核心距离是欧氏距离而欧氏距离对量纲极度敏感。举一个很典型的例子对用户做分群特征里有年龄20-60和年消费金额几千到几十万如果直接算距离年龄这个维度几乎完全被消费金额淹没聚类结果实际上只按消费金额切分年龄信息等于没用。所以聚类之前做标准化是基本操作。两种最常见的做法方法公式优点缺点Min-Max(x - min) / (max - min)结果固定落在[0,1]区间直观对离群点极其敏感一个异常值会把正常样本压到很小的区间Z-score(x - mean) / std比较常用保留了分布形状均值和标准差都被离群点影响如果数据里离群点不多Z-score是最省心的选择如果离群点比较多我推荐用稳健缩放把均值和标准差换成中位数和四分位距IQR即(x - median) / IQR。这个变换对离群点的抵抗力明显更强。当然也有不需要标准化的时候。如果所有特征本身是同一个物理单位、同一个尺度范围比如三维空间中点的坐标或RGB颜色值标准化反而会破坏原有的几何意义。要不要标准化归根到底取决于这个维度的绝对数值大小有没有意义。4.2 离群点一个异常值能拖垮整个聚类K-means用的是均值而均值对离群点非常敏感。设想一个簇本来在(0,0)附近密集分布某个样本跑到了(10000,10000)均值一下子被拉到(500,500)附近正常样本为了靠近质心不断被吸过去整个簇就被撕裂了。一个离群点造成的破坏可能比少跑几次初始化更大。处理方式通常有几种路径。第一种是先做离群点检测比如用IQR规则、基于距离的检测或者直接用DBSCAN跑一遍把孤立点找出来然后聚类前剔除。第二种是对长尾特征做对数变换或Box-Cox变换把极端的数值拉回常规区间。第三种是换用更鲁棒的聚类算法比如K-medoids它选簇内实际的样本点作为中心而不是算均值天然抗离群点。但我要特别提醒不要看到离群点就机械地删除。在用户分群场景里高消费用户往往数量很少但却是最有价值的群体直接删掉等于把最重要的信息扔了。更合理的做法是先识别出这批离群点单独研究他们属于哪种业务类型再决定是单独成一个簇、还是剔除、还是归并到某个正常簇里。4.3 高维数据维度灾难与降维取舍K-means在低维数据上表现稳健但维度一高就容易出问题。原因在于欧氏距离在高维空间里会退化当维度增加所有点之间的距离都会趋近于差不多的水平距离的相对区分度被稀释聚类结构自然就找不到了这叫维度灾难。几十个维度还可以接受几千维甚至更高维就必须先降维。常用的做法是先做PCA或截断SVD把维度降到几十维再跑K-means。降维会损失一些细节信息但换来了距离结构的稳定性整体聚类质量通常反而更好。还有一个思路是改变距离度量本身。比如文本场景里向量经过TF-IDF处理后通常是稀疏的、方向敏感的欧氏距离并不合适这时可以用余弦相似度再用球面K-means——每个样本和质心都先归一化到单位长度更新质心时也是把均值向量归一化再当质心。严格来说这已经不是教科书里的标准K-means但思路完全一脉相承。只要记住距离的选择必须匹配数据形态这条原则永远不变。5. 聚类结果别急着信检验方法、失败场景与换算法的信号5.1 内部指标与外部指标的适用场景聚类做完之后怎么判断结果好不好指标要分两类看。没有标签的情况下只能用内部指标。除了前面说的SSE和轮廓系数还有Davies-Bouldin指数簇内散布除以簇间分离越小越好和Calinski-Harabasz指数簇间方差比簇内方差越大越好。内部指标的共同特点是它们只能评价几何结构好不好比如簇够不够紧凑、分离够不够明显但评价不了这个分组在业务上有没有意义。所以指标好看只能说明算法层面是自洽的不能说明别的。有标签时才能用外部指标比如调整兰德指数ARI、归一化互信息NMI、纯度Purity。这些指标把聚类结果和真实标签做对比数值越高说明聚类越接近真实分布。但这里有个陷阱如果标签本身是业务自己打的聚类和标签不一致也不代表聚类失败因为聚类本来的使命就是发现标签里没有的潜在结构。我在项目里会把两类指标都跑一下内部指标用来判断几何质量外部指标用来检查是否偏离常识太远。5.2 簇内形态与质心含义的检查指标终究不能代替人眼和业务判断。拿到聚类结果之后我习惯做三件检查。第一是可视化。如果数据本身是二维或三维的直接散点图着色就能看出很多问题簇是不是严重重叠、是不是出现了狭长或空心的奇怪形状、离群点是不是被单拎出来成了一个簇。如果数据维度高就先做PCA降到二维再看。这个检查能在30秒内帮你否决掉一批明显不合理的K值。第二是质心检验。把每个簇的质心在每个维度上的值列出来和整体均值对比看看差异是否具备解释性。用户行为分群里一个簇的质心可能在使用频次上显著偏高、在使用时长上偏低这种模式能不能解释成某种用户画像如果解释不了哪怕指标再好这个簇也是算法产生的数字幻觉。第三是稳定性检查。同样的数据用不同随机种子跑10次K-means看看样本的分配结果变化大不大。如果每跑一次都有大量样本换簇说明数据本身没有稳定的簇结构任何分群都牵强。反过来如果结果高度稳定说明确实存在清晰的群组边界。5.3 什么时候该换掉K-means非球形簇、密度不均、类别不平衡K-means的局限性必须在实践中正视遇到下面三种情况就不该硬撑了。第一种是非球形簇。数据是弧形的、环形的、嵌套的K-means强行用直线边界去切结果一定离谱。比如有两个并排的半环形分布K-means会把两个环的端头拧在一起切出完全违背直觉的簇。第二种是密度差异大。一个簇很稠密、另一个簇很稀疏K-means为了降低稠密簇的内部SSE会把稀疏簇的边界不断压缩最终让稀疏簇被稀释得不成样子。第三种是簇大小严重不平衡。一个大簇几万样本几个小簇只有几十个样本均值更新时大簇的主导权极强小簇经常在迭代中被大簇吃掉。遇到这些情况我一般换三类算法GMM高斯混合模型它给每个样本一个概率归属而不是硬分配能处理重叠簇DBSCAN它按密度连片建簇能天然识别噪声层次聚类它能给出完整的谱系图解释起来更方便。现在总结一下我自己在这些年项目里的习惯拿到一份未知结构的数据先做一次快速降维并可视化看看整体形态。如果像几团密集的凸泡就用K-means如果形状复杂就直接放弃K-means从密度聚类和层次聚类里选。这个习惯帮我省下了大量调参时间。希望这篇笔记里写的东西也能帮你少走一些弯路至少在下次看到一串聚类标签的时候能准确地判断出这个结果到底该不该信。

相关新闻

Java基本数据类型详解与实战避坑指南

Java基本数据类型详解与实战避坑指南

1. Java基本数据类型深度解析 作为一名有十年Java开发经验的工程师,我经常遇到新手对基本数据类型理解不透彻的问题。今天我就来系统梳理Java的8种基本数据类型,分享一些实际开发中的使用技巧和避坑经验。 1.1 内存分配与数据类型的关系 当我们在Java中…

2026/10/14 11:00:07 阅读更多 →
Kubernetes Service本质:五种类型原理与网络排错指南

Kubernetes Service本质:五种类型原理与网络排错指南

1. Service不是“服务”,而是Kubernetes里最被误解的网络抽象层很多人第一次看到Service这个词,下意识就把它等同于“一个运行着的后端服务”,比如“我部署了一个用户服务,所以得配个Service”。这种理解错得离谱,而且…

2026/10/14 11:00:07 阅读更多 →
Qt Designer属性面板深度解析:从拖拽到代码的界面开发实践

Qt Designer属性面板深度解析:从拖拽到代码的界面开发实践

1. 从拖拽到代码:Qt Designer 属性面板到底在改什么很多人第一次打开 Qt Designer,看到右边那一长串属性编辑器,第一反应是“这玩意儿跟写代码有什么关系”。我刚开始用的时候也一样,拖了个按钮上去,改了个文字&#x…

2026/10/14 11:00:07 阅读更多 →

最新新闻

SSM+Django混合架构在鲜花电商系统的实践与优化

SSM+Django混合架构在鲜花电商系统的实践与优化

1. 项目概述:当鲜花遇上全栈技术 这个看似传统的网上花店系统,实际上是一个融合了Java企业级开发与Python快速迭代优势的复合型项目。SSM(SpringSpringMVCMyBatis)作为后端核心框架,提供了稳定的订单处理和库存管理能力…

2026/10/14 12:55:56 阅读更多 →
智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

摘要: 面对多样化的企业数据分析诉求,不同分析平台在底层数据组织、模型设计与分析颗粒度上存在显著差异。本文对比 GrowingIO、FineBI、Tableau、Power BI 与 Quick BI 五个平台的技术架构特征、核心计算模型、协同方式及部署要求,结合多源数…

2026/10/14 12:55:56 阅读更多 →
视觉重定位:层级场景坐标回归如何拆解分类与回归难题

视觉重定位:层级场景坐标回归如何拆解分类与回归难题

1. 视觉重定位到底在解决什么问题视觉重定位这个词,第一次接触的人容易把它和SLAM搞混。SLAM是"一边走一边建图,同时知道自己在哪里",而重定位是"我手里有一张图,或者我正站在某个位置拍了一张照片,我要…

2026/10/14 12:55:56 阅读更多 →
SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

1. 项目概述:为什么一张网卡要“分身”成几十个独立网口?你有没有遇到过这种场景:一台服务器上跑着十几个虚拟机,每个都要直连物理网络,低延迟、高吞吐、零丢包——结果发现宿主机的网卡成了瓶颈?CPU软中断…

2026/10/14 12:55:56 阅读更多 →
SpringBoot+Vue党员教育管理系统开发实践

SpringBoot+Vue党员教育管理系统开发实践

1. 项目背景与核心价值 党员教育和管理系统是当前基层党组织数字化转型的重要工具。这个基于SpringBootVue的全栈项目,完美契合高校计算机专业毕业设计的选题要求,同时具备实际应用价值。我在参与某机关单位党建系统升级时,深刻体会到这类系统…

2026/10/14 12:55:56 阅读更多 →
podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

简介:Podofo 0.9.5 在 Visual Studio 2013 下编译生成的 x86 预编译库,面向需要在 Windows 平台读写、编辑 PDF 文件的 C 开发者。Podofo 是一套开源 PDF 处理库,支持元数据读取、页面渲染、文本抽取、文档生成等常用能力,本包省去…

2026/10/14 12:54:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →