引言

在深度学习领域,卷积神经网络(Convolutional Neural Network,CNN)是专为图像、视频、网格类数据设计的经典算法,也是计算机视觉技术的基石。

从手机人脸识别、相册智能分类,到自动驾驶路况识别、医学影像病灶检测,都离不开它的支撑。

CNN 的核心设计思路,是模拟人类大脑视觉皮层的工作原理:我们观察物体时,会先捕捉边缘、线条等基础特征,再逐步组合成完整的物体轮廓;而 CNN 通过分层特征提取,自动从数据中学习有效信息,无需人工手动设计特征,完美解决了传统算法处理图像时效率低、准确率差的问题。


CNN 核心结构极简解析

1. 卷积层

算法核心,通过卷积核(过滤器)在图像上滑动,提取边缘、纹理、色彩等基础视觉特征,利用权值共享局部连接大幅减少模型参数,提升计算效率。

2. 池化层

对特征图进行降维采样,在保留关键特征的同时,压缩数据量、降低计算复杂度,还能增强模型的鲁棒性

3. 全连接层

汇总前面提取的所有特征,将高维特征映射到样本标签空间,最终完成分类、识别等任务输出。


CNN 核心优势

  • 自动提取特征:省去繁琐的人工特征工程,让模型自己学习有效信息。
  • 处理效果好:对图像、语音等结构化数据处理效果极佳,泛化能力强。
  • 效率高:参数量少、训练效率高,适配深度学习多层架构。

典型应用场景

领域 应用
图像处理 图像分类、目标检测与分割
人脸识别 手机解锁、支付验证、图像风格迁移
医疗 医学影像分析、病灶检测
自动驾驶 视觉感知、路况识别、行人检测
文字与视频 OCR 文字识别、视频内容理解

总结

卷积神经网络凭借独特的结构优势,成为计算机视觉领域最主流的算法,也是深度学习入门必学模型。

即便没有深厚的数学基础,也能快速理解其核心逻辑,轻松上手相关实践任务。

引言

神经网络是深度学习的核心,本质是模拟人脑神经元连接,通过多层结构自动学习数据特征,完成分类、回归、生成、决策等任务。本文按基础结构 + 经典网络 + 专用领域模型做清晰汇总,兼顾原理和应用,适合快速建立知识体系。


一、基础神经网络(入门必学)

1. 感知机(Perceptron)

  • 最早的神经元模型,单层结构
  • 只能处理线性可分问题
  • 是所有神经网络的最小单元

2. 前馈神经网络(FFNN / MLP)

  • 全称:多层感知机
  • 结构:输入层 → 隐藏层 → 输出层,数据单向传播
  • 适用:表格数据、简单分类/回归
  • 局限:对图像、序列数据效率极低

3. 反向传播(BP 神经网络)

  • 带误差反向传播的 MLP
  • 通过梯度下降更新权重,是深度学习训练的基础

二、图像处理专用神经网络

1. 卷积神经网络(CNN)

  • 核心层:卷积层 + 池化层 + 全连接层
  • 优势:局部连接、权值共享,大幅减少参数量
  • 擅长:图像分类、检测、分割、人脸识别

经典模型:

模型 特点
LeNet-5 最早商用 CNN
AlexNet 深度学习爆发标志
VGG 结构简洁,深层特征提取
ResNet 残差连接,解决深层网络退化
GoogLeNet / Inception 多尺度卷积并行

2. 目标检测类衍生网络

  • 两阶段(高精度):R-CNN → Fast R-CNN → Faster R-CNN
  • 一阶段(高速度):YOLO、SSD

三、序列/文本数据专用网络

1. 循环神经网络(RNN)

  • 带记忆,可处理变长序列
  • 问题:长序列会出现梯度消失/爆炸

2. LSTM(长短期记忆网络)

  • RNN 的改进版,加入门控机制(输入门/遗忘门/输出门)
  • 解决长序列训练问题
  • 适用:语音识别、文本生成、时间序列预测

