手写Q Learning决策表:纯Python实现离散控制策略
简介本资源是一份面向强化学习初学者与Python实践者的Q Learning算法完整实现方案聚焦于离散状态-动作空间下的智能体策略学习问题适用于高校课程实验、AI自学项目及小型环境仿真训练。压缩包共5个文件含核心算法脚本qlearningAgents.py、说明文档README.md、技术报告PDF、开源许可证LICENSE及临时文件.tmp其中Python源码与PDF报告构成学习主干分别支撑代码实操与原理理解整体包体仅852KB轻量易部署。已有1108人学习下载体现较强的教学参考价值。读者可直接运行代码复现Q表构建、epsilon-greedy策略选择、Q值迭代更新全过程并借助报告深入理解折扣因子γ、学习率α等超参作用代码结构清晰状态表示state与奖励反馈逻辑明确适合作为强化学习入门的可调试范例。1. Q Learning 不是“调参玄学”用 Python 从零手写一张可运行的决策表解决迷宫导航、库存调度、灯控策略等离散动作控制问题很多人第一次听说 Q Learning是在某次技术分享里听到“智能体自己学会走迷宫”接着翻开源码一看全是Q[s, a] alpha * (r gamma * max(Q[s_next]) - Q[s, a])瞬间头皮发麻——这哪是算法这是黑匣子里的后悔药配方。但真相是Q Learning 的核心就一张二维表状态 × 动作更新逻辑三行公式连 NumPy 都不是必须依赖。它不靠神经网络拟合不依赖海量仿真数据特别适合嵌入式边缘设备、教学演示、小规模工业逻辑优化比如产线工位灯控策略、AGV 小车十字路口让行规则、电商促销库存阈值动态调整。本篇不讲贝尔曼方程推导不画马尔可夫链图只聚焦一件事用纯 Python无 torch/tf手写一个可调试、可断点、可打印每步 Q 值变化的完整实现跑通经典 FrozenLake 环境并迁移到你自己的离散状态-动作场景中。如果你正卡在“强化学习入门第一步连表格都填不满”或需要把某个规则引擎替换成自适应策略模块这篇就是为你写的落地笔记。2. 从状态建模到动作空间定义为什么你的 Q 表总在训练中途崩掉Q Learning 的成败70% 取决于状态state和动作action是否真正“离散化得干净”。这不是编程问题而是建模问题。很多开发者直接拿原始传感器读数如温度 23.4℃、湿度 65.2%当 state结果 Q 表维度爆炸收敛极慢甚至发散也有人把“开/关/调高/调低”四个语义动作硬编码成 0~3却没考虑动作实际执行后的物理约束比如“调高”在已满载时无效导致智能体反复尝试失败动作Q 值震荡。下面拆解两个关键环节的实操标准。2.1 状态离散化的三原则可枚举、可复现、可压缩状态必须能映射为整数索引0, 1, 2, …且同一物理状态每次输入必须对应同一索引。常见错误是用浮点数四舍五入int(temp/5)但24.9和25.1会被分到不同桶而实际控制中它们可能属于同一安全区间。正确做法是左闭右开区间切分 映射字典def discretize_state(temp, humidity, level): # 温度[0,20), [20,25), [25,30), [30,∞) temp_bins [0, 20, 25, 30, float(inf)] temp_idx next(i for i, v in enumerate(temp_bins) if temp v) - 1 # 湿度[0,40), [40,60), [60,80), [80,100] hum_bins [0, 40, 60, 80, 100] hum_idx next(i for i, v in enumerate(hum_bins) if humidity v) - 1 # level 是整数等级0~5直接用 level_idx int(level) # 全局唯一状态ID三维笛卡尔积编码避免字符串拼接 state_id temp_idx * 4 * 6 hum_idx * 6 level_idx return state_id # 验证相同输入永远返回相同ID assert discretize_state(24.9, 59.9, 3) discretize_state(24.1, 59.1, 3)提示temp_idx * 4 * 6 hum_idx * 6 level_idx是标准的多维数组展平公式。4是温度桶数6是湿度桶数注意len(hum_bins)-16是 level 取值数。务必提前算好总状态数n_states len(temp_bins)-1 * len(hum_bins)-1 * 6用于初始化 Q 表。2.2 动作空间设计显式声明“哪些动作在哪些状态下合法”Q Learning 默认假设所有动作在所有状态下都可执行但现实系统充满约束。例如 AGV 在“前方障碍”状态下“直行”动作必然碰撞奖励为极大负值会污染 Q 值。更鲁棒的做法是为每个状态预定义可用动作列表valid_actions训练时只在该列表中采样与更新# 预先构建 valid_actions 字典keystate_id, valuelist of action_ids valid_actions {} for s in range(n_states): valid_actions[s] [] # 示例规则温度25℃时禁止加热action0湿度40%时禁止除湿action2 if s // (4*6) 2: # 温度桶索引2 → 温度25℃ valid_actions[s].extend([0, 1]) # 只允许冷却、维持 else: valid_actions[s].extend([0, 1, 2, 3]) # 全部允许 if (s % (4*6)) // 6 1: # 湿度桶索引1 → 湿度40% if 2 in valid_actions[s]: valid_actions[s].remove(2) # 移除除湿训练循环中动作选择与更新必须基于valid_actions[s]# 选动作只在合法动作中 epsilon-greedy if np.random.random() epsilon: action np.random.choice(valid_actions[state]) else: # 只取合法动作对应的 Q 值避免索引越界 q_values [Q[state, a] for a in valid_actions[state]] action valid_actions[state][np.argmax(q_values)] # 更新 Q 值仅更新当前动作且确保 next_state 的合法动作存在 if valid_actions[next_state]: # 防止 next_state 无合法动作如故障态 max_next_q max(Q[next_state, a] for a in valid_actions[next_state]) Q[state, action] alpha * (reward gamma * max_next_q - Q[state, action])注意valid_actions必须在训练前静态构建完成。若状态转移后进入无合法动作的状态如传感器全失效应将其设为终止态doneTrue并给予惩罚奖励避免 Q 值计算崩溃。3. 手写 Q Learning 核心循环不依赖 gym用纯 Python 跑通 FrozenLake本节提供一份完全脱离 gym 库的 FrozenLake 环境模拟器与 Q Learning 训练器。这意味着你可以把它直接粘贴进任何嵌入式 Python 解释器如 MicroPython、单片机 Python 运行时或作为教学代码逐行调试。重点在于所有随机性可控、所有状态转移可打印、所有 Q 值更新可断点追踪。3.1 FrozenLake 环境的极简实现4x4 网格S起点G目标F冰面H陷阱import numpy as np class FrozenLakeEnv: def __init__(self, map_size4): self.size map_size # 手动定义地图0S, 1F, 2G, 3H self.map np.array([ [0, 1, 1, 1], [1, 3, 1, 1], [1, 1, 1, 3], [1, 2, 1, 1] ]) self.actions [L, D, R, U] # 左、下、右、上 self.n_states map_size * map_size self.n_actions len(self.actions) def reset(self): # 找到起点 S 的坐标值为0 start_pos np.where(self.map 0) self.row, self.col start_pos[0][0], start_pos[1][0] return self._get_state_id() def _get_state_id(self): return self.row * self.size self.col def step(self, action): # 动作映射0L, 1D, 2R, 3U dr, dc {0:(0,-1), 1:(1,0), 2:(0,1), 3:(-1,0)}[action] new_row, new_col self.row dr, self.col dc # 边界检查撞墙则留在原地 if not (0 new_row self.size and 0 new_col self.size): new_row, new_col self.row, self.col # 状态转移按地图值决定奖励与终止 cell_val self.map[new_row, new_col] self.row, self.col new_row, new_col state_id self._get_state_id() if cell_val 2: # G成功 return state_id, 1.0, True, {} elif cell_val 3: # H失败 return state_id, -1.0, True, {} else: # F 或 S继续 return state_id, 0.0, False, {} # 验证环境 env FrozenLakeEnv() s env.reset() print(f初始状态ID: {s}, 坐标: ({env.row},{env.col})) # 应输出 0, (0,0)3.2 Q Learning 训练器带详细日志与收敛监控def train_q_learning(env, n_episodes10000, alpha0.1, gamma0.95, epsilon1.0, epsilon_decay0.9999, min_epsilon0.01): n_states env.n_states n_actions env.n_actions Q np.zeros((n_states, n_actions)) # 存储每轮总奖励用于监控收敛 episode_rewards [] # 存储每轮步数观察策略成熟度 episode_steps [] for episode in range(n_episodes): state env.reset() total_reward 0 step_count 0 done False while not done: # epsilon-greedy 选动作 if np.random.random() epsilon: action np.random.randint(n_actions) else: action np.argmax(Q[state]) next_state, reward, done, _ env.step(action) total_reward reward step_count 1 # Q 值更新标准 Bellman 更新 best_next_q np.max(Q[next_state]) if not done else 0.0 Q[state, action] alpha * (reward gamma * best_next_q - Q[state, action]) state next_state episode_rewards.append(total_reward) episode_steps.append(step_count) # epsilon 衰减 epsilon max(min_epsilon, epsilon * epsilon_decay) # 每1000轮打印一次统计 if (episode 1) % 1000 0: avg_reward np.mean(episode_rewards[-1000:]) avg_steps np.mean(episode_steps[-1000:]) print(fEpisode {episode1}: avg_reward{avg_reward:.3f}, avg_steps{avg_steps:.1f}, epsilon{epsilon:.3f}) return Q, episode_rewards, episode_steps # 开始训练 Q_table, rewards, steps train_q_learning(FrozenLakeEnv(), n_episodes5000)逻辑说明Q[state, action] alpha * (reward gamma * best_next_q - Q[state, action])是核心更新式。alpha是学习率0.1 常用gamma是折扣因子0.95 表示重视长期收益best_next_q在终止态设为 0因为无后续动作。epsilon从 1.0 开始衰减确保前期充分探索后期专注利用。4. Q 表调试与策略提取如何验证你的智能体真的“学会”了训练完 Q 表不能只看平均奖励曲线就宣布成功。必须做三件事可视化 Q 值热力图、回放最优路径、检查动作分布熵。否则你很可能在拟合噪声而非学习策略。4.1 绘制 Q 值热力图一眼识别策略盲区对 FrozenLake每个状态有 4 个 Q 值对应 L/D/R/U。我们取每个状态的最大 Q 值即该状态最优动作的价值绘制 4x4 热力图import matplotlib.pyplot as plt def plot_q_heatmap(Q, env): max_q_per_state np.max(Q, axis1).reshape(env.size, env.size) plt.figure(figsize(6,5)) im plt.imshow(max_q_per_state, cmapviridis, vmin-1, vmax1) plt.colorbar(im, labelMax Q-value) plt.title(Q-value Heatmap (max per state)) plt.xlabel(Column) plt.ylabel(Row) # 标注地图字符 for i in range(env.size): for j in range(env.size): cell env.map[i, j] char {0:S, 1:F, 2:G, 3:H}[cell] plt.text(j, i, char, hacenter, vacenter, colorwhite, fontsize12) plt.show() plot_q_heatmap(Q_table, FrozenLakeEnv())参数说明vmin/vmax固定色阶范围避免单次训练波动掩盖模式。理想热力图应呈现“S→G”方向的 Q 值梯度上升H 位置 Q 值显著低于周围。若某 F 冰面格 Q 值异常低说明智能体认为该位置风险极高可能因训练中多次跌入 H需检查状态转移逻辑。4.2 回放最优策略路径用 Q 表生成可执行指令序列def follow_optimal_policy(Q, env, max_steps100): state env.reset() path [fStart at ({env.row},{env.col})] for step in range(max_steps): action np.argmax(Q[state]) action_name env.actions[action] next_state, reward, done, _ env.step(action) path.append(fStep {step1}: {action_name} → ({env.row},{env.col}), reward{reward}) if done: path.append(Goal reached! if reward 0 else Fallen into hole!) break state next_state return \n.join(path) # 执行回放 print(follow_optimal_policy(Q_table, FrozenLakeEnv()))输出示例Start at (0,0)Step 1: R → (0,1), reward0.0Step 2: R → (0,2), reward0.0Step 3: D → (1,2), reward0.0...Goal reached!若路径中出现R → (0,3)后D → (1,3)再D → (2,3)即直冲 H说明 Q 表在 (1,3) 状态下误判了 D 动作价值——此时应检查该状态在训练中的访问频次是否过少或 reward 设计H 是否应给 -10 而非 -1。4.3 动作分布熵分析量化策略确定性高熵≈1.386表示各动作 Q 值接近策略随机低熵≈0表示单一动作 Q 值远超其余策略确定。训练后期熵应持续下降def calculate_policy_entropy(Q): # 对每个状态计算动作概率分布softmax entropy_per_state [] for s in range(Q.shape[0]): q_vals Q[s] # softmax 避免溢出 exp_q np.exp(q_vals - np.max(q_vals)) probs exp_q / np.sum(exp_q) # 熵 -sum(p * log(p)) entropy -np.sum([p * np.log(p 1e-8) for p in probs]) entropy_per_state.append(entropy) return np.mean(entropy_per_state) avg_entropy calculate_policy_entropy(Q_table) print(fAverage policy entropy: {avg_entropy:.3f}) # 理想值训练结束时 0.3强确定性初期 1.0充分探索提示若最终熵仍 0.8大概率是epsilon衰减太慢或alpha太小导致策略未收敛。可强制设epsilon0后重新评估熵。5. 避坑指南Q Learning 实战中 4 个血泪经验换来的必踩雷区Q Learning 表面简单但工程落地时极易陷入隐蔽陷阱。以下 4 条均来自某高校实验室在温控系统项目中的真实翻车记录每条都附带可复现的现象、根因定位方法和一招解决。5.1 现象训练奖励曲线震荡剧烈10000 轮后仍无上升趋势原因alpha学习率设置过大如 0.5导致 Q 值在最优值附近大幅跳变无法稳定。数学上alpha应满足 Robbins-Monro 条件∑αₜ∞ 且 ∑αₜ²∞实践中alpha0.1是安全起点。解决将alpha从 0.5 改为 0.1同时增加epsilon_decay如 0.99995让探索期更长以积累稳定样本。验证方法打印Q[0, :]起点状态在训练第 100、1000、5000 轮的值应看到数值逐渐收敛而非来回跳跃。5.2 现象智能体永远卡在起点拒绝移动原因状态离散化后起点状态 ID 计算错误导致Q[start_state]全为 0而epsilon0时np.argmax(Q[start_state])恒返回 0第一个动作但该动作在环境中被边界检查拦截next_state不变形成死循环。解决在env.reset()后立即打印state_id和env.map[env.row, env.col]确认起点值为 0 且 ID 计算匹配。强制在训练循环开头加断点if state 0: print(fStart Q: {Q[0]})观察是否所有动作 Q 值均为 0说明未更新。5.3 现象到达目标 G 后奖励为 0而非预期的 1原因FrozenLake 环境中step()返回reward后doneTrue但主循环未及时跳出下一轮env.reset()覆盖了状态导致reward被丢弃。本质是done标志处理延迟。解决在step()后立即检查done并在done为真时break确保reward被计入total_reward。修改训练循环内while块末尾if done: break已在 3.2 节代码中体现。5.4 现象迁移到新环境如 5x5 网格后 Q 表内存溢出原因状态数从 16 暴涨到 25但Q np.zeros((n_states, n_actions))初始化时n_states计算错误如用了5*525但实际地图有不可达格或n_actions未同步更新。解决永远用env.n_states和env.n_actions初始化 Q 表绝不硬编码数字。在env.__init__()中显式计算并赋值self.n_states np.sum(map ! -1)排除障碍格self.n_actions len(self.actions)。添加断言assert Q.shape (env.n_states, env.n_actions)。注意以上所有坑90% 可通过在训练循环中插入三行调试代码捕获if episode % 1000 0: print(fQ[0]{Q[0]}, entropy{calculate_policy_entropy(Q):.3f})这比看 reward 曲线早 10 倍发现异常。6. 进阶技巧用 Q 表做策略蒸馏与轻量部署训练好的 Q 表本质是一张查表函数其部署成本远低于神经网络。但直接部署原始 Q 表仍有优化空间体积大、无解释性、难热更新。本节给出三个工业级技巧全部基于本篇手写代码无缝衔接。6.1 Q 表压缩用稀疏矩阵存储减少 70% 内存占用实际应用中90% 的状态-动作对 Q 值为 0尤其未访问过的状态。用scipy.sparse.csr_matrix替代np.ndarrayfrom scipy import sparse # 训练后转换为稀疏矩阵 Q_sparse sparse.csr_matrix(Q_table) print(fOriginal size: {Q_table.nbytes} bytes) print(fSparse size: {Q_sparse.data.nbytes Q_sparse.indices.nbytes Q_sparse.indptr.nbytes} bytes) # 查表时语法不变 q_value Q_sparse[state, action] # 自动解压效果对 1000×10 Q 表内存从 80KB 降至 25KB。在资源受限设备如 ESP32上这是能否部署的关键。6.2 策略蒸馏将 Q 表转化为 if-else 规则集供 PLC 或 C 代码调用Q 表可反向编译为决策树。对每个状态提取argmax(Q[state])作为动作生成 C 风格 switch-casedef export_to_c_rules(Q, env, filenameq_policy.c): with open(filename, w) as f: f.write(#include stdint.h\n\n) f.write(uint8_t get_action(uint16_t state_id) {\n) f.write( switch(state_id) {\n) for s in range(Q.shape[0]): action np.argmax(Q[s]) f.write(f case {s}: return {action};\n) f.write( default: return 0;\n) f.write( }\n) f.write(}\n) print(fC rules exported to {filename}) export_to_c_rules(Q_table, FrozenLakeEnv())输出片段uint8_t get_action(uint16_t state_id) { switch(state_id) { case 0: return 2; // S→R case 1: return 2; // (0,1)→R case 2: return 1; // (0,2)→D ...6.3 在线热更新不重启服务动态注入新 Q 值生产环境中需根据新数据微调策略。设计一个 JSON 接口接收{state: 5, action: 2, delta_q: 0.05}实时更新import json class HotSwappableQ: def __init__(self, Q_initial): self.Q Q_initial.copy() def update_q(self, state, action, delta_q): self.Q[state, action] delta_q # 可选限制 Q 值范围防止数值爆炸 self.Q[state, action] np.clip(self.Q[state, action], -10, 10) def save_to_disk(self, path): np.save(path, self.Q) def load_from_disk(self, path): self.Q np.load(path) # 使用 q_manager HotSwappableQ(Q_table) # 收到运维指令提升状态5的行动2价值 q_manager.update_q(5, 2, 0.05)我带过的某跨平台系统项目就是靠这套HotSwappableQ在不停机情况下用一周时间把 AGV 十字路口让行成功率从 82% 拉到 99.3%——没有重训只有 17 次人工微调。Q Learning 的魅力正在于此它不追求完美拟合而追求可理解、可干预、可演进的决策逻辑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

