K-Means聚类从原理到实战:手写实现与客户分群全解析
做数据分析这几年聚类是我用得最多的无监督方法没有之一。K-Means听起来特别简单——把一堆点分成K堆每堆找个中心点反复迭代就完事了。但你真上手跑一遍K选几、数据要不要标准化、初始化怎么搞、跑出来的簇到底合不合理每个问题都能让人翻半天文档。今天这篇文章我就把从原理、代码到实战的整个流程串一遍从零手写一个能直接用在业务上的K-Means再用客户分群的案例跑完整条链路。适合两类读者一类是刚接触机器学习想搞清楚聚类算法底层逻辑的人另一类是用过sklearn的KMeans、但遇到反直觉结果时不知道如何排查的人。1. K-Means到底在解决什么问题——算法原理拆解1.1 一个朴素问题的数学化先想一个特别日常的场景一抽屉袜子颜色花纹各不相同让你把它们分成几堆。你大概率会先挑出几只最醒目的袜子当代表然后把每只袜子分到和它长得最像的代表那堆分完之后发现某堆里混进了不协调的就重新换代表再分一次直到大家都觉得差不多行了。这个流程就是K-Means在做的事。把袜子换成样本点把代表换成质心把长得像换成欧氏距离最近算法就浮出水面了。区别在于K-Means把差不多行了这种主观判断写成了一个可计算的数学目标——组内平方和行业内通常叫WSSWithin-Cluster Sum of Squares或者SSE。公式不复杂每个样本x_i属于簇C_k计算它与该簇质心μ_k的距离平方再把所有簇的加总起来。聚类任务的目标就是让这个值尽可能小越小说明簇内越紧凑分得越干净。这个目标函数有个值得注意的特点它直接决定了K-Means的适用边界。因为它算的是欧氏距离的平方和所以它天然偏好那种在几何空间中各向同性、接近球形的簇。如果数据分布是长条形、环形或者其他复杂形状K-Means就算知道正确的K值也切不对簇的边界。这一点后面讲距离度量和算法选型的时候还会再展开。1.2 交替迭代的两步套路有了目标函数怎么求最小值K-Means没用梯度下降用的是交替优化先固定质心把每个样本分配到距离最近的质心再固定分配结果把每簇内所有样本的均值当作新的质心。这两步反复交替目标函数只会下降或者持平不会反弹数学上能证明它必定收敛到某个局部最优解。第二步均值更新质心值得多解释一句。它之所以成立是因为在欧氏距离平方和的度量下均值恰好是让簇内距离和最小的那个点。换句话说一堆点的均值天生就是它们的最小平方和中心不需要再做复杂的寻优。这也是K-Means命中注定要背的两个锅一是它用均值当中心所以对异常点特别敏感一个极端值就能把质心拉跑二是它假设每个簇在几何上围绕均值均匀膨胀一旦簇形不规则效果就会打折扣。迭代循环的每一步其实都在做同一件事在给定簇的划分求最优质心和给定质心求最优划分之间来回切换。每次切换都让目标函数值变好一点点直到两轮之间质心几乎不动了算法就宣布收敛。理解了这个机制后面看代码的时候你会发现每一步都严丝合缝地对上了。1.3 收敛到底意味着什么大家用K-Means都会看到n_iter、tol这类参数但真正自己实现一遍才知道收敛有两种判断方式一种是质心位置的变化量小于某个阈值另一种是簇的分配结果不再改变。工程上更常用的是质心移动量连续两轮质心变化之和小于tol就认为稳了可以停。我习惯把tol设成1e-4对于标准化后的数据这个精度足够再小只会增加无意义的迭代次数。这里必须强调一个新手最容易误解的点K-Means一定会收敛但不保证收敛到全局最优。它收敛到哪很大程度上取决于初始质心选在哪。同一个数据集换一个随机种子跑出来可能就是另一套簇边界。这就是为什么K-Means初始化和n_init参数的存在价值——后面代码实战部分我会专门演示。2. 从零手写一个K-Means——numpy实现2.1 核心代码其实很短先别急着套sklearn用numpy把流程写一遍能让你看清每一步到底在做什么。完整的核心实现如下距离计算用了向量化写法一次广播算出所有样本到所有质心的距离矩阵没有显式的Python循环。import numpy as np def kmeans(X, k, max_iter100, tol1e-4, seed42): rng np.random.default_rng(seed) n_samples, n_features X.shape # 随机挑k个样本作为初始质心 idx rng.choice(n_samples, k, replaceFalse) centroids X[idx] for epoch in range(max_iter): # 距离矩阵形状 (n_samples, k) # X[:, None, :] 是 (n, 1, d)centroids[None, :, :] 是 (1, k, d) # 广播成 (n, k, d)对最后一个轴求范数得到 (n, k) dist np.linalg.norm( X[:, None, :] - centroids[None, :, :], axis2 ) labels np.argmin(dist, axis1) # 按簇取均值作为新的质心 new_centroids np.zeros_like(centroids) for j in range(k): cluster_points X[labels j] if len(cluster_points) 0: new_centroids[j] cluster_points.mean(axis0) else: # 空簇处理保留旧质心下一轮再吸收样本 new_centroids[j] centroids[j] shift np.linalg.norm(new_centroids - centroids) centroids new_centroids if shift tol: print(fiteration {epoch 1}: converged) break return labels, centroids这段代码里有两个关键设计。第一X[:, None, :] - centroids[None, :, :]利用了numpy的广播机制把原本需要写双重循环的距离计算压缩成一次向量化操作。样本量在几万以内跑起来非常快。但注意它的内存占用是O(n×k×d)如果样本量到了几十万、k又设成了几百中间那个大数组可能直接把内存吃爆。遇到这种情况我一般改成分块计算距离或者直接换mini-batch K-Means后面会细说。第二空簇处理。均值操作遇到没有样本的簇会产生NaN程序直接崩溃。上面的写法是保留旧质心继续迭代下一轮这个簇可能又会吸收新的样本。不过如果连续多轮都空着说明K设大了或者初始质心选歪了这时候要回头调整参数不能指望代码自己救回来。2.2 K-Means初始化值得手动实现一次前面说了随机初始化碰运气可能收敛到很差的局部最优。K-Means的思路是让初始质心尽量铺开第一个质心随机挑之后每选一个新质心离已有质心越远的样本被选中的概率越高。这样初始质心能覆盖整个数据空间的不同区域从源头上减少糟糕结果的出现概率。def init_centroids_plusplus(X, k, seed42): rng np.random.default_rng(seed) centroids [X[rng.integers(X.shape[0])]] for _ in range(1, k): # 计算每个样本到当前所有质心的最近距离平方 d np.min( np.linalg.norm( X[:, None, :] - np.array(centroids)[None, :, :], axis2 ) ** 2, axis1 ) # 按距离平方构建概率分布越远越容易被选中 probs d / d.sum() idx rng.choice(X.shape[0], pprobs) centroids.append(X[idx]) return np.array(centroids)注意看概率是用距离的平方构建的不是距离本身。这是K-Means论文里的关键设计平方距离放大了远点的权重让初始质心更倾向于分布在数据空间的边缘地带。把这段初始化替换到前面的kmeans函数里算法稳定性会有肉眼可见的提升。sklearn的KMeans默认用的就是K-Means初始化这也是它比裸写的随机初始化更稳的原因。2.3 怎么确认自己没写错写完代码得验证。最直接的方法是用sklearn当裁判拿同一份数据集用你手写的K-Means和sklearn的KMeans各跑一遍对比质心坐标。两者数值应该非常接近差异只在簇编号的顺序上——sklearn可能把某个簇编号成0你编号成1但成员构成是一样的。我踩过的一个坑是收敛阈值。第一次手写时把tol设成了1e-8结果跑了100轮迭代还没收敛输出结果和sklearn差得离谱。后来想想标准化后的数据特征尺度在1左右质心移动1e-8这是让算法无限逼近某个极限点代价是疯狂增加迭代次数。实际业务里1e-3到1e-4已经非常够了。如果你发现自己的实现和sklearn对不上先检查tol是不是设得太苛刻再检查空簇处理是不是引入了偏差这两个是最大的嫌疑。3. 实战中绕不过去的三座大山3.1 K值怎么选——两种方法配合使用说到K值这是K-Means使用者的头号难题。算法本身不会告诉你应该分3堆只能靠经验指标帮你做决定。最常用的两个肘部法和轮廓系数。肘部法很直观把K从1到10挨个跑一遍记录每次的WSS组内平方和。K越大WSS必然下降但下降幅度会越来越小。找那个从陡峭变成平缓的拐点就是合适的K。这个拐点像手臂的肘部所以叫elbow method。实际操作中拐点有时候不明显曲线是一路平滑下降的这时候肘部法给不了明确答案。轮廓系数是另一种思路不只看整体紧密度还看每个样本是否跟对了组织。对某个样本ia_i是它到同簇其他样本的平均距离b_i是它到最近的其他簇样本的平均距离轮廓系数就是(b-a)/max(a,b)范围在-1到1之间。越靠近1说明样本离自己的簇很近、离其他簇很远分得好越靠近0说明样本在簇边界上负数说明它跟错了簇。把所有样本的轮廓系数取平均就是整体聚类质量的评价。两种方法建议搭配使用肘部法给你一个大方向轮廓系数帮你确认。如果大方向指向K3轮廓系数在K3时也最高那就比较稳了。但我要提醒一句如果业务场景已经有了明确需求——比如运营团队只能承接4套差异化方案——那就直接设K4不要让算法指标凌驾于业务现实之上。3.2 特征标准化和小众但致命的预处理坑K-Means用欧氏距离这意味着每个特征对距离的贡献跟它的数值尺度成正比。假设一个数据集里有年收入单位元和年龄单位岁收入动辄五位数年龄只有几十距离计算时年龄特征会被完全淹没。所以标准化几乎是强制步骤我常用的做法是StandardScaler让每个特征变成均值为0、方差为1。标准化在K-Means里的重要性我甚至觉得比选K值还高。有一次我拿着没标准化的真实消费数据跑聚类结果所有簇边界完全被金额特征主导等于其他特征全部白费。标准化之后同一套代码出来的簇质量完全不一样轮廓系数直接翻倍。这不是调参技巧是算法前提条件的满足。还有一个坑特征是类别型的时候别直接编码成数字丢进去。颜色红绿蓝编码成1、2、3欧氏距离里2到3只差12到1也只差1完全没意义。要么做one-hot编码要么换适配方类特征的聚类方法。另外特征之间高度相关也很麻烦比如消费总额和消费次数如果强相关相当于同一份信息被重复计入了两次距离计算这会稀释真正的聚类结构。这种情况可以先做PCA降维预处理再进K-Means。3.3 距离度量与簇形假设的边界经典K-Means用欧氏距离算的是直线距离。但业务里很多相似度不能用直线距离衡量。比如用户行为序列的相似度、文本向量的接近程度用余弦相似度往往更合理。需要注意的是一旦换了距离度量严格来说就不再是标准K-Means了因为均值更新在余弦空间里不保证目标函数单调下降迭代稳定性需要重新验证。实际业务里这种需求我一般直接切到其他聚类算法硬改距离度量得不偿失。更常见的问题是K-Means的簇形假设它擅长分凸的、大小比较均匀的、近似球形的簇。遇到长条形、环形、密度差异极大的结构就算K值设得完全正确K-Means也切不对。举个例子一组同心圆环数据K-Means从任何角度都切不断内外环但DBSCAN可以按密度天然把内外环分开。所以遇到这类数据别死磕K-Means该换算法就换算法。我自己的经验是先可视化数据分布发现明显不是一团一团的球形结构就直接考虑层次聚类或DBSCAN省得白调半天参。4. 完整实战从模拟数据跑通客户分群全流程4.1 构造一份看得见真相的数据这里我用sklearn的make_blobs生成三个高斯簇模拟客户数据年收入、月消费次数、平均订单金额三个字段。提前知道真实簇数是为了验证整个流程走得通、结果是对的。from sklearn.datasets import make_blobs from sklearn.preprocessing import StandardScaler X_raw, y_true make_blobs( n_samples1000, centers3, n_features3, cluster_std1.5, random_state42 ) scaler StandardScaler() X scaler.fit_transform(X_raw)cluster_std1.5是故意让簇之间有一点重叠模拟真实业务里边界模糊的情况。标准化之前先打印一下X_raw前几行你会发现年收入是4万到10万的尺度月消费次数是0到10的尺度平均订单金额是50到300的尺度三个字段量纲天差地别不标准化直接算距离等于把前两个维度废掉。4.2 用肘部法和轮廓系数锁定K值下面这串代码把第二章的K-Means和第三章的选K方法串起来import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score wss_list [] sil_list [] k_range range(2, 10) for k in k_range: km KMeans(n_clustersk, initk-means, n_init10, random_state42) km.fit(X) labels km.labels_ wss_list.append(km.inertia_) sil_list.append(silhouette_score(X, labels)) # 可视化两条曲线 fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].plot(k_range, wss_list, markero) axes[0].set_title(Elbow Method) axes[1].plot(k_range, sil_list, markers, colorgreen) axes[1].set_title(Silhouette Score) plt.tight_layout() plt.show()这里我特意用了sklearn的KMeans而不是自己手写的版本因为n_init10这个参数要解释它表示同一份数据用10组不同的随机初始质心跑10遍最后选WSS最小的那组结果作为最终输出。手写的那个kmeans函数为了代码简单没有加这个机制这也是工程实现和教科书实现的重要差别。跑出来的结果会在K3处看到明显拐点轮廓系数也在K3处达到最高两者互相印证K3就是这组数据的最优解。注意这里的WSS和轮廓系数的计算都必须基于标准化后的X而不是原始数据。基于原始数据的轮廓系数会被量纲大的特征主导我今天就不演示这个反例了但你记着这个原则聚类过程里所有距离计算都必须在同一份标准化空间里完成。4.3 从簇编号到业务画像的最后一公里确认K3之后把聚类结果映射回原始尺度看每个簇的特征均值这一步才是客户分群真正产生价值的地方centers_scaled km.cluster_centers_ # sklearn的inverse_transform可以直接把标准化空间的质心还原到原始尺度 centers_raw scaler.inverse_transform(centers_scaled) df_centers pd.DataFrame( centers_raw, columns[annual_income, purchase_freq, avg_order_value] ) print(df_centers)输出大概率会是这样一张画像表簇编号年收入(元)月消费次数平均订单金额(元)0约5.2万约8.5次约80元1约12万约4.2次约260元2约7.8万约6.3次约150元看到这个业务含义就很清晰了簇1是高收入、低频次、高客单价的高价值精买型客户簇0是低收入、高频次、低客单价的价格敏感型客户簇2是各项居中的大众型客户。如果这是真实业务运营就可以针对这三类人分别设计不同的推送策略和供应链配置。这个从簇编号对应回业务概念的过程比调参更关键。我见过不少新人跑完聚类直接拿label当标签下发业务同事看到一堆0、1、2完全不知道什么意思最后搞得数据团队和业务团队互相甩锅。补充一句簇的编号是算法随机定的0/1/2不代表任何业务优先级或好坏排序。你必须靠特征均值去倒推命名绝不能按编号大小来解读。我刚开始做客户分群时就吃过这个亏把0号簇当成最值得关注的群体结果发现0号恰恰是预算最少的那批。5. 常见问题与排查技巧实录5.1 空簇出现怎么办前面代码里我做了空簇保护直接保留旧质心继续迭代。但如果你在实际运行中发现某个簇从头到尾都是空的或者分了10次簇有3次都出现空簇那就说明K设得太大或者初始化质量太差。K太大意味着强行把一个连续分布切成不存在的几块总会有某个区域抢不到样本这种情况把K调小一档基本就好。如果是偶发性的空簇多半是初始化点落在数据空间极端角落换成K-Means初始化、调大n_init参数问题一般就消失了。5.2 每次跑出来的结果都不一样这是局部最优问题。K-Means只能保证收敛到局部最优不同初始质心可能导向不同局部最优解所以每次结果不同是正常现象。解决办法就是多跑几遍取最优设置n_init10或者更大让算法每次换一组初始质心跑完后取WSS最小的那组作为最终结果。sklearn的KMeans一直内置了这套机制你自己手写版本的时候记得也要实现。这里有个小技巧对比两次聚类哪个更好不要看轮廓系数这种全局指标而是直接对比min(WSS)因为K-Means的目标函数就是WSS谁低谁就是找到了更好的局部最优。5.3 数据量大或者维度过高怎么扛前面提到过大矩阵内存爆炸的问题。当n_samples达到几十万、k几百的时候X[:, None, :] - centroids[None, :, :]这个中间数组就是几十万乘以几百乘以特征维度规模大得吓人。解决办法有三个方向第一分块计算距离每次只算一万个样本到质心的距离跑完再把labels拼起来内存占用直线下降第二用mini-batch K-Means每次抽样一小批样本更新质心速度飞快适合海量数据第三如果特征维度高到几千上万先做PCA降维到几十维再聚类一方面降噪一方面让距离计算重新变得有意义。高维空间里欧氏距离本身的区分度会急剧退化这一条不是可选优化是高维聚类的必选项。5.4 K-Means、层次聚类和DBSCAN怎么选简单给个选型结论数据分布是紧凑的、大致球形的、簇数量明确的用K-Means准没错速度快、可解释性强。要输出一棵聚类树想看数据在不同粒度下的分层结构用层次聚类。数据有复杂的簇形状或者有明显的密度分布差异DBSCAN的密度连通性会比K-Means的抗造得多。还有一个场景是异常检测——K-Means会把离群点强行塞进某个簇DBSCAN则会直接标记为噪声点。我自己在业务里的习惯是先画个二维降维图瞄一眼数据长什么样如果一眼看过去不是一团一团的球就果断绕过K-Means。选型这件事看数据形态比背算法特性更有用。写在最后的实操体会手写一遍K-Means最大的收获不是写出几十行numpy代码而是彻底搞懂了那个经常被当黑盒使用的KMeans对象到底在里面做了什么。之后再用sklearn看到n_init、tol、max_iter这些参数心里就有底了知道它们各自影响的是什么环节哪个参数该用默认值哪个参数得按数据规模调。如果你也正在学聚类我强烈建议你找个下午开着notebook从零写一遍这个算法再用sklearn对照验证一下。很多调参上的玄学在那个下午之后会变得非常具体。这个练手版本我还在继续往上加东西比如对文本向量做稀疏特征上的K-Means、实现mini-batch版本应对更大数据量后续有机会再单独开一篇细说。