3. GRU

  • LSTM 的简化版,参数更少、速度更快
  • 效果接近 LSTM,工业界常用

四、注意力机制与 Transformer 家族

1. Attention(注意力机制)

  • 让模型自动关注重要信息,忽略无关内容
  • 彻底解决长序列依赖问题

2. Transformer

  • 完全基于自注意力机制,不依赖 RNN/CNN
  • 结构:Encoder + Decoder
  • 奠定现代大模型基础

3. 基于 Transformer 的主流模型

模型 结构 擅长任务
BERT Encoder 为主 理解类(分类、抽取、问答)
GPT Decoder 为主 生成类(写作、对话、代码)
T5 / LLaMA Encoder+Decoder 多任务通用

五、生成式神经网络

1. 自编码器(AE)

  • 结构:Encoder 压缩 + Decoder 还原
  • 用途:降维、去噪、特征学习

2. VAE(变分自编码器)

  • 概率版自编码器,可生成新样本

3. GAN(生成对抗网络)

  • 生成器:造假数据
  • 判别器:分辨真假
  • 用途:图像生成、风格迁移、超分辨率

六、强化学习类神经网络

1. DQN(深度 Q 网络)

  • CNN + Q-Learning
  • 代表:AlphaGo 前身、游戏 AI

2. Policy Gradient / Actor-Critic

  • 适合连续动作、机器人控制
  • 广泛用于自动驾驶、智能体决策

七、核心能力总结

网络类型 擅长数据类型 典型应用
MLP 表格数据 分类、回归、预测
CNN 图像、视频 识别、检测、分割
RNN/LSTM/GRU 文本、时序数据 翻译、语音、预测
Transformer 文本/图像/多模态 大模型、对话、翻译
GAN/VAE 任意数据 图像生成、数据增强

八、学习路线建议

  1. 先学 MLP/BP 理解基本训练逻辑
  2. 再学 CNN 做图像
  3. 再学 LSTM/GRU 做序列
  4. 最后主攻 Transformer(现代 AI 主流)

引言

提到深度学习,绕不开卷积神经网络(CNN)——它是专门为处理图像、视频等网格状数据而生的算法,也是如今人脸识别、图像识别、自动驾驶等技术的核心。

不用复杂推导,新手也能快速 get 它的核心逻辑。


一、什么是 CNN?

简单说,CNN 是一种模仿人类视觉系统的深度学习模型。

我们看一张图片时,会先注意到整体轮廓,再聚焦细节(比如五官、纹理)。CNN 就像”智能眼睛”,通过分层处理,自动提取图像的特征,从简单的线条、颜色,到复杂的物体形状、场景,最终实现图像的识别和分类。

和传统算法相比,CNN 最大的优势是**”自动提取特征”**——不用人工手动设计特征,它能自己从数据中学习,大大降低了人工成本,也提升了识别的准确率。


二、CNN 核心结构(极简版)

CNN 的结构不复杂,核心就 3 个关键层,层层递进处理图像:

1. 卷积层(核心)

相当于**”特征探测器”**,用一个”小窗口”(卷积核)在图像上滑动,捕捉图像的线条、边缘、颜色等简单特征,是 CNN 能识别图像的基础。

2. 池化层

相当于**”精简器”**,在不丢失关键特征的前提下,缩小图像尺寸,减少计算量,让模型运行更快。

3. 全连接层

相当于**”决策者”**,把前面提取到的所有特征汇总,进行分类判断(比如判断图像是猫、狗,还是汽车)。


三、常见应用场景

CNN 的应用早已渗透日常,我们每天都在接触:

场景 说明
人脸识别 手机解锁、支付验证,都是 CNN 在快速识别你的面部特征。
图像分类 相册自动归类(人物、风景、动物)、电商平台的商品识别。
医学影像 识别病灶、辅助诊断。
自动驾驶 识别路况、行人。
美颜相机 识别面部轮廓,自动美颜。