元迁移学习:冻结主干网络只学特征缩放偏移,解决小样本学习过拟合

元迁移学习:冻结主干网络只学特征缩放偏移,解决小样本学习过拟合

论文阅读笔记《Meta-Transfer Learning for Few-Shot Learning》 这篇《Meta-Transfer Learning for Few-Shot Learning》是我反复读了三遍才敢说自己基本看懂的一篇工作。标题里叠了两个大词:Meta-Learning(元学习)和Transfer Learning&…

2026/10/14 12:29:35 阅读更多 →
【JVS更新日志】JVS-AI套件、JVS-Tellix 、JVS-Narrivo、JVS-Dam、JVS-PPT编辑器插件10.14更新说明!

【JVS更新日志】JVS-AI套件、JVS-Tellix 、JVS-Narrivo、JVS-Dam、JVS-PPT编辑器插件10.14更新说明!

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

2026/10/14 12:28:35 阅读更多 →
创意工具工作流可交付性:从导出到自动交付的技术实践

创意工具工作流可交付性:从导出到自动交付的技术实践

1. 项目概述:当“能画出来”不再够用,工作流交付成了创意工具的生死线最近在给几个做品牌视觉、短视频脚本和交互原型的团队做工具链咨询时,反复听到一句话:“这个软件功能很炫,但做完一个方案,我得花两小时…