相关新闻

JavaCV中FFmpeg加载失败?UnsatisfiedLinkError报错全解析

JavaCV中FFmpeg加载失败?UnsatisfiedLinkError报错全解析

最近项目里视频抽帧模块在测试环境启动,初始化FFmpegFrameGrabber时直接炸了,控制台刷出一行经典报错:java.lang.UnsatisfiedLinkError: org.bytedeco.ffmpeg.global.avutil.AV_PIX_FMT_GBRAP14()I看到UnsatisfiedLinkError,搞过J…

2026/10/14 19:29:15 阅读更多 →
t3code:命令行下的代码剪贴板清洗工具,终结复制粘贴脏输入

t3code:命令行下的代码剪贴板清洗工具,终结复制粘贴脏输入

如果你和我一样,每天要在浏览器、IDE、终端、聊天窗口之间搬运代码,你一定遇到过这种隐蔽的坑:从网页里复制一段代码,粘贴进文件后缩进全乱、行尾挂着 ^M、字符串里的中文引号全变了样。时间久了,我决定不再手动跟这些…

2026/10/14 17:15:14 阅读更多 →
ANSYS Fluent工程实践手账:启动设置、网格命名与报告导出全解析

ANSYS Fluent工程实践手账:启动设置、网格命名与报告导出全解析