四、新手小总结

CNN 的核心逻辑很简单:分层提取图像特征,从简单到复杂,最终实现识别和分类。

它不用复杂的数学基础,核心优势是擅长处理图像类数据,也是深度学习新手入门的首选算法之一。

如果想进一步尝试,新手可以从简单的图像分类案例(比如识别猫狗)入手,直观感受 CNN 的强大!

引言

在无监督机器学习领域,K-均值聚类 (K-Means) 绝对是最经典、最易上手的算法之一。

它无需标注数据,就能自动从杂乱无章的数据中找到隐藏的分组规律,像“智能分类器”一样,把相似的数据归为一类。

本文将用最通俗的语言带你快速掌握其核心逻辑。


一、什么是 K-均值聚类?

简单来说,核心目标是将一组无标签数据,划分为 K 个互不重叠的“簇”(即小组)。

  • K:预先指定的簇数量。
  • 均值:每个簇的中心(质心),是该簇内所有数据的平均值向量。

🍎 生活实例
想象有一堆混合的水果。K-均值就像一个自动分类器,它会根据大小、颜色、形状等特征,把苹果归为一类、橙子归为一类、香蕉归为一类。这里的 K 就等于 3。


二、核心步骤:4 步完成聚类

K-均值聚类的逻辑非常直观,核心是“迭代优化”。

  1. 预设 K 值:确定要把数据分成多少个簇(如 K=2, K=3)。
  2. 初始化质心:随机从数据集中选择 K 个数据点,作为初始质心。
  3. 分配与更新
    • 计算每个点到所有质心的距离(常用欧氏距离)。
    • 将点归到距离最近的簇。
    • 重新计算每个簇的质心(即簇内均值)。
  4. 迭代收敛:重复“分配 - 更新”,直到质心不再变化或达到最大迭代次数。

三、常见应用场景

场景 说明
电商用户分群 根据购买频率、消费金额划分“高频消费群”、“价格敏感群”,用于精准营销。
图像分割 将像素按颜色、亮度聚类,区分前景和背景,实现自动分割。
数据预处理 对高维数据聚类,简化结构,为后续模型降低计算成本。

四、新手避坑指南

K-均值虽简单,但有两个关键点:

  1. K 值选择:常用“手肘法”(观察簇内误差变化拐点)辅助确定。
  2. 初始质心敏感:随机选择可能导致局部最优,建议多次运行取最优结果。

总结

K-均值聚类是无监督学习的入门必备算法。无需复杂知识即可实现数据分组,无论是新手练习还是实际业务中的简单聚类,它都是首选工具!

引言

最近开源圈爆火的 Hermes Agent,凭借”自我进化”的闭环学习能力、多平台兼容特性,以及 52800+ GitHub Stars 的热度,成为很多开发者和AI爱好者的首选智能代理工具。

它不同于传统Agent框架,无需复杂配置就能部署,还能在使用中自动提炼技能、积累记忆,真正实现”越用越懂你”。

今天就给大家带来一篇保姆级博文,从安装到进阶使用,全程无坑,新手也能轻松拿捏~

Hermes Agent 简介
由 Nous Research 开发的开源自主AI Agent,基于 MIT 协议完全开源。核心优势:

  • 闭环学习:自动沉淀技能
  • 长期记忆:跨会话不”失忆”
  • 多模型自由切换:支持 OpenAI, Claude, Kimi, MiniMax 等

一、安装前准备:确认环境,避免踩坑

在安装前,先确认你的设备满足以下基础要求,避免后续出现兼容性问题:

  • 操作系统:支持 Linux、macOS、Windows WSL2、Android Termux(不支持 Windows 原生系统);
  • Python版本:必须是 3.10及以上(低于3.10会出现语法错误);
  • 硬件要求:基础使用需 4GB+ 内存;
  • 网络要求:需能访问 GitHub;国内用户可选择 Kimi、MiniMax 等模型。

检查 Python 版本

打开终端输入:

1
2
python3 --version
# 预期输出:Python 3.11.x

若版本低于 3.10,可通过 pyenv 升级:

1
2
3
curl https://pyenv.run | bash
pyenv install 3.11
pyenv global 3.11

二、两种安装方式:一键安装 + 手动安装

方式1:一键安装(推荐,Linux/macOS/WSL2/Termux通用)

官方提供了一键安装脚本,会自动完成 Python 依赖安装、路径配置、初始化向导触发:

  1. 执行安装命令

    1
    curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
  2. 加载环境变量

    1
    source ~/.bashrc # 或 source ~/.zshrc
  3. 验证安装

    1
    hermes --version

方式2:手动安装(网络受限环境)

若一键安装脚本无法访问,可通过 Git 克隆源码手动安装:

1
2
3
git clone https://github.com/NousResearch/hermes-agent.git
cd hermes-agent
pip install -r requirements.txt

三、首次配置:3步完成初始化

安装成功后,首次启动会进入交互式配置向导:

  1. 选择 LLM 模型:推荐国内用户使用 KimiMiniMax,无需额外网络配置;
  2. 配置工具模块:按需开启文件操作、Shell 执行、网络请求等工具;
  3. 配置消息网关:接入 Telegram、Discord、微信等平台。

四、实用使用技巧:从基础到进阶

1. 技能管理:让 Agent 自动”成长”

这是 Hermes Agent 最核心的技巧——闭环学习

  • 首次执行复杂任务后,Agent 会自动提炼最优路径生成技能文件。
  • 查看技能hermes skills list
  • 调用技能:下次直接输入指令调用,效率翻倍。

2. 多模型切换:一键切换

Hermes Agent 不绑定任何模型,支持 200+ 模型自由切换:

1
hermes model set kimi
  • 简单任务(如文本总结):使用轻量模型(GPT-4o-mini, Kimi 轻量版),节省成本。
  • 复杂任务(如代码开发):使用强力模型(GPT-4o, Claude 3.5),提升准确率。

3. 长期记忆:跨会话不”失忆”

内置 SOUL 记忆系统,能跨会话积累用户偏好。比如周五处理的任务,周一启动后直接说”接着处理”,Agent 会自动召回进度。

4. 定时任务 + 子代理:无人值守

  • 自然语言调度:直接说”每天晚上11点自动备份”,Agent 自动转化为 Cron 脚本。
  • 子代理委派:自动拆解任务,克隆子代理并行执行(最多 8 节点并发)。

五、常见问题排查

问题 解决方法
hermes: command not found 执行 source ~/.zshrc 或重启终端。
SyntaxError: f-string expression Python 版本过低,请升级到 3.10+。
AuthenticationError API Key 错误,重新配置 hermes model set
Docker 报错 启动 Docker 服务并检查权限。

总结

Hermes Agent 的最大优势是 **”简单部署 + 自我进化”**。

  • 新手建议:先从基础交互和简单任务开始,熟悉后再尝试技能管理。
  • 高效建议:多让 Agent 处理重复任务,鼓励它生成技能文件。

目前 Hermes Agent 已更新到 v0.10.0 版本,后续还会持续迭代。如果你在安装或使用过程中遇到其他问题,欢迎在评论区留言探讨!

Hermes Agent 架构解析:从一次性工具到自进化系统

先给出结论:Hermes 强,不是因为模型强,而是因为它把“AI 从一次性工具,变成了可积累的系统”。

以下从“架构层级”拆解其核心设计逻辑。

一、解决行业级痛点:AI“失忆”问题

传统 AI 交互面临的最大问题是“无状态”:每次对话重新开始,上下文依赖拼接。Hermes 通过持久记忆(Structured Memory),结构化地存储项目上下文与个人习惯。

二、核心差异化:自进化闭环

Hermes 构建了闭环:任务 -> 执行 -> 评估 -> 抽象 -> 生成 Skill -> 下次复用。系统将“过程”转化为“固有能力”,下次直接调用。