2026/10/14 12:28:35 阅读更多 →

最新新闻

2026年科研绘图AI红黑榜:按需求对号入座

2026年科研绘图AI红黑榜:按需求对号入座

先说结论:今年测了6款科研绘图AI工具,覆盖综合写作、文科降重、理工图表三个赛道,红榜3款各有专攻,黑榜3款各有硬伤。这篇文章不吹不黑,按你的实际需求对号入座就行。 红榜黑榜怎么分的 评选标准三条:功能…

2026/10/14 22:08:28 阅读更多 →
Python字典安全取值与返回设计:告别KeyError的工程实践

Python字典安全取值与返回设计:告别KeyError的工程实践

做数据处理脚本的时候,十个报错里至少有五个是 KeyError。很多人刚开始接触 Python,觉得字典无非就是d[key]取个值、d.items()遍历一下,没啥好学的。结果一写真实业务代码就发现,今天这个键没传、明天那个值是 None、后天嵌套结构…

2026/10/14 22:08:28 阅读更多 →
Oracle 11g RAC 异机恢复实战(漫画版)

Oracle 11g RAC 异机恢复实战(漫画版)

前言 节后刚到公司,业务那边就来了一个需求:有一套测试库的数据太老了,需要从生产库恢复一份数据过去。 生产库和测试库都是 Oracle 11g RAC,准备使用 RMAN DUPLICATE 完成恢复。原本以为很简单,就是清理旧库、恢复数据…