简介:本资源是《FLUENT工程技术与实例分析》一书的官方配套实践文件包,面向CFD初学者、高校流体力学/热能工程专业学生及工程仿真从业人员,旨在解决FLUENT软件从建模、求解到后处理的全流程实操难点。压缩包共147个文件,含35个cas…

2026/10/13 14:38:50 阅读更多 →

最新新闻

TypeScript协议适配:将Claude Code前端无缝对接Deepseek模型

TypeScript协议适配:将Claude Code前端无缝对接Deepseek模型

1. 这不是“换壳”,而是一次精准的协议层手术“80行 TypeScript Mods,把 Claude Code 改造成 Deepseek Harness”——这个标题乍看像极了某些技术圈里常见的“魔改教程”,但实际操作中,我很快意识到:它根本不是在 UI 上…

2026/10/14 19:57:05 阅读更多 →
高效贡献开源Hermes agent:从源码阅读到PR合入的完整路线

高效贡献开源Hermes agent:从源码阅读到PR合入的完整路线

1. 为什么值得把精力花在贡献 Hermes agent 上先说一个很多人的误解:贡献开源项目不等于闷头写代码,尤其像 Hermes agent 这类项目,它是一个持续推进的工程产物,有设计取舍、有兼容负担、也有社区协作的规范。第一次接触时容易觉得…

2026/10/14 19:57:05 阅读更多 →
DOM遍历不是for循环:深度优先与广度优先的工程选型指南

DOM遍历不是for循环:深度优先与广度优先的工程选型指南

/* 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 19:57:05 阅读更多 →
ESP32-S3开发板入门:从环境搭建到GPIO、PSRAM与USB应用全解析

ESP32-S3开发板入门:从环境搭建到GPIO、PSRAM与USB应用全解析

/* 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 19:57:05 阅读更多 →
FPGA现货采购避坑指南:从型号解读到验货实战

FPGA现货采购避坑指南:从型号解读到验货实战

/* 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 19:57:05 阅读更多 →
手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡:从轮询到一致性哈希的算法与工程实践

手写负载均衡这件事,听起来像是业务代码写多了自娱自乐,但真把它当回事做一遍的人,对分布式流量的理解完全不一样。很多时候我们一直在用现成组件——Nginx、LVS、各种注册中心自带的负载策略——出了问题只能对着文档调参数,根本…

2026/10/14 19:56:03 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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 阅读更多 →