三、Agent Operating System (Agent OS)

Hermes 是一个 Agent Runtime,架构分三层:

  • Agent 执行层:推理、工具调用。
  • 平台层:CLI / Gateway、调度。
  • 持久层(核心):Memory、Skills、Profile。

四、模型无关 (Model Agnostic)

支持 OpenAI, Claude, GLM, Ollama 等 200+ 模型,将“模型”变为可替换组件。

五、从“认知系统”升级为“行动系统”

普通 AI:你问 -> 它答。
Hermes:你说目标 -> 它执行(写代码、调终端、操作文件)。

六、能力公式与复利效应

能力 = 模型 × (记忆 + 技能 + 工具 + 时间)

随着使用时间增长,系统呈现复利效应。

七、针对技术团队的落地价值

  1. 流程资产化:将流程变成可复用的 Skill。
  2. 系统拥有者:从工具使用者变为 Agent 拥有者。
  3. 落地架构:构建”AI 提案自动评审系统”。

八、局限性与冷思考

  • 初期较弱(缺乏积累)。
  • 依赖高质量流程引导。
  • LLM 本质(幻觉风险)。

总结:Hermes Agent 的本质,是将 AI 从“函数调用”升级成“长期运行的状态系统”。

一文读懂:AI 界的“判断大师”——逻辑回归算法

摘要:逻辑回归(Logistic Regression)是机器学习中最经典的分类算法。本文从线性回归的局限性出发,深入解析 Sigmoid 函数的作用机制、对数损失函数的原理及其在工业界的广泛应用。


1. 为什么不能直接用线性回归做分类?

线性回归擅长预测连续数值,但在面对“非黑即白”的分类问题(如垃圾邮件检测、肿瘤良恶性判断)时,它会遇到两个致命问题:

  1. 数值越界:线性回归的输出范围是 $(-\infty, \infty)$,而分类问题的概率必须限制在 $[0, 1]$ 之间。
  2. 对异常值敏感:极端值会严重拉偏拟合直线,导致分类边界失效。

为了解决这个问题,我们需要一种方法,将线性回归的无限输出“压缩”到 0 和 1 之间。

💡 核心概念:
逻辑回归:一种广义的线性模型,虽然名字带有“回归”,但主要用于解决二分类问题。

2. 核心魔法:Sigmoid 函数

逻辑回归的核心在于引入了 Sigmoid 函数(也称 S 型函数)。

$$y = \frac{1}{1 + e^{-z}}$$

这个函数的形状像一个平滑的”S”。它的特性是:无论输入的 $z$ 是多大的正数或负数,输出结果永远被严格限制在 $(0, 1)$ 区间内。

3. 算法的底层逻辑

逻辑回归的运作可以看作“线性回归 + Sigmoid 外衣”:

第一步:线性打分

计算特征的线性组合:$z = w_1x_1 + … + w_nx_n + b$。

第二步:概率转化

将 $z$ 输入 Sigmoid 函数,得到概率 $P$。例如 $P=0.85$ 表示模型认为该样本属于正类(如恶性肿瘤)的概率是 85%。

第三步:决策

设定阈值(通常为 0.5)。若 $P \ge 0.5$ 则判定为 1,否则为 0。


4. 模型训练:对数损失函数

在逻辑回归中,均方误差(MSE)不再适用,因为加上 Sigmoid 函数后,损失曲面会变得非凸,难以优化。因此,逻辑回归采用对数损失函数(Log Loss / Cross-Entropy Loss)

其核心逻辑是“惩罚盲目自信的错误”:

  • 如果真实标签是 1,而模型预测概率是 0.01(极其自信地认为是 0),损失函数会给出极大的惩罚值。
  • 模型通过梯度下降法不断调整参数,以最小化这种惩罚。

5. 优缺点分析