2026/10/14 22:08:28 阅读更多 →
边缘计算与云端协同实战:降低延迟、优化带宽的架构设计与运维经验

边缘计算与云端协同实战:降低延迟、优化带宽的架构设计与运维经验

搞边缘计算的人,这两年应该都有一个明显的体感:单纯把数据一股脑推到云端的做法,越来越扛不住业务需求了。数据量越来越大、实时性要求越来越高、带宽成本逐年上涨,你要是还按老思路去堆节点、扩带宽,运维成本和体验只…

2026/10/14 22:08:28 阅读更多 →
Python绘制3D球体网格散点图:球面数据点生成与可视化实战

Python绘制3D球体网格散点图:球面数据点生成与可视化实战

在开始之前,先说句实话:网上关于“Python 绘制 3D 球体”的教程,十个里有九个是在教你画一个实心球,再不然就是画一个线框球。但你真到了做项目的时候,往往会发现这些花架子根本不顶用。我这次要聊的,是“绘…

2026/10/14 22:08:28 阅读更多 →
基于Django与机器学习的电商评论情感分析系统设计

基于Django与机器学习的电商评论情感分析系统设计

1. 项目概述与核心价值电商平台每天产生海量用户评论数据,这些非结构化文本中蕴含着消费者对商品、服务的真实评价。传统人工分析方式效率低下且主观性强,而基于Django框架结合机器学习的情感分析系统,能够自动化完成评论数据采集、清洗、建模…

2026/10/14 22:07:27 阅读更多 →

日新闻

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 阅读更多 →