浅拷贝和深拷贝

1. 赋值(=)

  • 只是创建新名字,指向同一个对象

  • 修改任意一方,另一方都会跟着变

a = [1, 2, 3]
b = a      # 赋值
b[0] = 99

print(a)  # [99, 2, 3]
print(b)  # [99, 2, 3]
print(a is b)  # True

2. 浅拷贝(copy.copy()

  • 新建外层容器,但里面的子对象仍然共享引用

  • 修改子对象内部 → 会影响原对象

  • 替换整个子对象 → 脱钩,不影响原对象

示例 1:修改子元素(会影响)

import copy

a = [[1, 2, 3], [3, 4, 5]]
b = copy.copy(a)
b[0][0] = 99

print(a)  # [[99, 2, 3], [3, 4, 5]]
print(b)  # [[99, 2, 3], [3, 4, 5]]

示例 1:替换整个子列表(不会影响)

a = [[1, 2, 3], [3, 4, 5]]
b = copy.copy(a)
b[0] = [99, 98, 97]

print(a)  # [[1, 2, 3], [3, 4, 5]]
print(b)  # [[99, 98, 97], [3, 4, 5]]

3. 深拷贝(copy.deepcopy()

  • 递归地复制所有层次对象

  • 完全独立,互不影响

import copy
a = [[1, 2, 3], [3, 4, 5]]
b = copy.deepcopy(a)
b[0][0] = 99

print(a)  # [[1, 2, 3], [3, 4, 5]]
print(b)  # [[99, 2, 3], [3, 4, 5]]

浅拷贝和深拷贝

快速排序

import random

def partition(nums, start, end):
    """填坑法分区:返回枢轴落点索引"""
    pivot = nums[start]          # 也可随机:p = random.randint(start, end); nums[start], nums[p] = nums[p], nums[start]
    left, right = start, end
    while left < right:
        # 右侧先找 < pivot 的
        while left < right and nums[right] >= pivot:
            right -= 1
        nums[left] = nums[right]     # 右边的小填到左坑

        # 左侧再找 > pivot 的
        while left < right and nums[left] <= pivot:
            left += 1
        nums[right] = nums[left]     # 左边的大填到右坑

    nums[left] = pivot               # 枢轴就位
    return left

def quicksort(nums, l=0, r=None):
    """原地快速排序(递归)"""
    if r is None:
        r = len(nums) - 1
    if l >= r:
        return
    mid = partition(nums, l, r)
    quicksort(nums, l, mid - 1)
    quicksort(nums, mid + 1, r)
def quicksort(nums, start, end):
    """原地快速排序(递归)"""
    if start >= end:
        return

    pivot = nums[start]
    left, right = start, end

    # 分区:右找小填左坑,左找大填右坑
    while left < right:
        while left < right and nums[right] >= pivot:
            right -= 1
        if left < right:
            nums[left] = nums[right]
        while left < right and nums[left] <= pivot:
            left += 1
        if left < right:
            nums[right] = nums[left]

    nums[left] = pivot  # 枢轴就位
    quicksort(nums, start, left - 1)
    quicksort(nums, left + 1, end)

这个方法会在leetcode217.存在重复元素超时
改进快排

import random
from typing import List

def quicksort(a: List[int], l: int, r: int) -> None:
    """改进版原地快速排序(三路划分 + 随机枢轴 + 尾递归优化)"""
    while l < r:
        # 1) 随机选择枢轴,交换到开头
        p = random.randint(l, r)
        a[l], a[p] = a[p], a[l]
        pivot = a[l]

        # 2) 三路划分:[l..lt-1] < pivot, [lt..gt] == pivot, [gt+1..r] > pivot
        lt, i, gt = l, l + 1, r
        while i <= gt:
            if a[i] < pivot:
                a[lt], a[i] = a[i], a[lt]
                lt += 1
                i += 1
            elif a[i] > pivot:
                a[i], a[gt] = a[gt], a[i]
                gt -= 1
            else:
                i += 1

        # 3) 递归较小的一侧,循环处理较大的一侧(尾递归优化)
        left_len = lt - 1 - l
        right_len = r - (gt + 1)
        if left_len < right_len:
            if l < lt - 1:
                quicksort(a, l, lt - 1)
            l = gt + 1
        else:
            if gt + 1 < r:
                quicksort(a, gt + 1, r)
            r = lt - 1

```  
# 冒泡排序

def bubble_sort(nums):
“””原地冒泡排序;稳定。平均/最坏 O(n^2),最好(近乎有序)可提前终止。”””
n = len(nums)
for i in range(n - 1):
swapped = False
# 相邻比较与交换,内层区间逐步缩短
for j in range(0, n - 1 - i):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
swapped = True
if not swapped: # 本轮无交换 -> 已有序
break
return nums

def selection_sort(nums):
“””原地选择排序;不稳定。时间复杂度始终 O(n^2)。”””
n = len(nums)
for i in range(n - 1):
min_idx = i
# 在 [i+1, n) 中找最小元素的位置
for j in range(i + 1, n):
if nums[j] < nums[min_idx]:
min_idx = j
# 只在需要时交换,减少无谓交换次数
if min_idx != i:
nums[i], nums[min_idx] = nums[min_idx], nums[i]
return nums



# 归并排序

def merge_sort(nums):
if len(nums) <= 1:
return nums
mid = len(nums) // 2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left, right)

def merge(left, right):
l, r = 0, 0
res = []
while l < len(left) and r < len(right):
if left[l] <= right[r]:
res.append(left[l])
l += 1
else:
res.append(right[r])
r += 1
res.extend(left[l:])
res.extend(right[r:])
return res


运营商

(正文内容从这里开始…)

中国电信
电信优才计划还没出
前言:五个公司,每个公司两个岗位。

陕西省公司招聘岗位整理

软件开发工程师

工作地点: 省本部 · 西安市

🎓 学历要求

硕士研究生及以上

🧑‍🎓 专业要求

计算机、电子信息、自动化、数学、统计学及其他相关专业

📌 岗位职责

  1. 需求分析与系统设计:与业务部门合作,理解业务需求,进行系统设计。
  2. 编码实现与测试:根据设计文档进行编码实现,并完成单元测试,确保代码质量和系统稳定性。
  3. 应用软件维护:参与软件开发的全过程,包括编码、调试、集成等,并负责系统的后期维护和优化。
  4. 新技术研究与应用:关注行业动态和新技术发展,研究并尝试将新技术应用于项目中,提升系统性能和用户体验。

✅ 任职资格

  1. 硕士研究生及以上学历,计算机、电子信息、自动化、数学、统计学及其他相关专业。
  2. 编程技能:熟练掌握至少一种主流编程语言(Java / C / C++ / Python)。
  3. 工具和框架:熟悉所用编程语言的IDE或工具链、主流框架和库;了解版本管理和测试工具。
  4. 软件工程:熟悉软件开发全流程(需求、设计、开发、测试、部署、维护),具备技术文档编写能力。
  5. 持续学习:关注软件开发领域的新技术和方法;了解电信行业特点及相关技术应用场景。

AI开发工程师

工作地点: 省本部 · 西安市

🎓 学历要求

硕士研究生及以上

🧑‍🎓 专业要求

计算机、电子信息、自动化、数学、统计学及其他相关专业

📌 岗位职责

  1. AI系统研发:设计、开发和维护公司内部AI系统,包括机器学习模型、深度学习算法。
  2. 数据处理与分析:收集、整理、分析数据,保证训练数据质量,提升模型准确性。
  3. 模型训练与优化:使用先进技术对模型进行训练、调优、验证,提高性能与泛化能力。
  4. 内部应用集成:将AI功能集成到客户服务、网络优化、运维管理等系统中,提升智能化水平。
  5. 技术创新与研究:关注AI新技术和趋势,为公司AI应用创新提供解决方案。

✅ 任职资格

  1. 硕士研究生及以上学历,计算机、电子信息、自动化、数学、统计学及其他相关专业。
  2. AI基础:理解人工智能、机器学习、深度学习的基本原理。
  3. 数据处理能力:掌握编程与数据预处理技能,能完成数据清洗、标注等工作。
  4. 深度学习框架:熟练使用 Python,能用 TensorFlow、PyTorch 等框架搭建和训练模型。
  5. 持续学习:保持对AI新技术的学习热情,了解电信行业应用场景。

陕西省公司岗位面试准备指南

🖥 软件开发工程师面试准备

🎯 核心考察方向

  • 计算机基础

    • 数据结构与算法:排序、查找、哈希、栈/队列、树、图、时间复杂度分析
    • 操作系统:进程/线程、内存管理、同步与互斥、死锁、调度算法
    • 计算机网络:TCP/UDP、三次握手、四次挥手、HTTP/HTTPS、常见排查思路
    • 数据库:SQL 基础、事务ACID、索引、锁机制
  • 编程与代码能力

    • 精通 Java / C++ / Python 至少一种
    • 现场手写算法题(链表反转、LRU缓存、二分查找等)
    • 注意代码风格与复杂度分析
  • 软件工程实践

    • 熟悉软件开发全流程(需求 → 设计 → 开发 → 测试 → 部署 → 维护)
    • 使用 Git、单元测试、持续集成 CI/CD
  • 项目经验与解决问题能力

    • 熟悉自己做过的项目,能用 STAR 法讲清楚背景、任务、行动、结果
    • 准备性能优化、故障排查的思路

🤖 AI开发工程师面试准备

🎯 核心考察方向

  • AI 与机器学习基础

    • 逻辑回归、SVM、决策树、随机森林、KNN、KMeans
    • 神经网络原理、前向传播/反向传播、梯度下降、损失函数
    • 常见任务:分类、回归、聚类、预测、推荐
  • 深度学习框架与实操能力

    • 熟练使用 PyTorch / TensorFlow 搭建简单网络
    • 掌握数据预处理、特征工程、模型训练和调参
    • 理解正则化、学习率调度、早停等模型优化技巧
  • 数学与概率统计基础

    • 线性代数:矩阵运算、特征值、SVD
    • 概率统计:条件概率、贝叶斯公式、期望方差、常见分布
    • 优化方法:SGD、Adam、RMSProp
  • 业务落地与创新能力

    • 能解释 AI 在电信场景的落地方式:预测、推荐、异常检测、运维优化
    • 能回答如何处理数据质量问题、如何提升模型泛化能力

🏙 研发中心(北京)- AI智能网络运维工程师

工作地点: 中国电信股份有限公司 · 北京云网操作系统研发中心

🎓 学历要求

硕士研究生及以上

📌 岗位职责

  1. 网络实时监控与智能运维:负责IP网、传输网7x24小时实时监控,基于AI算法实现隐患预测及自动修复,保障网络安全稳定运行。
  2. 智能网络规划与优化:参与新一代智能网络规划,分析PB级流量和设备性能数据,构建网络拓扑优化模型,提升网络灵活性和健壮性。
  3. 安全运营能力建设:利用AI进行异常流量识别、DDoS预警,动态调整安全策略,构建智能防御体系。
  4. 运维自动化创新:基于中国电信网络大模型平台,开发自动化运维机器人,实现配置核查、故障定位等重复工作的自动化,优化运维流程。
  5. 完成领导交办的其他工作。

✅ 任职资格

  1. 具有良好的思想政治素质和职业道德。
  2. 通信或计算机相关专业硕士研究生及以上学历。
  3. 扎实的计算机与通信基础,掌握大数据/AI技术,熟悉主流编程语言和开源软件,具备开发能力;良好的英语听说读写能力。
  4. 熟悉并能运用AI框架(TensorFlow、PyTorch、Hugging Face Transformers),有实际操作经验,理解预训练模型调优、微调与推理过程;有大模型方案设计经验优先。
  5. 具备良好沟通能力、团队协作精神、创新意识,责任心和执行力强。

☁️ 研发中心(北京)- AI智能云运维工程师

工作地点: 中国电信股份有限公司 · 北京云网操作系统研发中心

🎓 学历要求

硕士研究生及以上

📌 岗位职责

  1. 云实时监控与智能运维:负责云池7x24小时监控,基于AI算法实现隐患预测、告警处置、故障修复,保障云架构稳定。
  2. 云服务运营质量分析:分析云服务性能趋势和运营质量,满足云业务发展与客户需求。
  3. 运维效率提升与技术迭代:推动云运维智能化,引领新技术和新工具,构建基于大数据和AI的高质量运维平台。
  4. 智能化运维创新:基于中国电信网络大模型平台,开发“运维数字人”,实现故障定位、运行分析等智能体化运维。
  5. 完成领导交办的其他工作。

✅ 任职资格

  1. 具有良好的思想政治素质和职业道德。
  2. 云计算、通信或计算机相关专业硕士研究生及以上学历。
  3. 扎实的计算机与通信基础,掌握大数据/AI技术,熟悉主流编程语言和开源软件,具备开发能力;良好的英语听说读写能力。
  4. 熟悉并能运用AI框架(TensorFlow、PyTorch、Hugging Face Transformers),有实际操作经验,理解预训练模型调优、微调与推理过程;有大模型方案设计经验优先。
  5. 具备良好沟通能力、团队协作精神、创新意识,责任心和执行力强。

研发中心(北京)岗位面试准备指南

🏙 AI智能网络运维工程师面试准备

🎯 核心考察方向

  • 通信与网络基础

    • IP网络、传输网架构与原理
    • TCP/IP协议栈、路由协议(OSPF、BGP)、MPLS
    • 网络故障排查方法:抓包、路由跟踪、链路状态分析
    • 网络安全基础:DDoS攻击原理、防护策略、异常流量识别
  • AI与大数据能力

    • 熟悉机器学习/深度学习算法,能解释模型训练流程
    • 掌握流量预测、异常检测、自动化故障诊断的基本方法
    • 熟悉PyTorch、TensorFlow、Hugging Face Transformers的使用
    • 理解预训练模型微调(fine-tuning)、推理加速、蒸馏等技术
  • 运维与自动化技能

    • 熟悉Linux运维基础、脚本语言(Shell、Python)
    • 了解自动化运维工具(Ansible、SaltStack)、CI/CD流程
    • 能设计简单的自动化监控和告警处理脚本
  • 项目实践与问题解决能力

    • 准备介绍与网络监控、智能运维、流量分析相关的项目
    • 展示如何利用AI模型减少故障处理时间、优化网络拓扑

☁️ AI智能云运维工程师面试准备

🎯 核心考察方向

  • 云计算与分布式系统基础

    • 云计算架构:IaaS、PaaS、SaaS概念
    • 虚拟化技术:KVM、Docker、Kubernetes
    • 分布式存储、服务编排、弹性伸缩的原理
    • 云安全:权限管理、密钥管理、隔离策略
  • AI赋能运维能力

    • 云监控指标分析:CPU、内存、网络带宽、存储IO
    • 使用机器学习预测故障、自动化恢复
    • 能结合大模型平台开发“运维数字人”,实现告警分析、自动化决策
  • 大数据与日志分析

    • 掌握日志采集和分析工具:ELK、Prometheus、Grafana
    • 能处理PB级别数据,提取异常模式并建模
  • 创新与持续优化能力

    • 了解智能化运维(AIOps)的发展趋势
    • 能提出运维流程优化建议,提高自动化率和可观测性

中国移动陕西省公司省级金种子

截止日期10.11

🧠 AI算法工程师(算法研发与大模型落地)

📌 岗位描述

  1. 针对各类业务场景,挖掘AI技术和算法需求,设计技术实现方案,完成算法研发与调优迭代。
  2. 分析大模型应用的技术路径,设计微调方案和评估体系,研究蒸馏、量化、推理加速,推动大模型在业务场景落地。
  3. 针对计算机视觉小模型场景,设计轻量高效的架构,实现图像识别、目标检测、分割任务的开发。
  4. 构建高质量训练数据集,设计数据增强策略,提升模型泛化能力。
  5. 跟踪国内外AI技术进展,负责前沿研究,指导实践中的模型选型与迭代优化。
  6. 根据业务需求提供解决方案,指导AI技术落地并推动执行。
  7. 负责算法模型上线管理平台的选型、实施、管理与维护。

✅ 任职条件

专业要求:
人工智能、计算机、软件、通信、数据分析、信息安全、数学、统计等相关专业。

能力要求:

  • 熟练掌握 C / C++ / Java / Python / SQL / Matlab,编程基础扎实。
  • 熟练使用主流深度学习框架(Caffe、TensorFlow、PyTorch、MXNet 等)。
  • 熟悉 CNN 架构,理解 MobileNet、YOLO、RT-DETR 等主流模型原理与实现细节。
  • 深入理解 Transformer 架构,熟悉 BERT、GPT、DeepSeek 等大模型原理与实现。
  • 熟悉 Prompt 工程、LoRA、P-Tuning 等微调技术,有多任务迁移学习经验。
  • 了解 Hadoop、Hive、Spark 等大数据技术,掌握常见机器学习算法。
  • 了解网络+AI行业趋势,有技术落地和商业变现实践经验者优先。

🏢 政企客户解决方案工程师(AI+软件开发)

📌 岗位描述

  1. 负责政企客户需求分析和系统设计,收集业务需求,制定技术方案,输出技术文档。
  2. 参与软件产品开发,进行代码编写、功能实现、测试,确保质量与交付效率。
  3. 负责系统部署实施与运维支持,解决运行问题,保障业务连续性。
  4. 跟踪技术发展,参与技术选型与优化,推动系统迭代升级。
  5. 根据客户需求,结合智能体/AI Agent、大模型应用、数据建模,进行算法集成、研发、调优和落地,解决实际业务问题。

✅ 任职条件

专业要求:
人工智能、计算机、软件、通信等相关专业。

能力要求:

  • 精通至少一种主流编程语言(Java / Python / Go),编程基础扎实。
  • 掌握算法与数据结构基础,具备系统设计和性能优化能力。
  • 熟悉数据库(SQL、NoSQL),能高效处理数据存储与查询。
  • 了解软件开发方法论(敏捷开发)、版本控制工具(Git),具备良好流程管理能力。
  • 了解 Docker、Kubernetes、微服务架构,有云平台经验或大模型开发经验优先。
  • 具备沟通能力和团队协作精神,能与客户、团队高效交流。

🎯 面试准备指南

AI算法工程师面试考点

  • 深度学习与大模型

    • Transformer架构原理、Attention机制、BERT/GPT原理
    • 微调技术:LoRA、Prompt Tuning、P-tuning、Adapter
    • 模型压缩:蒸馏、量化、剪枝、推理加速(ONNX、TensorRT)
    • 计算机视觉:YOLO、RT-DETR原理与应用
  • 数据处理与工程化

    • 构建高质量数据集、数据增强策略
    • 分布式训练与加速(DDP、Horovod)
    • 模型上线、部署与监控(MLOps)
  • 大数据与分布式计算

    • Hadoop、Hive、Spark 基本原理
    • 流式处理与实时推理

政企解决方案工程师面试考点

  • 软件开发能力

    • 常见算法和数据结构、系统设计能力
    • 微服务架构、接口设计、性能优化方案
  • 云原生与运维

    • Docker/K8s 基本操作、微服务部署
    • CI/CD流程,日志采集与故障排查
  • AI集成能力

    • AI Agent、大模型应用在业务中的实际落地方案
    • 如何将算法嵌入到已有系统中、进行调优和监控

中国移动西安市公司
人工智能解决方案架构师(市级金种子)
【工作职责】
1、负责相关领域的客户解决方案,提供售前、售中、售后全流程的技术支撑、方案设计和落地交付;
2、作为客户接口,对接高校/业界公司/省内具体需求沟通梳理,负责产品的试用、试点和部署对接,协调组织环境和资源,推进高校/业界/省内落地工作,对客户目标和满意度负责;
3、与研发团队协同,参与人机协同、路测感知融合、数据处理、大数据、数据建模、数据安全、结构化数据、神经网络等领域的问题建模和产品研发,并将客户需求和现场问题反馈至研发团队进行解决;
4、负责相关领域平台、产品的客户推广,研发成果对外宣传、客户培训等。
【学历要求】
硕士研究生及以上学历
【专业要求】
计算机、软件、通信、数据分析、电子、自动化、信息安全、数学、统计等3T相关专业。
【能力要求】
1、具备路测感知融合、数据处理、大数据、数据建模、数据安全、结构化数据、神经网络等任一领域相关的领域知识;
2、对行业客户的业务场景和技术需求有深入理解,对业界的AI技术和产品有充分掌握;
3、了解大数据、数据模型、数据安全、智能汽车、自动驾驶、车联网、无人驾驶技术等相关技术;
4、具备成体系的行业洞察能力、具备行业专家顾问式沟通能力和拓展能力;
5、熟悉主流IT技术框架,了解Hadoop、Hive、Spark等主流大数据技术,熟悉常见的机器学习算法;
6、对网络+AI行业发展趋势和技术需求有洞察和理解能力、对营销与技术变现有实践落地经验优先。

职位信息
招聘类型:校园招聘招聘人数:8人学历要求:硕士研究生开始时间:2025-09-01工作类型:全职工作年限:不限截止时间:2025-10-25职位类别:技术类所属公司:中移九天人工智能科技(北京)有限公司(九天人工智能研究院)所在城市:北京-北京市-丰台区详细地址:不限
岗位描述
1、持续关注人工智能领域,深入调研大模型/智能体/世界模型相关技术的最新研究成果和发展趋势探索和实施最新的大模型/智能体/世界模型算法与模型;
2、探索大模型/智能体世界模型/数据收集和治理方法;研发大模型/智能体/世界模型核心算法,利用机器学习、深度学习、强化学习等技术,提升大模型/智能体/世界模型核心能力,解决相关技术挑战;对现有算法进行创新优化,提高算法的性能和效率;
3、分析大模型/智能体/世界模型训练推理瓶颈,从基础建设、训练方法、优化策略等方面提升大模型/智能体/世界模型训推效率;负责大模型/智能体/世界模型系统开发、落地和部署工作。

任职条件
1、硕士研究生学历及以上,计算机科学与技术、控制科学与工程、软件工程、信息与通信工程等相关专业;
2、人工智能基础理论扎实,熟练掌握经典的机器学习、深度学习算法理论;编程功底扎实,精通Python、C++等编程语言,熟悉PyTorch、transformers、DeepSpeed等框架;了解大模型/智能体/世界模型相关技术,具备大模型数据治理能力,熟练掌握大模型训练和优化方法;具备独立阅读英文文献和撰写英文论文的能力;
3、 具有出色的解决复杂问题的能力,能够独立完成算法设计、开发和测试;热爱AI技术创新,对AI产品有热情;具有良好的团队协作和沟通能力,能够在多学科团队中高效工作;
4、在深度学习、自然语言处理、机器学习等相关领域的研究和实践经验、在顶会或者期刊发表过大模型/智能体/世界模型相关论文者优先。

职位信息
招聘类型:校园招聘招聘人数:6人学历要求:硕士研究生开始时间:2025-09-01工作类型:全职工作年限:不限截止时间:2025-10-25职位类别:技术类所属公司:中移九天人工智能科技(北京)有限公司(九天人工智能研究院)所在城市:北京-北京市-丰台区详细地址:不限
岗位描述
1、研发清洗和生成的AI算法,提升九天基座大模型数据的质量,并通过多样算法和模型提升和优化数据质量;
2、参与预训练数据处理算法模型的设计与优化;
3、与其他相关团队合作,提供数据支持和技术解决方案;
4、持续研究和应用最新的数据工程技术,推动团队技术进步。

任职条件
1、有机器学习相关经验,包括但不限于推荐系统、用户画像、文本分类、情感分析、文本生成等,熟悉 BERT/tranformer 等模型;
2、具备良好的编程实践,熟悉 Python/java/scala 程序开发编程语言(至少一种);
3、具有处理大规模文本数据的相关经验;
4、良好的沟通能力和团队合作精神,能与跨职能团队有效合作;
5、有强烈的责任心和主动性,能够在快速变化的环境中自我驱动,推动数据在产品中的应用。

天翼云
超级优才计划只要博士
只要大城市有岗位
天翼云北京
算法工程师(北京)(004040)研发
工作职责
1.负责图像处理、图像分类、图像识别、目标检测等算法的设计和实现;
2.负责NLP算法的设计和实现,包括但不限于:文本分析、关键字提取、语义分析、文本挖掘、舆情分析、知识图谱等技术方向;
3.负责深度学习系统的搭建,包括机器学习、图像处理、NLP等算法的研究以及相关系统的研发;
4.针对特定应用场景进行算法分析、优化;
5.支持公司相关深度学习产品研究。
任职要求
1.硕士研究生及以上学历应届毕业生,计算机、数学、自动化、电子信息、通信等相关专业,机器学习、图像处理、计算机视觉、自然语言处理等相关方向优先;
2.至少熟练使用Python、C、C++、Java中的一种编程语言,熟悉面向对象编程、常见算法和数据结构。熟练使用Linux、熟练掌握Shell脚本;
3.掌握机器学习、深度学习等相关知识,至少能熟练使用Tensorflow、PyTorch、Paddle、Caffe、MXNet、Theano等深度学习框架中的一种;
4.了解常用深度学习网络结构,e.g. ResNet、Inception-ResNet、PyramidNet、 MobileNet 等。了解并使用过常用NLP库,如NLTK、jieba、coreNLP、BERT等;
5.具备独立承担算法设计、实现、调试和优化的能力,能够将算法落地到实际的产品中;
6.具有独立解决问题的能力,较强的逻辑思维能力及学习能力,具备良好的沟通表达能力和团队合作精神,工作积极主动,个性乐观开朗,逻辑性强;
7.身心健康。

算法工程师(上海)(004042)研发
工作职责
1.负责图像处理、图像分类、图像识别、目标检测等算法的设计和实现;
2.负责NLP算法的设计和实现,包括但不限于:文本分析、关键字提取、语义分析、文本挖掘、舆情分析、知识图谱等技术方向;
3.负责深度学习系统的搭建,包括机器学习、图像处理、NLP等算法的研究以及相关系统的研发;
4.针对特定应用场景进行算法分析、优化;
5.支持公司相关深度学习产品研究。
任职要求
1.硕士研究生及以上学历应届毕业生,计算机、数学、自动化、电子信息、通信等相关专业,机器学习、图像处理、计算机视觉、自然语言处理等相关方向优先;
2.至少熟练使用Python、C、C++、Java中的一种编程语言,熟悉面向对象编程、常见算法和数据结构。熟练使用Linux、熟练掌握Shell脚本;
3.掌握机器学习、深度学习等相关知识,至少能熟练使用Tensorflow、PyTorch、Paddle、Caffe、MXNet、Theano等深度学习框架中的一种;
4.了解常用深度学习网络结构,e.g. ResNet、Inception-ResNet、PyramidNet、 MobileNet 等。了解并使用过常用NLP库,如NLTK、jieba、coreNLP、BERT等;
5.具备独立承担算法设计、实现、调试和优化的能力,能够将算法落地到实际的产品中;
6.具有独立解决问题的能力,较强的逻辑思维能力及学习能力,具备良好的沟通表达能力和团队合作精神,工作积极主动,个性乐观开朗,逻辑性强;
7.身心健康。

中国农业银行西安开发
2025-10-09截止
主要职责
主要从事监管报送(含反洗钱)、反欺诈、投资理财、资产负债、数据服务、托管业务等领域的研发与工程实施。

应聘条件
1.热爱祖国,热爱金融事业;诚实守信,品行端正,遵纪守法,无违法违纪或不良行为记录。
2.综合素质好,身心健康;具有较强的开拓创新、研究分析、文字综合和沟通协调能力,有团队合作精神。
3.境内外院校大学本科及以上学历毕业生,须在2026年7月31日前毕业,并取得国家认可的毕业证、学位证或国家教育部留学服务中心的学历学位认证书。如届时国家另有规定的,按有关政策办理。
4.大学英语六级(CET6)425分及以上,或英语专业八级合格,或托业(TOEIC)听读公开考试715分及以上,或新托福(TOEFL-iBT)考试85分及以上,或雅思(IELTS)考试6.5分及以上,或通过相应水平考试。
5.符合监管机构关于银行业从业人员的有关要求,以及中国农业银行亲属回避相关规定。

具体要求
1.计算机相关专业。
2.计算机基础扎实,熟练掌握C、C++、JAVA、C#中任意一门编程语言。
3.了解Windows、Unix、Linux等主流操作系统原理,了解一种或多种数据库。
4.熟练掌握Hadoop、MySQL、PostgreSQL、MongoDB、Redis、Memcached、Cassandra、SQLite中任意一项开发和管理技术。

研发中心

研发中心本部及北京总部
智领计划岗
主要职责
致力于培养我行金融科技领域的新生代领军和骨干人才,招录技术能力突出、热爱钻研探索、具有发展潜力的杰出科技背景毕业生,设置专属锻炼成长通道,给予重点培养。

应聘条件
1.热爱祖国,热爱金融事业;诚实守信,品行端正,遵纪守法,无违法违纪或不良行为记录。
2.综合素质好,身心健康;具有较强的开拓创新、研究分析、文字综合和沟通协调能力,有团队合作精神。
3.境内外院校硕士研究生及以上学历毕业生,须在2026年7月31日前毕业,并取得国家认可的毕业证、学位证或国家教育部留学服务中心的学历学位认证书。如届时国家另有规定的,按有关政策办理。
4.大学英语六级(CET6)425分及以上,或英语专业八级合格,或托业(TOEIC)听读公开考试715分及以上,或新托福(TOEFL-iBT)考试85分及以上,或雅思(IELTS)考试6.5分及以上,或通过相应水平考试。
5.符合监管机构关于银行业从业人员的有关要求,以及中国农业银行亲属回避相关规定。

具体要求
1.计算机、软件工程、大数据分析、人工智能、信息安全专业,具有金融和信息科技复合背景者优先。
2.具有国内外顶级竞赛获奖经历和在专业领域有重量级科研成果者优先。

这找工作感觉跟考研一样啊!

这找工作感觉跟考研一样啊!

梁懿稔的碎碎念·Introduction Chapter

2022 年篇

依稀记得 2022 年准备考研的时候,因为压力很大,加上宿舍环境不好,晚上还总是睡不着觉,所以决定搬出学校。那时迅雷不及掩耳地完成了校外租房,价格属实不便宜,好像是 1750 元。于是就开始了自己在校外独自生活的剧本。

2022 年 7 月,在我刚搬出去不久,就开始了实习。8 月放暑假,月底回到学校后基本就全身心地投入到考研准备中。

现在回想起来,那时候的心境,也算是抛开杂念、背水一战了吧。毕竟钱花了,环境也创造了,再不努力,再考不上,总觉得有点对不起自己。那时做了比较明确的计划,时间安排得几乎满满当当,但也没有像高中那样争分夺秒。毕竟时隔多年,我好像已经丧失了那种“努力到无能为力”的学习能力。

本科这几年,似乎都是被推着走:上课、作业、应付作业、考试、突击复习……我并没有真正想把知识掌握透彻。并不是所有都学不好,简单的我还是能掌握的,只是觉得很多内容太难了。当然,归根到底还是自己不够努力吧。高中三年没享受到的娱乐,大学期间总得找回来?还是说,自己目标不够明确,不知道真正想干什么。

所以在大三快结束、即将进入大四的阶段,找工作的压力和考研的压力几乎同时压得我喘不过气。这时不禁在想:前三年为什么不更努力一点呢?哪怕多付出 20% 的努力,哪怕少玩一半的手机、视频或电脑,知识掌握程度应该都不止于此。

不过后悔是无用的,认识到问题,就要马上开始努力。那段时间,我基本全心投入到研究生备考中,每天学习 4–6 小时。相比高中时期每天 12 小时的有效学习,简直天差地别。但请原谅我,我真的没有那么多精力了。

身体方面,我已经不能长时间久坐了,腰疼、腿疼、脖子疼,很难说不是高中时一节节课坐下来的后遗症。晚上失眠更是多年未能缓解。所以晚上八点之后的时间几乎都用来放松心情,如果让我学到十点十一点是可以的,但无法控制的报复性熬夜会摧毁第二天的计划。

备考的那几个月是痛苦的,也是轻松的,更是目标清晰的。我人生中第一次学会自己做饭、生活、买菜,这是一种全新的体验,感觉挺好。后来有幸在九月底赶上了最后一波保研,最终没有经历真正的考研折磨,也有幸进入掌门的组里直博。

2025 年篇

回到现实,现在是 2025 年,可以说是物是人非了。现在的我,已经离开备考研究生的小房间两年了。类似的是,我又在一个月租 1850 新币的新加坡小房间里,准备找工作。

此情此景,感受着新加坡雨季凉爽的温度,吹着像西安九月一样的风,我有些恍惚,仿佛回到了三年前那个夏天,看着本科阶段一事无成的自己,感到感慨与无奈——是触景生情的感伤。

如今虽然不用考研,但面对找工作,自己几乎忘光了 CS 基础知识,那些学了两年的 Python 和 AI 也没留下多少印象。看着琳琅满目的秋招信息,多少有点无力感。时间只剩最多三个月,只能临时抱佛脚。

三年下来,我到底有什么进步呢?其实还是有的。这里放个钩子读博的两年,我到底收获了什么

只是这些进步,对找工作到底能有多少帮助呢?感慨和悲伤没用,唯一能做的就是努力。不管找工作的过程会经历多少拷打,都得自己去面对。

在秋招信息里,我看到很多大厂实习生同学发的内推信息。我是不想去大厂吗?我是没自信,是没能力。博士两年让我成长,但也让我失去了一些东西。作为一个国内 master,我现在才明白怎样更好地安排自己。再放一个钩子🪝都是自己想写的怎么样才是一个硕士的最好安排呢

博士期间几乎没有多余时间。周内必须工作,每周一到三次的组会必不可少,要看的论文数不胜数,目标上限是无穷大,永远无法完全满意自己。周末虽说是休息日,我真的不想再工作了。组会和交流的内耗,逐渐磨灭了我的动力,让我不再追求新的技术、代码能力或有趣的项目,剩下的只有论文和代码。

这也意味着——我不会 Java,与开发岗位几乎绝缘;我不会 JS + HTML,与前端无缘;虽然搞算法,但没有论文,算法岗也悬;LeetCode 还没破三位数。

不过一年博士生活,确实提升了我的思考方式,也让我更有自信去面对算法题。时间的沉淀,有时是有用的。所以我决定开始写博客(虽然本科刚学计算机时就该写了哈哈)。也想写一些其他主题,比如 娃从小到大完美的上学规划是什么样的,看看如果能回溯人生,我理想的轨迹会是怎样。

回到现实,我现在几乎是“零大厂能力”。要想拥有开发能力,可能至少需要三个月以上的专项学习——包括语言、算法、技术栈,最好再加一个中厂实习,再凭中厂经验去冲大厂实习。问题是,我没有项目,而项目通常从实习中开始,或者通过开源贡献积累。而我什么都没有。

有时夜里会感慨:学了这么多年计算机,成绩不算低,到底干了什么?会了什么?为什么学了计算机却进不了互联网相关行业?所以,我要开始写博客,反思自己这几年的行为,并记录接下来的努力。接下来的方向可能是国企、外企,以及一些中厂的开发、数据分析、算法岗位。只是我真的担心,到时候一去,啥都不会啊!不管如何,让自己先通过这几个月的努力,至少达到刚完成所有必修课的CS本科生水平,先达到一个熟练的python民工水平,达到一个搞算法的硕士生水平吧!

🌏 我的出国申请全流程时间线回顾

回顾一下全流程吧:我的出国申请时间线

八月:决定出国

九月初:找中介

九月中旬:开始学雅思

十月初:第一次雅思考试

第一次雅思考试成绩 6.0

十一月初:第二次雅思考试

第二次考试成绩提升到了 6.5

十一月中旬:开始写申请材料

马上投入到申请文书和材料的准备中

十二月底:递交申请

赶在年底前完成了材料的最终定稿和投递

三月底:收到 Offer

三月底终于收到了 Offer

五月底:申请 IPA

办理 IPA

六月中旬:国内体检

在国内完成体检

八月初:入学前迎新体检 + Endorsement + 转换 STP

AI 时代,别把思考外包

ai时代来了 我们很多人即将放弃思考了
因为ai能替代很多东西
我们不需要去做那么多繁杂的工作了
我们也不需要翻箱倒柜去查资料了
这些简单无脑甚至复杂有脑的工作ai
都能帮我们完成

但是我们依然需要独立思考 一是因为现在还不是通用人工智能
二是即使通用人工智能来了
领导社会发展的依然是独立思考的人
这个社会ai发展淘汰的不是不会用ai的人
而是只会用ai不会独立思考的人

完美的计算机规划

什么是理想的大学规划

我们假设学生非常喜欢电子信息,且顺利高考报志愿选择到电子信息大类或者计算机/软件/人工智能/大数据等专业并且开始大学学习。
我们假设学生所在本科院校为强211或者中985,我们假设学生所在学校不是两电一邮是一个”综合性大学“,那么孩子该怎么通过自己努力实现逆袭呢。

首先在高考完的暑假,放松之余,养成健康的生活习惯,锻炼身体,保持身体健康和充足的精力。其次,在休息之余就干两件事,第一学英语,第二学python。英语只要在高考的基础上,达到四六级能过的水平即可,真的,这对于高考英语120+的正在英语水平癫疯的学生来说是轻而易举的事情,打好英语基础,一是为了自己的编程做铺垫,二是养成良好的英语学习习惯,这样就能在每天的积累中顺利考过四六级,考过雅思,甚至能利用上本科学院的报销机制,实现白嫖雅思。

好,接下来我们说怎么学python,其实也同样的,不需要达到特别高的水平,只需要把b站随便挑一个免费的课即可,每天学两个小时,用不了一个月,你将彻底读懂一门语言,跟着视频每一个代码都敲一遍,有一个月的时间,你将彻底掌握好一门语言的基础,接下来,当你正式进入大学开始课程学习的时候,你将特别轻松,甚至能很顺利的开始你的acm生涯,这样四年下来,你跟同学拉开的差距,可能是指数级别的。

好的,我们假设你能顺利完成刚才提到的两件事情,其实真的不难。这里其实我们还忽略了高中学信息竞赛的前提,如果高中已经有基础,你在大学将实现降维打击。就这么说,对于绝大部分按部就班或者不怎么上进的同学来说,他们毕业准备考研找工作的水平,都无法达到你高二的巅峰水平。人与人的差距,就是这么大。

好的,我们开始大一的课程,这时候你会学一些数学课,其实数学课永远都是重要的,但是把,这时候我们需要做出一些决战,就是你数学基础好不好,如果你是数学颇有天赋,对于导数颇有研究,那么高等数学对你应该不会有什么太大的压力,你只需上课好好听,作业好好写,考个8090分应该问题不大。线性代数更是,只需要掌握最核心的东西,你将不会遇到太大的困难。如果,你的成绩不是很好,那么你学数学就会比较吃力了。这时候我们就需要考虑一件事情了,自己是不是需要保研,或者自己想不想读博,自己想不想搞科研,自己是不是想马上就业,这时候就需要根据自己的需求考虑前进的方向。

因为一般学校的数学课学分都是很高的,换句话说,如果你高数考70,你基本与保研无缘了。如果你说,我想争一下保研,那么好,你要做的事情就比较明确了,刷题,真的像高中那样学习,如果你真的怎么也很难搞懂原理,那么简单,你会做题,能考高分就可以了,多做几遍,把题目答案背下来,你早晚会明白原理的。

如果你不想争保研,想去考研或者直接就业,那么好说,做必要的作业,复习必要的内容,只要70分就足够了。

好的,大一你还会有一门c/c++,应该会讲特别基础的东西,这些对于已经会python的你,很容易融会贯通,你会很容易的做完测试,大作业,甚至会成为很多同学的大腿,吸引异性的关注等等等等。同样的,你会节省出很多时间,可以用在你不好的数学上,所以,如果你编程课很顺利,你的数学应该也不会差。

好的,大一的课应该是比较忙碌的,这时候的你们应该都比较卷成绩,这时候的大家应该也都是一张白纸,你们也没有学专业课,你们之间的差距也非常的小。这时候你该做什么了呢。好的,这时候你应该就会知道一个东西,他叫数学建模,对,已经会python的你,应该要参加这个数学建模了,一个国赛,一个美赛,你在学习数学建模的期间,又接触到了机器学习,深度学习,人工智能,你又发现了一个叫kaggo的东西,你知道了什么是服务器,你知道了你能用colab使用免费的服务器,你自学了linux,你会用LLM辅助你完成机器学习的代码,你开始在kaggo玩起来,你知道了什么叫深度学习,你发现数学建模跟dnn很多相似的地方,你对这个领域越来越感兴趣了。到了大二,你们开始学很多专业课,你知道了一个叫leetcode的东西,你听老师学长学姐说找工作要刷leetcode,你抱着试试看的心态,发现好难,什么都不会,这太正常了,比较你的数据结构算法课程刚刚开始,你开始学算法,你发现这东西好难,什么都不会,还容易忘,还好,你有python的基础,有了大一一年对编程的经验,你能通过自己的反复练习,逐渐掌握了很多算法,你开始手撕,你开始写leeicode,leetcoide开始成为你的日常,大二上学习,你在各种专业课之余,疯狂提升你的代码能力,你努力学计算机组成,计算机网络,离散数学等,尽管很多都是新鲜东西,你还是靠着自己的记忆力,疯狂提升自己的计算机网络知识,离散数学罗技,各种算法问题,你的能力在进一步提升着,由于你养成的良好习惯,你应对所有课程游刃有余,这时候你在想,很多同学都在疯狂参与社团活动,我要不要参与一下,于是你在大二也找了一个社团参加,环节你每天丰富的学习生活。

大二上结束了,你们完成了很多专业课的学习,你发现自己对深度学习有一定的狂热,你开始认识到,想去找老师做科研,发论文,由于你已经有了kaggo的基础,老师看到你的简历非常开心,又来了一个能带硕士发论文的本科生,你看着老师给你的课题和服务器,你有了自己的工位,有了带你的师兄,你欣喜若狂,你现在可以疯狂的压榨师兄,疯狂的提升自己。由于你的代码能力非常扎实,尽管很多深度学习的概念你还是第一次知道,虽然你还没上完机器学习深度学习的选修课,但是凭你经常打比赛的经验,kaggo的经验,还有你一直以来的英语基础,你能不是很困难的读懂师兄给你的论文,通过几周跟师兄的讨论,你明白了自己要做的东西,师兄也很给力,因为他也想发论文。就这样,你们齐心协力下,赶上了夏天aaai的投稿,你也就这样度过完了你的大二学年。这一年,你不仅算法有了质的提升,你的课堂成绩也没落下,尽管达不到前几名,你的综合成绩还是能隐隐约约够到保研的边缘。

你上了大三,你跟师兄的文章在几次修改之后终于发表,你也有了人生中第一个ccfA,尽管不是一作,但是学生二组也给了你充足的信息,你决定继续在实验室实习,同时大三你们的课程已经不多了 ,你觉得是不是该去找个实习了,所以你接触到了java,html css,go,你接触到了很多业界在用的技术语言,你开始自己上手学习,你开始跟着github上的项目开发,大三的寒假,你找到了寒假实习,是你心仪的大厂,因为大三下已经没有什么课程了,你比较顺利的跟指导老师完成沟通,在大厂完成了两个多月的实习,在实习过程中,你有一个很好的mentor在他的指导下,你学习到了非常多东西,你也成功有了你的第一个大厂开发项目经理。同时,你的文章也开始投稿。大三下,马上你们即将面临保研,你的成绩还不错,运气好是能保研的,但是你也丝毫不慌,保不上就考研呗,跟做科研的老师说一声一定会捞自己的。大三的夏天,好消息来了,你保上了,有几个角度可以解释吧(数学建模加分了,自己新的一作论文发表了加分了,成绩本身就是够的)。(大三的暑假要不要再加一个暑期实习呢,其实都行,毕竟现在已经基本什么都有了)

好了,你大四了,你保研了,因为你有论文发表,还有大厂实习,你成功保研到一所很top的学校,跟一个很强大的老师。做了一年多的科研,你认识到了自己还是喜欢干开发。你决定不读博,好好干老师的项目,同时精进自己的技术,多找实习。研一一年,你边划水上课,边了解老师的项目,同时精进了自己的leetcode完善自己的简历,这时候,你的leetcode已经到达了1000+题目,基本已经熟练掌握各种题目,大厂笔试对你来说手拿把掐,你不仅顺利完成导师的项目,也在研一暑期研二暑期分别找到实习,这时候你已经完成了各种岗位的实习,显然,研三的秋招对你来说根本不是事。

好了,写到这感觉根本写不下去了。博主感觉这几年大学最失败的一件事情就是大一高数没学好,就是说大一参加的活动还是太多了,自己还摆烂,离谱哇,就是说高中跟社会脱节太多了,大一想把什么都找回来,还是有点难度的。

从高数74分之后基本干什么都是难于上青天,自己也不知道计算机的职业规划,就浑浑噩噩,一直被拉开着差距。

大二有一点觉醒了,但是有很多社团学生组织事情在忙,其实也是在自我学习的过程,也参加了很多竞赛,为了增强自己吧,也确实一直在进步,也谈恋爱了,这么看我的大二是真的忙啊。大三就都是专业课了,这个时候也已经知道人与人的差距了,想努力差距还是很大,但是也尽力了吧,写大作业,会各种知识,努力刷分保研。大四就是在准备考研了,知道自己保研之后就去搞科研了,有一说一大四这一年还是挺努力的,努力在搞科研,所以研一的时候觉得自己很与众不同,因为大家都在玩耍,摆烂,考研的时候我在努力。但是博一一年确实又有点难受呀,因为全身心投入到科研和抗压中了。浪费了很多生命。博二一年基本就做了一件事,申请同时搞论文。这么看,我博一博二的时间如果分一部分到leetcode和项目,我现在应该没有这么痛苦。换句话说,如果我今年一年疯狂准备加实习,我明年的招聘应该是能轻松cover大厂的吧,这么看好像是,我做的还行啊哈哈哈哈哈哈,我好像也就是做到了普通人的极限了。毕竟我大三的时候也在努力刷题了,

逻辑回归一文通:二分类 vs 多分类(含 MLE、求导、正则、优化)

这篇是把我们前面所有讨论系统化的一份速查与学习笔记:从二分类逻辑回归到多类 softmax 回归,讲清楚 odds/logit、MLE、交叉熵、梯度推导、正则化,以及 GD/牛顿法等优化要点。可直接作为复习提纲。


0. 问题设定与记号

  • 训练集:({(x_i, y_i)}_{i=1}^N),(x_i\in\mathbb{R}^d)
  • 二分类:(y_i\in{0,1});多分类:(y_i\in{0,1,\dots,C-1})
  • 线性打分(logits):对类 (c) 记 (s_c = w^{(c)\top} x)

logits 不是概率,是“未归一化的分数”;要变成概率需要 sigmoid(二类)或 softmax(多类)。


1. 二分类:Logistic Regression

1.1 Sigmoid 与 logit

  • Sigmoid:
    [
    \sigma(z)=\frac{1}{1+e^{-z}} \in (0,1)
    ]
  • 概率:
    [
    p(x)=P(y=1\mid x)=\sigma(w^\top x)
    ]
  • odds(几率比):(\dfrac{p}{1-p})
  • logit(对数几率):(\mathrm{logit}(p)=\ln\dfrac{p}{1-p}=w^\top x)

logit 把 ((0,1)) 映射到 (({-}\infty,{+}\infty)),可用线性函数建模。

1.2 似然、对数似然与损失(交叉熵)

  • i.i.d. 假设下的似然:
    [
    L(w)=\prod_{i=1}^N p_i^{y_i}(1-p_i)^{1-y_i},\quad p_i=\sigma(w^\top x_i)
    ]
  • 对数似然:
    [
    \ell(w)=\sum_{i=1}^N \big[y_i\ln p_i + (1-y_i)\ln(1-p_i)\big]
    ]
  • 损失(负对数似然 = 交叉熵):
    [
    E(w)=-\ell(w)= -\sum_{i=1}^N \big[y_i\ln p_i + (1-y_i)\ln(1-p_i)\big]
    ]

为什么从似然变成损失? 最大化 (\ell(w)) ⇔ 最小化 (-\ell(w)),便于用最小化优化器。

1.3 梯度与更新

[
\nabla E(w)=\sum_{i=1}^N (p_i - y_i),x_i
]

  • 批量/小批量 GD:(w\leftarrow w-\eta\nabla E(w))
  • 阈值判别:(\hat y=\mathbb{I}[p(x)\ge \tau])(默认 (\tau=0.5),可按业务调整)

1.4 正则化(以 L2 为例)

[
E_\lambda(w)=E(w)+\frac{\lambda}{2}|w|2^2,\quad
\nabla E
\lambda(w)=\sum_i (p_i-y_i)x_i + \lambda w
]

权重衰减视角
(w\leftarrow (1-\eta\lambda)w-\eta\sum (p_i-y_i)x_i)

作用:抑制过拟合、提升稳定性(抗共线性),贝叶斯视角等价于高斯先验。


2. 多分类:Softmax(Multinomial Logistic Regression)

2.1 概率模型(两种等价写法)

  • 标准 softmax(常用)
    [
    p_c(x)=\frac{e^{w^{(c)\top}x}}{\sum_{k=0}^{C-1} e^{w^{(k)\top}x}}
    ]

  • 参考类(与课件一致)
    取 class 0 为参考,(w^{(0)}\equiv 0):
    [
    P(y=0|x)=\frac{1}{1+\sum_{k=1}^{C-1}e^{w^{(k)\top}x}},\quad
    P(y=c|x)=\frac{e^{w^{(c)\top}x}}{1+\sum_{k=1}^{C-1}e^{w^{(k)\top}x}};(c>0)
    ]

softmax 对“整体平移”不变:(s_c\mapsto s_c+a) 概率不变。选参考类只是去冗余,不影响预测。

2.2 交叉熵与 MLE

  • One-hot 标签 (y_{ic}\in{0,1}),(\sum_c y_{ic}=1)
  • 损失(不含正则):
    [
    E(W)=-\sum_{i=1}^N\sum_{c=0}^{C-1} y_{ic},\log p_{ic}
    ]

2.3 关键梯度结论(单样本 → 批量)

  • softmax 的核心梯度恒等式:
    [
    \frac{\partial \ell_i}{\partial s_{ij}}=p_{ij}-y_{ij}
    ]
  • 链式到参数:
    [
    \frac{\partial \ell_i}{\partial w^{(j)}}=(p_{ij}-y_{ij}),x_i
    ]
  • 批量求和 + L2 正则:
    [
    \boxed{;\frac{\partial E}{\partial w^{(j)}}=\sum_{i=1}^N (p_{ij}-y_{ij})x_i+\lambda w^{(j)};}
    ]

向量化(最实用):

  • 设 (X\in\mathbb{R}^{N\times d}), (W\in\mathbb{R}^{d\times C}),
    (S= XW), (P=\mathrm{softmax}(S)), (Y) 为 one-hot
    [
    \boxed{;\nabla_W E = X^\top (P - Y) + \lambda W;}
    ]
    (若用参考类法,固定第 1 列为 0 且不正则/不更新。)

2.4 学习规则(GD / mini-batch)

[
w^{(j)} \leftarrow w^{(j)} - \eta\Big(\tfrac{1}{|B|}!\sum_{i\in B}(p_{ij}-y_{ij})x_i + \lambda w^{(j)}\Big)
]

预测:(\hat y=\arg\max_c p_c(x))


3. Sigmoid 还是 Softmax?

  • 互斥单选(只能属于一个类)softmax + 多类交叉熵
  • 非互斥多标签(可多选)逐类 sigmoid + 二元交叉熵(one-vs-rest)

二分类中,“一个 sigmoid”与“2 类 softmax”是等价的:
(P(y=1)=\dfrac{e^{s_1}}{e^{s_0}+e^{s_1}}=\sigma(s_1-s_0))


4. 为什么损失凸却没有封闭解?

  • 逻辑回归的损失(交叉熵 / log-sum-exp)对参数是的 ⇒ 全局最优存在且唯一(加适当正则)。
  • 但一阶条件是非线性方程组(包含 sigmoid/softmax 的指数项),无法像线性回归那样解出 (w) 的显式封闭式。
  • 故需数值优化:GD/SGD/Adam/L-BFGS/牛顿(IRLS) 等。

5. 优化方法要点

5.1 一阶法(GD/SGD/Adam)

  • 便宜、可扩展到大数据;配合标准化、动量、权重衰减、学习率调度、早停。

5.2 二阶法(牛顿/IRLS,拟牛顿 L-BFGS)

  • 利用 Hessian(或其近似),局部二次收敛、迭代步数少;
  • 每步解线性方程,计算/存储较重,适合中等规模;
  • 逻辑回归 IRLS 形式:
    [
    \Delta w = (X^\top R X + \lambda I)^{-1} X^\top (y-p),\quad w\leftarrow w+\Delta w
    ]
    其中 (R=\mathrm{diag}(p_i(1-p_i)))。

6. 决策阈值与评估

  • 二分类默认阈值 (\tau=0.5);可按业务调优(ROC/PR 曲线、Youden/最佳 F1 等)。
  • 多分类一般取 (\arg\max);不平衡可结合代价敏感或后处理。

7. 实现清单(Checklist)

  • 特征标准化/归一化
  • 偏置项:拼 1 或单独参数(通常正则化偏置)
  • softmax 数值稳定:行内减最大值(log-sum-exp trick)
  • 正则系数 (\lambda) 与学习率 (\eta):验证集/交叉验证调参
  • 小批量、早停、权重衰减;必要时用 L-BFGS
  • 多分类参考类法 or 标准 softmax:预测等价,实现选更顺手的

8. 公式速查(Cheat Sheet)

二分类
[
\begin{aligned}
p_i&=\sigma(w^\top x_i),\
E(w)&=-\sum_i \big[y_i\ln p_i+(1-y_i)\ln(1-p_i)\big]+\tfrac{\lambda}{2}|w|^2,\
\nabla E(w)&=\sum_i (p_i-y_i)x_i+\lambda w.
\end{aligned}
]

多分类(softmax)
[
\begin{aligned}
p_{ic}&=\frac{e^{w^{(c)\top}x_i}}{\sum_k e^{w^{(k)\top}x_i}},\
E(W)&=-\sum_{i,c} y_{ic}\log p_{ic}+\tfrac{\lambda}{2}\sum_c|w^{(c)}|^2,\
\nabla_W E&=X^\top(P-Y)+\lambda W.
\end{aligned}
]


9. 常见问答(FAQ)

Q1:多分类一定要指定“class 0”吗?
A:不需要。参考类只是去冗余的一种参数化;标准 softmax 学 (C) 组权重即可,预测等价。

Q2:二分类不用 sigmoid 行吗?
A:可以。用二类 softmax等价;或用 SVM/hinge 等非概率方法。

Q3:为什么要正则化?
A:控制模型容量、抑制过拟合、提升数值稳定性;L1 得稀疏,L2 稳定抗共线,Elastic Net 折衷。


10. 参考实现(极简伪代码)

向量化梯度(softmax + L2):

# X: (N,d), Y one-hot: (N,C), W: (d,C)
S = X @ W                       # (N,C)
S -= S.max(axis=1, keepdims=True)
P = np.exp(S) / np.exp(S).sum(axis=1, keepdims=True)
grad = X.T @ (P - Y) / N + lam * W
W -= lr * grad

11. 结语

  • 二分类:sigmoid + 交叉熵 + (p-y) 梯度
  • 多分类:softmax + 交叉熵 + (P-Y) 梯度
  • MLE → NLL(交叉熵):最大似然 ⇔ 最小负对数似然
  • 凸但无封闭解:用数值优化(GD/L-BFGS/IRLS)
  • 正则化:更稳、更泛化

记住两条黄金公式即可快速复原一切:
(\nabla E_{\text{binary}}=\sum (p-y)x+\lambda w);
(\nabla E_{\text{multi}}=X^\top(P-Y)+\lambda W)。

我们再继续展开discrimination的问题

有很多机器学习和深度学习是discrimination的

但是现在是生成式模型的时代generation

以中石化第一节人工智能竞赛为例,题目一是一个简单的分类问题,但是难点在于类不平衡

所有我们默认先使用分类的模型

因为是多分类问题,所以自然不能使用逻辑斯特回归

想到分类擅长的SVM改进版,是能应对多分类问题的

然后贝叶斯方法和决策树

随机森林

然后还有无监督knn方法

在解决这个数据挖掘问题的过程

Logistic 回归:用线性决策函数,最大化正则化对数似然(等价最小交叉熵)学到权重,输出 sigmoid/softmax 概率,适合近线性可分数据。

SVM:通过合页损失 + 正则寻找最大间隔超平面,配核技巧映射到高维以处理非线性边界。

朴素贝叶斯(NB):假设特征在给定类别下条件独立,先估
𝑝(𝑥∣𝑦)p(x∣y) 和 𝑝(𝑦)p(y) 再用贝叶斯定理求 𝑝(𝑦∣𝑥)
p(y∣x),简单快速但偏强假设。

决策树:按信息增益/基尼指数递归划分特征空间形成规则树,叶节点给类别,易解释但单树易过拟合。

随机森林:对样本与特征做随机子采样训练多棵弱相关树并投票/平均,显著降方差、鲁棒好、调参友好。

Colab 学习笔记

本文整理自我的 Colab 笔记:保留核心文字与可复制的代码块,去除冗余输出与报错,适配 Hexo 博客。

import os
here = os.getcwd()
here = os.path.dirname(os.getcwd())
here
url = "https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a9a"
print(url)
from sklearn.datasets import load_svmlight_file
Xtr, ytr = load_svmlight_file(url)
import requests

url = "https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a9a"
filename = "a9a.txt"

response = requests.get(url)
with open(filename, "wb") as f:
    f.write(response.content)

print(f"Downloaded {filename}")
from sklearn.datasets import load_svmlight_file

filename = "a9a.txt"
Xtr, ytr = load_svmlight_file(filename)

print("Data loaded successfully!")
print("Shape of Xtr:", Xtr.shape)
print("Shape of ytr:", ytr.shape)
import os, sys, json
from urllib.parse import urlparse
from urllib.request import Request, urlopen
def hdr():
    h = {"User-Agent": "url-grabber/2.0", "Accept": "*/*"}
    tok = os.getenv("GITHUB_TOKEN")
    if tok:
        h["Authorization"] = f"Bearer {tok}"
        h["Accept"] = "application/vnd.github+json"
    return h
def http_get(url: str) -> bytes:
  with urlopen(Request(url, headers=hdr()), timeout=60) as r:
      return r.read()
url = http_get("https://github.com/location-competition/indoor-location-competition-20/blob/master/data/site1/F1/floor_info.json")
url
def http_get(url: str) -> bytes:
    with urlopen(Request(url), timeout=60) as r:
        return r.read()
url = http_get("https://github.com/location-competition/indoor-location-competition-20/blob/master/data/site1/F1/floor_info.json")
url
arr = json.loads(url.decode("utf-8", "ignore"))
arr
def http_get(url: str) -> bytes:
    # Construct the raw URL for GitHub
    parsed_url = urlparse(url)
    raw_url = f"https://raw.githubusercontent.com{parsed_url.path.replace('/blob/', '/')}"
    with urlopen(Request(raw_url, headers=hdr()), timeout=60) as r:
        return r.read()
url = http_get("https://github.com/location-competition/indoor-location-competition-20/blob/master/data/site1/F1/geojson_map.json")
url
arr = json.loads(url.decode("utf-8", "ignore"))
arr
def http_get(url: str) -> bytes:
    # Construct the raw URL for GitHub
    parsed_url = urlparse(url)
    raw_url = f"https://raw.githubusercontent.com{parsed_url.path.replace('/blob/', '/')}"
    with urlopen(Request(raw_url, headers=hdr()), timeout=60) as r:
        return r.read()
url = http_get("https://github.com/location-competition/indoor-location-competition-20/blob/master/data/site1/F1/path_data_files/5dd9e7aac5b77e0006b1732b.txt")
url
arr = json.loads(url.decode("utf-8", "ignore"))
arr
p = urlparse(url)
p
p[2]
def parse_tree(url: str):
    """
    https://github.com/<owner>/<repo>/tree/<branch>/<subpath...>
    -> owner, repo, branch, subpath
    """
    p = urlparse(url)
    parts = [x for x in p.path.strip("/").split("/") if x]
    if len(parts) < 4 or parts[2] != "tree":
        raise ValueError("不是 /tree/ 目录链接")
    owner, repo, branch = parts[0], parts[1], parts[3]
    subpath = "/".join(parts[4:]) if len(parts) > 4 else ""
    return owner, repo, branch, subpath
url = "https://github.com/location-competition/indoor-location-competition-20/tree/master/data/site1/B1/path_data_files"
def http_get(url: str) -> bytes:
    # Construct the raw URL for GitHub
    parsed_url = urlparse(url)
    raw_url = f"https://raw.githubusercontent.com{parsed_url.path.replace('/blob/', '/')}"
    with urlopen(Request(raw_url, headers=hdr()), timeout=60) as r:
        return r.read()
owner, repo, branch, subpath = parse_tree(url)
owner, repo, branch, subpath
def list_dir_via_api(owner: str, repo: str, branch: str, subpath: str):
    api = f"https://api.github.com/repos/{owner}/{repo}/contents/{subpath}?ref={branch}"
    data = http_get(api)
    arr = json.loads(data.decode("utf-8", "ignore"))
    if isinstance(arr, dict) and arr.get("type") == "file":
        return [arr]
    # 只列当前目录(不递归)
    return [it for it in arr if it.get("type") == "file"]
items = list_dir_via_api(owner, repo, branch, subpath)
items
from urllib.parse import urlparse, quote
from urllib.request import Request, urlopen

def to_raw_github(url: str) -> str:
    if url.startswith("https://raw.githubusercontent.com/"):
        return url
    if "github.com" in url and "/blob/" in url:
        p = urlparse(url)
        parts = [x for x in p.path.split("/") if x]
        # /owner/repo/blob/branch/path/to/file
        if len(parts) >= 5 and parts[2] == "blob":
            owner, repo, _, branch, *rest = parts
            rest_enc = "/".join(quote(seg) for seg in rest)
            return f"https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{rest_enc}"
    return url  # 其他链接原样返回(或按需抛错)

def http_get(url: str, timeout: int = 60) -> bytes:
    raw = to_raw_github(url)
    req = Request(raw, headers={"User-Agent": "mini-downloader/1.0"})
    with urlopen(req, timeout=timeout) as r:
        return r.read()

# 用法:
# data = http_get("https://github.com/.../blob/.../file.txt")
# with open("file.txt","wb") as f: f.write(data)
url = "https://github.com/location-competition/indoor-location-competition-20/tree/master/data/site1/F2"
r = http_get(url)
r
arr = json.loads(r.decode("utf-8", "ignore"))
arr
def list_tree_recursive(owner, repo, branch, prefix=""):
    api = f"https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1"
    with urlopen(Request(api)) as r:
        data = json.loads(r.read().decode("utf-8","ignore"))
    out = []
    for node in data.get("tree", []):
        if node.get("type")=="blob":
            path = node["path"]
            if not prefix or path==prefix or path.startswith(prefix.rstrip("/")+"/"):
                out.append(path)
    return out
def parse_tree(url: str):
    p = urlparse(url)
    parts = [x for x in p.path.strip("/").split("/") if x]
    assert len(parts)>=4 and parts[2]=="tree", "不是 /tree/ 目录链接"
    owner, repo, branch = parts[0], parts[1], parts[3]
    subpath = "/".join(parts[4:]) if len(parts)>4 else ""
    return owner, repo, branch, subpath
def to_raw_from_parts(owner, repo, branch, path):
    return f"https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{path}"

# 用法:
# paths = list_tree_recursive(owner,repo,branch,"data/site1/B1/path_data_files")
# for p in paths:
#     raw = to_raw_from_parts(owner,repo,branch,p)
#     ...
owner, repo, branch, subpath = parse_tree(url)
owner, repo, branch, subpath
items = list_tree_recursive(owner, repo, branch, subpath)
items
api = f"https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1"
with urlopen(Request(api)) as r:
    data = json.loads(r.read().decode("utf-8","ignore"))
data
out = []
prefix = subpath
for node in data.get("tree", []):
    print(node)
    if node.get("type")=="blob":
        path = node["path"]
        if not prefix or path==prefix or path.startswith(prefix.rstrip("/")+"/"):
            out.append(path)
out

由脚本自动从 Colab .ipynb 整理为 Hexo 友好 Markdown。资源(若有)位于 md_assets/。