优势

  • 输出概率:不仅给出分类结果,还提供置信度。这在医疗诊断、金融风控等领域至关重要。
  • 计算高效:训练和推理速度极快,占用资源少,常作为工业界(如推荐系统粗排)的基线模型(Baseline)。
  • 可解释性强:权重 $w$ 直接反映了特征的重要性。

局限性

  • 线性边界:逻辑回归本质上只能学习线性决策边界。面对非线性可分数据(如异或问题),单纯使用逻辑回归效果不佳,需要配合复杂的特征工程。

6. 总结

从预测数值的线性回归,到预测概率的逻辑回归,这是理解机器学习决策过程的关键一步。尽管深度学习模型日益强大,但逻辑回归凭借其出色的效率与可解释性,依然是现代互联网架构中不可或缺的基石。


如果你觉得这篇文章有帮助,欢迎分享给需要的朋友。

一文读懂线性回归算法

摘要:线性回归(Linear Regression)是机器学习领域最基础、最经典的算法。本文将从直观案例出发,系统梳理其数学原理、优化过程以及工程实践中的优缺点。


1. 什么是线性回归?

线性回归是监督学习中最基础的算法之一。它的核心思想是:假设输入特征 $x$ 与输出目标 $y$ 之间存在线性关系,通过历史数据拟合出一条最优的直线(或超平面),从而对未知数据进行预测。

一个直观的例子是房价预测:

  • 横轴表示房屋面积,纵轴表示成交价格
  • 历史数据点大致排列成一条向右上倾斜的直线
  • 线性回归的目标就是找到这条“最优拟合线”
💡 核心概念:
线性(Linear):假设特征与目标之间存在线性关系(特征增加,目标按比例变化)。
回归(Regression):寻找数据内在规律的过程,输出连续值。

2. 数学模型

线性回归的数学本质是一元一次方程的扩展。

2.1 一元线性回归

$$y = wx + b$$

其中:

  • $y$:目标变量(标签),需要预测的结果(如房价)
  • $x$:特征(输入),已知信息(如房屋面积)
  • $w$:权重(Weight),直线的斜率,代表特征的重要程度
  • $b$:偏置(Bias),直线的截距,表示基础值

2.2 多元线性回归

当影响目标的因素不止一个时(如面积、房间数、楼层、学区等),公式扩展为:

$$y = w_1x_1 + w_2x_2 + … + w_nx_n + b$$

或用向量形式表示:

$$y = \mathbf{w}^T\mathbf{x} + b$$


3. 模型训练:机器如何”学习”?

训练线性回归模型的核心是寻找最优的 $w$ 和 $b$,使得预测值与真实值的误差最小。

3.1 损失函数:衡量预测误差

最常用的损失函数是均方误差(Mean Squared Error, MSE)

$$MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2$$

其中 $y_i$ 是真实值,$\hat{y}_i$ 是预测值。MSE 越小,模型拟合效果越好。

3.2 梯度下降法:参数优化

梯度下降(Gradient Descent)是最常用的优化算法:

  1. 随机初始化 $w$ 和 $b$
  2. 计算当前参数下的损失函数梯度
  3. 沿梯度反方向更新参数,步长由学习率 $\alpha$ 控制
  4. 重复上述过程,直到损失收敛

$$w := w - \alpha \frac{\partial MSE}{\partial w}$$
$$b := b - \alpha \frac{\partial MSE}{\partial b}$$


4. 优缺点分析

优势

  • 可解释性强:相比深度学习的“黑盒”模型,线性回归的公式一目了然,可以清晰地解释每个特征对结果的影响程度。
  • 计算效率高:不需要大量算力,训练和推理速度都很快,适合轻量级任务和初步数据探索。
  • 实现简单:几乎所有机器学习库都内置了线性回归实现。

局限性

  • 只能建模线性关系:如果数据的真实关系是非线性的(如年龄与身高的关系),线性回归的拟合效果会很差。
  • 对异常值敏感:极端值会显著影响拟合直线的方向,通常需要进行数据清洗或使用鲁棒回归。
  • 多重共线性问题:当特征之间存在强相关性时,权重估计可能不稳定。

5. 总结

在如今动辄千亿参数的 Transformer 大模型时代,线性回归显得朴素而经典。但正是从 $y = wx + b$ 这个简单的等式开始,人类赋予了计算机从历史数据中总结规律、并预测未来的能力。理解线性回归,是通往整个机器学习领域的必经之路。


如果你觉得这篇文章有帮助,欢迎分享给需要的朋友。

匈牙利算法(Hungarian Algorithm)是组合优化领域最经典的算法之一,用于解决两类核心问题:二分图最大匹配任务分配问题。它由匈牙利数学家 Dénes Kőnig 和 Jenő Egerváry 的理论奠基,后由 Harold Kuhn 于 1955 年正式提出。

什么是二分图?

在深入算法之前,我们需要先理解几个基本概念。

二分图(Bipartite Graph)是一种特殊的图结构,它的顶点可以被划分为两个互不相交的集合 U 和 V,使得图中的每一条边都连接 U 中的一个顶点和 V 中的一个顶点。

简单来说:二分图中的边只会”跨界”连接,不会在同一个集合内部连接。

匹配(Matching)是指图中一组没有公共顶点的边。换句话说,每个顶点最多只被一条边选中。

最大匹配就是包含边数最多的匹配。

匈牙利算法(二分图匹配版)

这是最常见的”匈牙利算法”,用于求解二分图的最大匹配。

核心思想:增广路

匈牙利算法的核心定理是 Berge 增广路定理

一个匹配是最大匹配,当且仅当图中不存在增广路。

增广路(Augmenting Path)的定义:

  • 路径的起点和终点都是未匹配的顶点
  • 路径上的边交替出现”未匹配边”和”已匹配边”

增广路有一个神奇的性质:如果我们将增广路上所有边的状态取反(匹配变未匹配,未匹配变匹配),匹配的边数会增加 1。

算法步骤

1
2
3
4
5
6
1. 初始化匹配为空
2. 对于每个未匹配的左部顶点 u:
a. 从 u 开始搜索增广路(DFS/BFS)
b. 如果找到增广路,翻转路径上的边,匹配数 +1
c. 否则,u 无法匹配
3. 重复直到所有顶点都尝试过

Python 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def hungarian_bipartite(graph, n_left, n_right):
"""
graph: 邻接表,graph[u] = [v1, v2, ...] 表示左部顶点 u 可以匹配右部的 v1, v2...
n_left: 左部顶点数
n_right: 右部顶点数
返回: 最大匹配数
"""
match_right = [-1] * n_right # 右部顶点的匹配对象
visited = [False] * n_right

def dfs(u):
for v in graph[u]:
if not visited[v]:
visited[v] = True
# 如果 v 未匹配,或者可以为 match_right[v] 找到新的匹配
if match_right[v] == -1 or dfs(match_right[v]):
match_right[v] = u
return True
return False

count = 0
for u in range(n_left):
visited = [False] * n_right
if dfs(u):
count += 1
return count

# 示例:4 个男生,4 个女生,边的关系如下
graph = {
0: [0, 1], # 男生 0 可以和女生 0, 1 匹配
1: [1, 2], # 男生 1 可以和女生 1, 2 匹配
2: [2, 3], # 男生 2 可以和女生 2, 3 匹配
3: [3], # 男生 3 可以和女生 3 匹配
}
print(hungarian_bipartite(graph, 4, 4)) # 输出: 4(完美匹配)

匈牙利算法(任务分配版)

另一种”匈牙利算法”用于解决带权二分图的最小/最大权匹配问题,也称为 Kuhn-Munkres 算法分配问题算法

问题描述

有 n 个工人和 n 项任务,每个工人完成每项任务的成本不同。如何分配才能使总成本最小?

这就是经典的任务分配问题,可以用一个 n×n 的代价矩阵表示。

算法步骤

1
2
3
4
5
1. 每行减去该行的最小值
2. 每列减去该列的最小值
3. 用最少的线覆盖所有零
- 如果线数 = n,找到最优分配,算法结束
- 否则,调整矩阵,返回步骤 3

时间复杂度

任务分配版的匈牙利算法时间复杂度为 **O(n³)**,在多项式时间内解决了这个组合优化问题。

应用场景

场景 算法版本 说明
红娘匹配 二分图匹配 男女配对,使配对数最大
任务分配 任务分配版 工人-任务最优分配
航班-登机口分配 任务分配版 最小化总等待时间
目标跟踪 任务分配版 多目标与多检测的最优关联
课程安排 二分图匹配 教师-教室-时间匹配

复杂度分析

  • 二分图匹配版:O(V×E),其中 V 是顶点数,E 是边数
  • 任务分配版:O(n³),其中 n 是矩阵维度

总结

匈牙利算法虽然有两个不同的版本,但它们都源于同一个数学理论:二分图的完美匹配理论。理解增广路的概念是掌握这个算法的关键。

无论是简单的二分图匹配,还是复杂的任务分配问题,匈牙利算法都提供了一个优雅且高效的解决方案。


延伸阅读:

  • 《算法导论》第 26 章:最大流
  • Harold W. Kuhn, “The Hungarian Method for the Assignment Problem” (1955)
  • 网络流算法(Dinic、Edmonds-Karp)

go语言内存分析

最新看了一下go语言,感觉语言设计的比Java要好一些,底层实现了对并发的支持。
他的内存结构和内存回收跟Java的模型也有很大的不同,抽空写一下go语言的内存分析,后续也会写一篇G1和GMS用来坐对比。

nginx使用try_files配置vue

组内的小伙伴最近独立开发的一个项目,前端使用VUE,路由模式使用history。
部署时发现无法访问,自己研究半天后,无法解决,向我寻求帮助,发现是他的nginx配置错误

其实 vue router 的文档里有部署方式,https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B
服务器配置示例:
location / {
try_files $uri $uri/ /index.html;
}

随手写篇文章记录一下,nginx的location下的配置中
root,alias,try_files 区别,未来有时间可以写一篇nginx的深入文章,包含负载均衡、双机热备、缓存等高级功能。

root:
location /test/ {
root /var/www/image
}
若按照上述配置的话,访问/test目录里面的文件时, nginx会自动去/var/www/image/test去找。

alias:
location /test/ {
alias /var/www/image/
}
若按照上述配置的话,访问/img目录里面的文件时, nginx会自动去/var/www/image目录找文件, 也就是不会把后缀带上,常用来配置静态文件。

try_files:
location /test/ {
try_files $uri $uri/ /index.html;
}
try_files 会到硬盘里尝试找这个文件, 找不到,就会 fall back 到 try_files 的最后一个选项index.html,将请求转发返回index.html上,然后html里的vue router再去跟去后缀路由对应的页面。

至此,完成history的转发。

升级成了WIN11

年前公司给换了笔记本电脑,之前在公司一直用的是MACP15款。个人是更偏向苹果系统的,但是无奈老机子太卡了。
申请换电脑时,只能申请win笔记本了。拿到手后是win10,自己下载升级成了win11。

刚用11时,感觉很惊喜,跟MAC用起来很像,又能解决MAC的一些老软件兼容性问题,虽然小BUG比较多。

写一个系统的问题和小技巧吧,会持续更新这个文章

1,在执行shell命令时,报在此系统上禁止运行脚本。

解决方案,管理员身份 打开终端,执行 set-ExecutionPolicy RemoteSigned 解决

2,可以直接下载Linux,在应用市场搜索ubuntu。

3,如果下载视频是ev4加密视频的话,建议购买使用正版命令打开。(临时需要可以找我破解,python解密)

4,自带粘贴板记录功能 win + v 打开

5,自带多功能截图 win + shift + s

6,带多桌面功能,触控板可以设置的跟MAC一样。

0%