
✨道路是曲折的,前途是光明的!
📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记!
🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流!

📊 目录
- 为什么选择Python+AI
- AI技术领域分布
- 完整学习路径
- 分阶段学习指南
- 实战代码示例
- 学习资源推荐
- 常见问题解答
为什么选择Python+AI?
Python已成为人工智能领域最主流的编程语言,根据Stack Overflow 2024年开发者调查,Python在AI/ML领域的使用率超过85%。

Python在AI领域的优势
| 🐍 语法简洁 | 上手快,专注算法本身而非语法细节 |
| 📦 生态丰富 | NumPy、Pandas、PyTorch等成熟库 |
| 👥 社区活跃 | 海量教程、开源项目和问题解答 |
| 🔧 工具完善 | Jupyter、Colab等优秀开发环境 |
| 🚀 部署便捷 | Flask/FastAPI快速构建AI服务 |
AI技术领域分布
了解AI各领域的占比,帮助你更好地规划学习重点:
#mermaid-svg-5XhBr3gvYzWhOtQe{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5XhBr3gvYzWhOtQe .error-icon{fill:#552222;}#mermaid-svg-5XhBr3gvYzWhOtQe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5XhBr3gvYzWhOtQe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5XhBr3gvYzWhOtQe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5XhBr3gvYzWhOtQe .marker.cross{stroke:#333333;}#mermaid-svg-5XhBr3gvYzWhOtQe svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5XhBr3gvYzWhOtQe p{margin:0;}#mermaid-svg-5XhBr3gvYzWhOtQe .pieCircle{stroke:#000000;stroke-width:2px;opacity:0.7;}#mermaid-svg-5XhBr3gvYzWhOtQe .pieOuterCircle{stroke:#000000;stroke-width:1px;fill:none;}#mermaid-svg-5XhBr3gvYzWhOtQe .pieTitleText{text-anchor:middle;font-size:25px;fill:#000000;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-5XhBr3gvYzWhOtQe .slice{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;fill:#000000;font-size:17px;}#mermaid-svg-5XhBr3gvYzWhOtQe .legend text{fill:#000000;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:17px;}#mermaid-svg-5XhBr3gvYzWhOtQe :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
35%
30%
15%
12%
5%
3%
2025年AI技术领域市场需求分布
机器学习 [35]
深度学习 [30]
自然语言处理 [15]
计算机视觉 [12]
强化学习 [5]
其他 [3]
完整学习路径
下图展示了从零基础到AI专家的完整学习路线:
#mermaid-svg-KlaPCoSzX2BjkCjL{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KlaPCoSzX2BjkCjL .error-icon{fill:#552222;}#mermaid-svg-KlaPCoSzX2BjkCjL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KlaPCoSzX2BjkCjL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KlaPCoSzX2BjkCjL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KlaPCoSzX2BjkCjL .marker.cross{stroke:#333333;}#mermaid-svg-KlaPCoSzX2BjkCjL svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KlaPCoSzX2BjkCjL p{margin:0;}#mermaid-svg-KlaPCoSzX2BjkCjL .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster-label text{fill:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster-label span{color:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster-label span p{background-color:transparent;}#mermaid-svg-KlaPCoSzX2BjkCjL .label text,#mermaid-svg-KlaPCoSzX2BjkCjL span{fill:#333;color:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL .node rect,#mermaid-svg-KlaPCoSzX2BjkCjL .node circle,#mermaid-svg-KlaPCoSzX2BjkCjL .node ellipse,#mermaid-svg-KlaPCoSzX2BjkCjL .node polygon,#mermaid-svg-KlaPCoSzX2BjkCjL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KlaPCoSzX2BjkCjL .rough-node .label text,#mermaid-svg-KlaPCoSzX2BjkCjL .node .label text,#mermaid-svg-KlaPCoSzX2BjkCjL .image-shape .label,#mermaid-svg-KlaPCoSzX2BjkCjL .icon-shape .label{text-anchor:middle;}#mermaid-svg-KlaPCoSzX2BjkCjL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KlaPCoSzX2BjkCjL .rough-node .label,#mermaid-svg-KlaPCoSzX2BjkCjL .node .label,#mermaid-svg-KlaPCoSzX2BjkCjL .image-shape .label,#mermaid-svg-KlaPCoSzX2BjkCjL .icon-shape .label{text-align:center;}#mermaid-svg-KlaPCoSzX2BjkCjL .node.clickable{cursor:pointer;}#mermaid-svg-KlaPCoSzX2BjkCjL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KlaPCoSzX2BjkCjL .arrowheadPath{fill:#333333;}#mermaid-svg-KlaPCoSzX2BjkCjL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KlaPCoSzX2BjkCjL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KlaPCoSzX2BjkCjL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KlaPCoSzX2BjkCjL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KlaPCoSzX2BjkCjL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KlaPCoSzX2BjkCjL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster text{fill:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL .cluster span{color:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KlaPCoSzX2BjkCjL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KlaPCoSzX2BjkCjL rect.text{fill:none;stroke-width:0;}#mermaid-svg-KlaPCoSzX2BjkCjL .icon-shape,#mermaid-svg-KlaPCoSzX2BjkCjL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KlaPCoSzX2BjkCjL .icon-shape p,#mermaid-svg-KlaPCoSzX2BjkCjL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KlaPCoSzX2BjkCjL .icon-shape rect,#mermaid-svg-KlaPCoSzX2BjkCjL .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KlaPCoSzX2BjkCjL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KlaPCoSzX2BjkCjL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KlaPCoSzX2BjkCjL :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
否
是
NLP
CV
通用
开始学习Python+AI
有编程基础?
阶段0: Python基础
阶段1: 数据科学基础
Python语法
数据结构
函数与模块
面向对象
NumPy数组操作
Pandas数据处理
Matplotlib可视化
阶段2: 机器学习
Scikit-learn
监督学习
无监督学习
模型评估
选择方向
阶段3a: NLP
阶段3b: 计算机视觉
阶段3c: 深度学习通用
Transformers
LLM应用
RAG开发
CNN架构
目标检测
图像生成
PyTorch基础
神经网络
模型优化
阶段4: 实战项目
端到端项目
模型部署
性能优化
🎉 AI工程师
分阶段学习指南
🟢 阶段0:Python基础(2-4周)
学习目标:掌握Python核心语法和编程思维
核心知识点
#mermaid-svg-5mpM3ZvFyi1jmtFI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5mpM3ZvFyi1jmtFI .error-icon{fill:#552222;}#mermaid-svg-5mpM3ZvFyi1jmtFI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5mpM3ZvFyi1jmtFI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .marker.cross{stroke:#333333;}#mermaid-svg-5mpM3ZvFyi1jmtFI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5mpM3ZvFyi1jmtFI p{margin:0;}#mermaid-svg-5mpM3ZvFyi1jmtFI .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster-label text{fill:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster-label span{color:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster-label span p{background-color:transparent;}#mermaid-svg-5mpM3ZvFyi1jmtFI .label text,#mermaid-svg-5mpM3ZvFyi1jmtFI span{fill:#333;color:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .node rect,#mermaid-svg-5mpM3ZvFyi1jmtFI .node circle,#mermaid-svg-5mpM3ZvFyi1jmtFI .node ellipse,#mermaid-svg-5mpM3ZvFyi1jmtFI .node polygon,#mermaid-svg-5mpM3ZvFyi1jmtFI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .rough-node .label text,#mermaid-svg-5mpM3ZvFyi1jmtFI .node .label text,#mermaid-svg-5mpM3ZvFyi1jmtFI .image-shape .label,#mermaid-svg-5mpM3ZvFyi1jmtFI .icon-shape .label{text-anchor:middle;}#mermaid-svg-5mpM3ZvFyi1jmtFI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .rough-node .label,#mermaid-svg-5mpM3ZvFyi1jmtFI .node .label,#mermaid-svg-5mpM3ZvFyi1jmtFI .image-shape .label,#mermaid-svg-5mpM3ZvFyi1jmtFI .icon-shape .label{text-align:center;}#mermaid-svg-5mpM3ZvFyi1jmtFI .node.clickable{cursor:pointer;}#mermaid-svg-5mpM3ZvFyi1jmtFI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .arrowheadPath{fill:#333333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5mpM3ZvFyi1jmtFI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5mpM3ZvFyi1jmtFI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5mpM3ZvFyi1jmtFI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster text{fill:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI .cluster span{color:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5mpM3ZvFyi1jmtFI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5mpM3ZvFyi1jmtFI rect.text{fill:none;stroke-width:0;}#mermaid-svg-5mpM3ZvFyi1jmtFI .icon-shape,#mermaid-svg-5mpM3ZvFyi1jmtFI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5mpM3ZvFyi1jmtFI .icon-shape p,#mermaid-svg-5mpM3ZvFyi1jmtFI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5mpM3ZvFyi1jmtFI .icon-shape rect,#mermaid-svg-5mpM3ZvFyi1jmtFI .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5mpM3ZvFyi1jmtFI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5mpM3ZvFyi1jmtFI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5mpM3ZvFyi1jmtFI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Python基础
数据类型
控制流程
函数
面向对象
文件操作
异常处理
int, float, str
list, dict, tuple, set
if/else
for/while循环
函数定义
lambda表达式
装饰器基础
类与对象
继承与多态
必学代码示例
示例1:列表推导式
# 传统方式
squares = []
for i in range(10):
squares.append(i ** 2)
# Pythonic方式
squares = [i ** 2 for i in range(10)]
# 带条件的列表推导式
even_squares = [i ** 2 for i in range(10) if i % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
示例2:字典操作
# 字典推导式
word_count = "hello world hello python"
counts = {word: word_count.split().count(word)
for word in set(word_count.split())}
print(counts) # {'hello': 2, 'world': 1, 'python': 1}
# defaultdict使用
from collections import defaultdict
counts = defaultdict(int)
for word in word_count.split():
counts[word] += 1
示例3:上下文管理器
# 正确的文件操作方式
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 自动关闭文件,即使发生异常
# 自定义上下文管理器
from contextlib import contextmanager
@contextmanager
def timer():
import time
start = time.time()
yield
print(f"耗时: {time.time() – start:.2f}秒")
with timer():
sum(range(1000000))
🔵 阶段1:数据科学基础(4-6周)
学习目标:掌握数据处理、分析和可视化技能
核心技能树
#mermaid-svg-xH6U7cMjrBbYUcSB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xH6U7cMjrBbYUcSB .error-icon{fill:#552222;}#mermaid-svg-xH6U7cMjrBbYUcSB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xH6U7cMjrBbYUcSB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xH6U7cMjrBbYUcSB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xH6U7cMjrBbYUcSB .marker.cross{stroke:#333333;}#mermaid-svg-xH6U7cMjrBbYUcSB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xH6U7cMjrBbYUcSB p{margin:0;}#mermaid-svg-xH6U7cMjrBbYUcSB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster-label text{fill:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster-label span{color:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster-label span p{background-color:transparent;}#mermaid-svg-xH6U7cMjrBbYUcSB .label text,#mermaid-svg-xH6U7cMjrBbYUcSB span{fill:#333;color:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB .node rect,#mermaid-svg-xH6U7cMjrBbYUcSB .node circle,#mermaid-svg-xH6U7cMjrBbYUcSB .node ellipse,#mermaid-svg-xH6U7cMjrBbYUcSB .node polygon,#mermaid-svg-xH6U7cMjrBbYUcSB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xH6U7cMjrBbYUcSB .rough-node .label text,#mermaid-svg-xH6U7cMjrBbYUcSB .node .label text,#mermaid-svg-xH6U7cMjrBbYUcSB .image-shape .label,#mermaid-svg-xH6U7cMjrBbYUcSB .icon-shape .label{text-anchor:middle;}#mermaid-svg-xH6U7cMjrBbYUcSB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xH6U7cMjrBbYUcSB .rough-node .label,#mermaid-svg-xH6U7cMjrBbYUcSB .node .label,#mermaid-svg-xH6U7cMjrBbYUcSB .image-shape .label,#mermaid-svg-xH6U7cMjrBbYUcSB .icon-shape .label{text-align:center;}#mermaid-svg-xH6U7cMjrBbYUcSB .node.clickable{cursor:pointer;}#mermaid-svg-xH6U7cMjrBbYUcSB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xH6U7cMjrBbYUcSB .arrowheadPath{fill:#333333;}#mermaid-svg-xH6U7cMjrBbYUcSB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xH6U7cMjrBbYUcSB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xH6U7cMjrBbYUcSB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xH6U7cMjrBbYUcSB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xH6U7cMjrBbYUcSB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xH6U7cMjrBbYUcSB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster text{fill:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB .cluster span{color:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xH6U7cMjrBbYUcSB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xH6U7cMjrBbYUcSB rect.text{fill:none;stroke-width:0;}#mermaid-svg-xH6U7cMjrBbYUcSB .icon-shape,#mermaid-svg-xH6U7cMjrBbYUcSB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xH6U7cMjrBbYUcSB .icon-shape p,#mermaid-svg-xH6U7cMjrBbYUcSB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xH6U7cMjrBbYUcSB .icon-shape rect,#mermaid-svg-xH6U7cMjrBbYUcSB .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xH6U7cMjrBbYUcSB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xH6U7cMjrBbYUcSB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xH6U7cMjrBbYUcSB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
数据科学基础
NumPy
Pandas
可视化
数组创建
数组运算
广播机制
线性代数
Series操作
DataFrame操作
数据清洗
数据分组
数据合并
Matplotlib
Seaborn
Plotly
NumPy实战代码
import numpy as np
# 数组创建
arr = np.array([[1, 2, 3], [4, 5, 6]])
zeros = np.zeros((3, 4))
random = np.random.randn(3, 3)
# 数组运算
print(arr * 2) # 元素级乘法
print(arr @ arr.T) # 矩阵乘法
print(np.dot(arr, arr.T)) # 矩阵乘法
# 广播机制
a = np.array([[1, 2, 3], [4, 5, 6]]) # (2, 3)
b = np.array([10, 20, 30]) # (3,)
print(a + b) # b广播到(2, 3)
# 实用函数
print(np.mean(arr, axis=1)) # 按行求均值
print(np.argmax(arr, axis=1)) # 按行找最大值索引
Pandas数据处理实战
import pandas as pd
# 创建DataFrame
data = {
'name': ['张三', '李四', '王五', '赵六'],
'age': [25, 30, 35, 28],
'city': ['北京', '上海', '深圳', '杭州'],
'salary': [15000, 20000, 25000, 18000]
}
df = pd.DataFrame(data)
# 数据筛选
high_salary = df[df['salary'] > 18000]
beijing = df[df['city'] == '北京']
# 数据分组
city_stats = df.groupby('city').agg({
'salary': ['mean', 'max', 'count']
})
# 数据排序
df_sorted = df.sort_values('salary', ascending=False)
# 数据合并
df2 = pd.DataFrame({
'name': ['张三', '李四'],
'department': ['技术', '产品']
})
merged = pd.merge(df, df2, on='name', how='left')
print(city_stats)
数据可视化示例
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 柱状图
axes[0, 0].bar(df['name'], df['salary'])
axes[0, 0].set_title('薪资对比')
axes[0, 0].set_xlabel('姓名')
axes[0, 0].set_ylabel('薪资')
# 2. 散点图
axes[0, 1].scatter(df['age'], df['salary'], s=100, alpha=0.6)
axes[0, 1].set_title('年龄与薪资关系')
axes[0, 1].set_xlabel('年龄')
axes[0, 1].set_ylabel('薪资')
# 3. 饼图(城市分布)
city_counts = df['city'].value_counts()
axes[1, 0].pie(city_counts, labels=city_counts.index, autopct='%1.1f%%')
axes[1, 0].set_title('城市分布')
# 4. 箱线图
axes[1, 1].boxplot(df['salary'])
axes[1, 1].set_title('薪资分布')
plt.tight_layout()
plt.savefig('visualization.png', dpi=300)
plt.show()
🟡 阶段2:机器学习(6-8周)
学习目标:理解ML原理,掌握Scikit-learn实战
ML算法分类图
#mermaid-svg-BWkT98sy1bqJ38GE{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BWkT98sy1bqJ38GE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BWkT98sy1bqJ38GE .error-icon{fill:#552222;}#mermaid-svg-BWkT98sy1bqJ38GE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BWkT98sy1bqJ38GE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BWkT98sy1bqJ38GE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BWkT98sy1bqJ38GE .marker.cross{stroke:#333333;}#mermaid-svg-BWkT98sy1bqJ38GE svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BWkT98sy1bqJ38GE p{margin:0;}#mermaid-svg-BWkT98sy1bqJ38GE .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-BWkT98sy1bqJ38GE .cluster-label text{fill:#333;}#mermaid-svg-BWkT98sy1bqJ38GE .cluster-label span{color:#333;}#mermaid-svg-BWkT98sy1bqJ38GE .cluster-label span p{background-color:transparent;}#mermaid-svg-BWkT98sy1bqJ38GE .label text,#mermaid-svg-BWkT98sy1bqJ38GE span{fill:#333;color:#333;}#mermaid-svg-BWkT98sy1bqJ38GE .node rect,#mermaid-svg-BWkT98sy1bqJ38GE .node circle,#mermaid-svg-BWkT98sy1bqJ38GE .node ellipse,#mermaid-svg-BWkT98sy1bqJ38GE .node polygon,#mermaid-svg-BWkT98sy1bqJ38GE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BWkT98sy1bqJ38GE .rough-node .label text,#mermaid-svg-BWkT98sy1bqJ38GE .node .label text,#mermaid-svg-BWkT98sy1bqJ38GE .image-shape .label,#mermaid-svg-BWkT98sy1bqJ38GE .icon-shape .label{text-anchor:middle;}#mermaid-svg-BWkT98sy1bqJ38GE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BWkT98sy1bqJ38GE .rough-node .label,#mermaid-svg-BWkT98sy1bqJ38GE .node .label,#mermaid-svg-BWkT98sy1bqJ38GE .image-shape .label,#mermaid-svg-BWkT98sy1bqJ38GE .icon-shape .label{text-align:center;}#mermaid-svg-BWkT98sy1bqJ38GE .node.clickable{cursor:pointer;}#mermaid-svg-BWkT98sy1bqJ38GE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BWkT98sy1bqJ38GE .arrowheadPath{fill:#333333;}#mermaid-svg-BWkT98sy1bqJ38GE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BWkT98sy1bqJ38GE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BWkT98sy1bqJ38GE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BWkT98sy1bqJ38GE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BWkT98sy1bqJ38GE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BWkT98sy1bqJ38GE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BWkT98sy1bqJ38GE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BWkT98sy1bqJ38GE .cluster text{fill:#333;}#mermaid-svg-BWkT98sy1bqJ38GE .cluster span{color:#333;}#mermaid-svg-BWkT98sy1bqJ38GE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BWkT98sy1bqJ38GE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BWkT98sy1bqJ38GE rect.text{fill:none;stroke-width:0;}#mermaid-svg-BWkT98sy1bqJ38GE .icon-shape,#mermaid-svg-BWkT98sy1bqJ38GE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BWkT98sy1bqJ38GE .icon-shape p,#mermaid-svg-BWkT98sy1bqJ38GE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BWkT98sy1bqJ38GE .icon-shape rect,#mermaid-svg-BWkT98sy1bqJ38GE .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BWkT98sy1bqJ38GE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BWkT98sy1bqJ38GE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BWkT98sy1bqJ38GE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
机器学习
监督学习
无监督学习
强化学习
回归
分类
线性回归
决策树回归
随机森林回归
梯度提升回归
逻辑回归
SVM
决策树
随机森林
XGBoost
神经网络
聚类
降维
K-Means
DBSCAN
层次聚类
PCA
t-SNE
UMAP
经典算法实现
1. 线性回归完整流程
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
# 生成模拟数据
np.random.seed(42)
n_samples = 1000
# 特征:面积、房间数、房龄
X = np.random.randn(n_samples, 3)
X[:, 0] = X[:, 0] * 50 + 100 # 面积:50-150㎡
X[:, 1] = np.abs(X[:, 1]) * 2 + 1 # 房间数:1-5间
X[:, 2] = np.abs(X[:, 2]) * 10 + 1 # 房龄:1-30年
# 真实价格 = 面积*1000 + 房间数*50000 – 房龄*2000 + 噪声
y = (X[:, 0] * 1000 + X[:, 1] * 50000 – X[:, 2] * 2000 +
np.random.randn(n_samples) * 50000)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 训练模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)
# 预测
y_pred = model.predict(X_test_scaled)
# 评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差 MSE: {mse:.2f}")
print(f"决定系数 R²: {r2:.4f}")
print(f"系数: {model.coef_}")
print(f"截距: {model.intercept_:.2f}")
# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r–', lw=2)
plt.xlabel('真实价格')
plt.ylabel('预测价格')
plt.title('房价预测:真实值 vs 预测值')
plt.grid(True, alpha=0.3)
plt.show()
2. 分类算法对比
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
# 生成分类数据
X, y = make_classification(
n_samples=1000, n_features=20, n_informative=15,
n_redundant=5, n_classes=3, random_state=42
)
# 定义模型
models = {
'逻辑回归': LogisticRegression(max_iter=1000),
'SVM': SVC(),
'决策树': DecisionTreeClassifier(),
'随机森林': RandomForestClassifier(n_estimators=100),
'朴素贝叶斯': GaussianNB(),
'KNN': KNeighborsClassifier()
}
# 交叉验证评估
results = {}
for name, model in models.items():
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
results[name] = {
'mean': scores.mean(),
'std': scores.std()
}
print(f"{name}: {scores.mean():.4f} (+/- {scores.std():.4f})")
# 可视化对比
plt.figure(figsize=(12, 6))
names = list(results.keys())
means = [results[name]['mean'] for name in names]
stds = [results[name]['std'] for name in names]
plt.bar(names, means, yerr=stds, alpha=0.8, capsize=5)
plt.ylabel('准确率')
plt.title('不同分类算法性能对比(5折交叉验证)')
plt.ylim(0.7, 1.0)
plt.grid(axis='y', alpha=0.3)
plt.xticks(rotation=15)
plt.show()
3. 聚类算法实现
from sklearn.cluster import KMeans, DBSCAN
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
# 生成聚类数据
X, _ = make_blobs(
n_samples=500, centers=4, cluster_std=1.5,
random_state=42
)
# K-Means聚类(需要指定簇数)
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
kmeans_labels = kmeans.fit_predict(X)
kmeans_silhouette = silhouette_score(X, kmeans_labels)
# DBSCAN聚类(自动发现簇数)
dbscan = DBSCAN(eps=1.5, min_samples=10)
dbscan_labels = dbscan.fit_predict(X)
n_clusters = len(set(dbscan_labels)) – (1 if –1 in dbscan_labels else 0)
print(f"K-Means: 发现4个簇, 轮廓系数={kmeans_silhouette:.3f}")
print(f"DBSCAN: 发现{n_clusters}个簇")
# 肘部法则确定最佳K值
inertias = []
K_range = range(2, 11)
for K in K_range:
kmeans = KMeans(n_clusters=K, random_state=42, n_init=10)
kmeans.fit(X)
inertias.append(kmeans.inertia_)
plt.figure(figsize=(12, 5))
# 肘部图
plt.subplot(1, 2, 1)
plt.plot(K_range, inertias, 'bo-')
plt.xlabel('K值')
plt.ylabel('惯性(Inertia)')
plt.title('肘部法则确定最佳K值')
plt.grid(True, alpha=0.3)
# 聚类结果可视化
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=kmeans_labels, cmap='viridis', alpha=0.6)
plt.scatter(kmeans.cluster_centers_[:, 0],
kmeans.cluster_centers_[:, 1],
c='red', s=200, marker='X', label='质心')
plt.title('K-Means聚类结果')
plt.legend()
plt.tight_layout()
plt.show()
🟠 阶段3:深度学习(8-12周)
学习目标:掌握PyTorch,理解深度学习原理
深度学习框架选择
#mermaid-svg-rECxYaUTqAA2L6Ba{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rECxYaUTqAA2L6Ba .error-icon{fill:#552222;}#mermaid-svg-rECxYaUTqAA2L6Ba .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rECxYaUTqAA2L6Ba .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rECxYaUTqAA2L6Ba .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rECxYaUTqAA2L6Ba .marker.cross{stroke:#333333;}#mermaid-svg-rECxYaUTqAA2L6Ba svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rECxYaUTqAA2L6Ba p{margin:0;}#mermaid-svg-rECxYaUTqAA2L6Ba .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster-label text{fill:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster-label span{color:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster-label span p{background-color:transparent;}#mermaid-svg-rECxYaUTqAA2L6Ba .label text,#mermaid-svg-rECxYaUTqAA2L6Ba span{fill:#333;color:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba .node rect,#mermaid-svg-rECxYaUTqAA2L6Ba .node circle,#mermaid-svg-rECxYaUTqAA2L6Ba .node ellipse,#mermaid-svg-rECxYaUTqAA2L6Ba .node polygon,#mermaid-svg-rECxYaUTqAA2L6Ba .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rECxYaUTqAA2L6Ba .rough-node .label text,#mermaid-svg-rECxYaUTqAA2L6Ba .node .label text,#mermaid-svg-rECxYaUTqAA2L6Ba .image-shape .label,#mermaid-svg-rECxYaUTqAA2L6Ba .icon-shape .label{text-anchor:middle;}#mermaid-svg-rECxYaUTqAA2L6Ba .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rECxYaUTqAA2L6Ba .rough-node .label,#mermaid-svg-rECxYaUTqAA2L6Ba .node .label,#mermaid-svg-rECxYaUTqAA2L6Ba .image-shape .label,#mermaid-svg-rECxYaUTqAA2L6Ba .icon-shape .label{text-align:center;}#mermaid-svg-rECxYaUTqAA2L6Ba .node.clickable{cursor:pointer;}#mermaid-svg-rECxYaUTqAA2L6Ba .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rECxYaUTqAA2L6Ba .arrowheadPath{fill:#333333;}#mermaid-svg-rECxYaUTqAA2L6Ba .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rECxYaUTqAA2L6Ba .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rECxYaUTqAA2L6Ba .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rECxYaUTqAA2L6Ba .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rECxYaUTqAA2L6Ba .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rECxYaUTqAA2L6Ba .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster text{fill:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba .cluster span{color:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rECxYaUTqAA2L6Ba .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rECxYaUTqAA2L6Ba rect.text{fill:none;stroke-width:0;}#mermaid-svg-rECxYaUTqAA2L6Ba .icon-shape,#mermaid-svg-rECxYaUTqAA2L6Ba .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rECxYaUTqAA2L6Ba .icon-shape p,#mermaid-svg-rECxYaUTqAA2L6Ba .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rECxYaUTqAA2L6Ba .icon-shape rect,#mermaid-svg-rECxYaUTqAA2L6Ba .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rECxYaUTqAA2L6Ba .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rECxYaUTqAA2L6Ba .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rECxYaUTqAA2L6Ba :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
深度学习框架
PyTorch
TensorFlow
JAX
研究首选
动态图
Python原生风格
工业部署
TF-Serving
TFLite移动端
函数式编程
自动微分
高性能计算
PyTorch实战代码
1. 构建神经网络
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import matplotlib.pyplot as plt
# 检查CUDA可用性
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")
# 定义神经网络
class NeuralNetwork(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(NeuralNetwork, self).__init__()
self.layer1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.layer2 = nn.Linear(hidden_size, hidden_size // 2)
self.layer3 = nn.Linear(hidden_size // 2, num_classes)
self.dropout = nn.Dropout(0.2)
def forward(self, x):
out = self.layer1(x)
out = self.relu(out)
out = self.dropout(out)
out = self.layer2(out)
out = self.relu(out)
out = self.dropout(out)
out = self.layer3(out)
return out
# 超参数
input_size = 784 # MNIST图像28×28
hidden_size = 256
num_classes = 10
num_epochs = 10
batch_size = 100
learning_rate = 0.001
# 初始化模型
model = NeuralNetwork(input_size, hidden_size, num_classes).to(device)
# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# 模拟数据
X_train = torch.randn(1000, input_size).to(device)
y_train = torch.randint(0, num_classes, (1000,)).to(device)
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
# 训练循环
train_losses = []
for epoch in range(num_epochs):
model.train()
epoch_loss = 0
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
epoch_loss += loss.item()
avg_loss = epoch_loss / len(train_loader)
train_losses.append(avg_loss)
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}')
# 绘制训练曲线
plt.figure(figsize=(10, 5))
plt.plot(train_losses, marker='o')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('训练损失曲线')
plt.grid(True, alpha=0.3)
plt.show()
2. CNN图像分类
import torch
import torch.nn as nn
import torch.nn.functional as F
class CNN(nn.Module):
def __init__(self, num_classes=10):
super(CNN, self).__init__()
# 第一个卷积块
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
self.bn1 = nn.BatchNorm2d(32)
self.conv2 = nn.Conv2d(32, 32, kernel_size=3, padding=1)
self.bn2 = nn.BatchNorm2d(32)
self.pool1 = nn.MaxPool2d(2, 2)
# 第二个卷积块
self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.bn3 = nn.BatchNorm2d(64)
self.conv4 = nn.Conv2d(64, 64, kernel_size=3, padding=1)
self.bn4 = nn.BatchNorm2d(64)
self.pool2 = nn.MaxPool2d(2, 2)
# 全连接层
self.fc1 = nn.Linear(64 * 7 * 7, 256)
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(256, num_classes)
def forward(self, x):
# 第一个卷积块
x = F.relu(self.bn1(self.conv1(x)))
x = F.relu(self.bn2(self.conv2(x)))
x = self.pool1(x)
# 第二个卷积块
x = F.relu(self.bn3(self.conv3(x)))
x = F.relu(self.bn4(self.conv4(x)))
x = self.pool2(x)
# 展平
x = x.view(–1, 64 * 7 * 7)
# 全连接层
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
# 模型结构可视化
model = CNN()
print(model)
# 统计参数量
total_params = sum(p.numel() for p in model.parameters())
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"总参数量: {total_params:,}")
print(f"可训练参数量: {trainable_params:,}")
3. Transformer注意力机制
import torch
import torch.nn as nn
import math
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super(MultiHeadAttention, self).__init__()
assert d_model % num_heads == 0
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
def scaled_dot_product_attention(self, Q, K, V, mask=None):
scores = torch.matmul(Q, K.transpose(–2, –1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, –1e9)
attention_weights = F.softmax(scores, dim=–1)
output = torch.matmul(attention_weights, V)
return output, attention_weights
def forward(self, query, key, value, mask=None):
batch_size = query.size(0)
# 线性变换并分割成多头
Q = self.W_q(query).view(batch_size, –1, self.num_heads, self.d_k).transpose(1, 2)
K = self.W_k(key).view(batch_size, –1, self.num_heads, self.d_k).transpose(1, 2)
V = self.W_v(value).view(batch_size, –1, self.num_heads, self.d_k).transpose(1, 2)
# 计算注意力
x, attention_weights = self.scaled_dot_product_attention(Q, K, V, mask)
# 拼接多头
x = x.transpose(1, 2).contiguous().view(batch_size, –1, self.d_model)
# 最终线性变换
output = self.W_o(x)
return output, attention_weights
# 使用示例
d_model = 512
num_heads = 8
seq_length = 10
batch_size = 4
# 创建模拟输入
x = torch.randn(batch_size, seq_length, d_model)
# 创建注意力层
mha = MultiHeadAttention(d_model, num_heads)
output, attention = mha(x, x, x)
print(f"输入形状: {x.shape}")
print(f"输出形状: {output.shape}")
print(f"注意力权重形状: {attention.shape}")
🔴 阶段4:NLP与LLM应用(6-8周)
学习目标:掌握现代NLP技术,熟练使用大语言模型
NLP技术发展时间线
#mermaid-svg-etm2yF6o5ZMRIe1q{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-etm2yF6o5ZMRIe1q .error-icon{fill:#552222;}#mermaid-svg-etm2yF6o5ZMRIe1q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-etm2yF6o5ZMRIe1q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-etm2yF6o5ZMRIe1q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-etm2yF6o5ZMRIe1q .marker.cross{stroke:#333333;}#mermaid-svg-etm2yF6o5ZMRIe1q svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-etm2yF6o5ZMRIe1q p{margin:0;}#mermaid-svg-etm2yF6o5ZMRIe1q .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster-label text{fill:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster-label span{color:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster-label span p{background-color:transparent;}#mermaid-svg-etm2yF6o5ZMRIe1q .label text,#mermaid-svg-etm2yF6o5ZMRIe1q span{fill:#333;color:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q .node rect,#mermaid-svg-etm2yF6o5ZMRIe1q .node circle,#mermaid-svg-etm2yF6o5ZMRIe1q .node ellipse,#mermaid-svg-etm2yF6o5ZMRIe1q .node polygon,#mermaid-svg-etm2yF6o5ZMRIe1q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-etm2yF6o5ZMRIe1q .rough-node .label text,#mermaid-svg-etm2yF6o5ZMRIe1q .node .label text,#mermaid-svg-etm2yF6o5ZMRIe1q .image-shape .label,#mermaid-svg-etm2yF6o5ZMRIe1q .icon-shape .label{text-anchor:middle;}#mermaid-svg-etm2yF6o5ZMRIe1q .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-etm2yF6o5ZMRIe1q .rough-node .label,#mermaid-svg-etm2yF6o5ZMRIe1q .node .label,#mermaid-svg-etm2yF6o5ZMRIe1q .image-shape .label,#mermaid-svg-etm2yF6o5ZMRIe1q .icon-shape .label{text-align:center;}#mermaid-svg-etm2yF6o5ZMRIe1q .node.clickable{cursor:pointer;}#mermaid-svg-etm2yF6o5ZMRIe1q .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-etm2yF6o5ZMRIe1q .arrowheadPath{fill:#333333;}#mermaid-svg-etm2yF6o5ZMRIe1q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-etm2yF6o5ZMRIe1q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-etm2yF6o5ZMRIe1q .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-etm2yF6o5ZMRIe1q .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-etm2yF6o5ZMRIe1q .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-etm2yF6o5ZMRIe1q .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster text{fill:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q .cluster span{color:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-etm2yF6o5ZMRIe1q .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-etm2yF6o5ZMRIe1q rect.text{fill:none;stroke-width:0;}#mermaid-svg-etm2yF6o5ZMRIe1q .icon-shape,#mermaid-svg-etm2yF6o5ZMRIe1q .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-etm2yF6o5ZMRIe1q .icon-shape p,#mermaid-svg-etm2yF6o5ZMRIe1q .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-etm2yF6o5ZMRIe1q .icon-shape rect,#mermaid-svg-etm2yF6o5ZMRIe1q .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-etm2yF6o5ZMRIe1q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-etm2yF6o5ZMRIe1q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-etm2yF6o5ZMRIe1q :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
2017Transformer
2018BERT/GPT
2019GPT-2
2020GPT-3
2022ChatGPT
2023GPT-4/Llama2
2024多模态大模型
Transformers实战
1. 使用预训练模型
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
import torch
# 情感分析
sentiment_pipeline = pipeline(
"sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english"
)
texts = [
"I love this product! It's amazing!",
"This is the worst experience ever.",
"It's okay, nothing special."
]
results = sentiment_pipeline(texts)
for text, result in zip(texts, results):
print(f"文本: {text}")
print(f"情感: {result['label']}, 置信度: {result['score']:.4f}\\n")
# 文本分类
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=3 # 正面、中性、负面
)
# 编码文本
text = "这家餐厅的菜品味道很好,服务也很周到!"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
# 预测
with torch.no_grad():
outputs = model(**inputs)
predictions = torch.nn.functional.softmax(outputs.logits, dim=–1)
predicted_class = torch.argmax(predictions).item()
labels = ["负面", "中性", "正面"]
print(f"预测类别: {labels[predicted_class]}")
print(f"置信度: {predictions[0][predicted_class]:.4f}")
2. RAG检索增强生成
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
# 1. 加载文档
loader = TextLoader('knowledge_base.txt')
documents = loader.load()
# 2. 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len
)
splits = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
vectorstore = FAISS.from_documents(splits, embeddings)
# 4. 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3}
)
# 5. 自定义提示模板
prompt_template = """使用以下上下文信息来回答问题。如果不知道答案,就说不知道,不要编造答案。
上下文信息:
{context}
问题: {question}
答案:"""
PROMPT = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"]
)
# 6. 创建QA链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": PROMPT}
)
# 7. 查询
query = "如何办理社保卡?"
result = qa_chain({"query": query})
print(f"问题: {query}")
print(f"答案: {result['result']}")
print("\\n参考文档:")
for doc in result['source_documents']:
print(f"- {doc.page_content[:100]}…")
3. 简单的ChatGLM对话示例
from transformers import AutoTokenizer, AutoModel
import torch
# 加载模型
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).half().cuda()
model = model.eval()
# 对话历史
history = []
response = "你好!我是智能助手小政,有什么可以帮助您的吗?"
print(f"助手: {response}")
while True:
user_input = input("\\n用户: ")
if user_input.lower() in ['退出', 'exit', 'quit']:
break
# 添加政务系统人设
system_prompt = "你是一个政务服务大厅的智能引导员,名叫'小政'。"
response, history = model.chat(
tokenizer,
f"{system_prompt}\\n用户: {user_input}",
history=history,
max_length=2048,
temperature=0.7
)
print(f"小政: {response}")
history.append((user_input, response))
🟣 阶段5:实战项目(持续进行)
项目推荐
| 房价预测 | ⭐⭐ | Pandas, Scikit-learn | 1周 |
| 图像分类 | ⭐⭐⭐ | PyTorch, CNN | 2周 |
| 情感分析 | ⭐⭐⭐ | Transformers, NLP | 2周 |
| 智能客服 | ⭐⭐⭐⭐ | LangChain, LLM | 3周 |
| RAG系统 | ⭐⭐⭐⭐⭐ | 向量数据库, Agent | 4周 |
端到端项目示例:智能文档问答系统
# project_structure.txt
"""
智能文档问答系统
│
├── data/ # 数据目录
│ ├── documents/ # 原始文档
│ └── vectorstore/ # 向量存储
│
├── src/ # 源代码
│ ├── config.py # 配置文件
│ ├── loader.py # 文档加载
│ ├── embeddings.py # 向量化
│ ├── retriever.py # 检索器
│ ├── generator.py # 生成器
│ └── api.py # API接口
│
├── app.py # 主应用
├── requirements.txt # 依赖
└── README.md # 说明文档
"""
# config.py
import os
from dataclasses import dataclass
from typing import Optional
@dataclass
class Config:
# API密钥
OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "")
# 模型配置
EMBEDDING_MODEL: str = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
LLM_MODEL: str = "gpt-3.5-turbo"
LLM_TEMPERATURE: float = 0.7
LLM_MAX_TOKENS: int = 1000
# 向量存储配置
CHUNK_SIZE: int = 500
CHUNK_OVERLAP: int = 50
VECTOR_DB_PATH: str = "data/vectorstore"
# 检索配置
TOP_K: int = 3
SIMILARITY_THRESHOLD: float = 0.7
# API配置
API_HOST: str = "0.0.0.0"
API_PORT: int = 8000
# loader.py
from typing import List
from langchain.document_loaders import (
TextLoader,
PyPDFLoader,
DirectoryLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document
class DocumentLoader:
def __init__(self, chunk_size: int = 500, chunk_overlap: int = 50):
self.text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
length_function=len,
separators=["\\n\\n", "\\n", "。", "!", "?", ".", "!", "?", " ", ""]
)
def load_text(self, file_path: str) –> List[Document]:
"""加载文本文件"""
loader = TextLoader(file_path, encoding='utf-8')
documents = loader.load()
return self.text_splitter.split_documents(documents)
def load_pdf(self, file_path: str) –> List[Document]:
"""加载PDF文件"""
loader = PyPDFLoader(file_path)
documents = loader.load()
return self.text_splitter.split_documents(documents)
def load_directory(self, directory: str, glob: str = "**/*.txt") –> List[Document]:
"""加载目录下的所有文档"""
loader = DirectoryLoader(directory, glob=glob)
documents = loader.load()
return self.text_splitter.split_documents(documents)
# api.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
import uvicorn
app = FastAPI(title="智能文档问答系统", version="1.0.0")
class QueryRequest(BaseModel):
question: str
top_k: Optional[int] = 3
class QueryResponse(BaseModel):
answer: str
sources: List[str]
confidence: float
@app.get("/")
async def root():
return {
"message": "智能文档问答系统API",
"version": "1.0.0",
"endpoints": {
"/query": "POST – 问答接口",
"/health": "GET – 健康检查"
}
}
@app.get("/health")
async def health_check():
return {"status": "healthy"}
@app.post("/query", response_model=QueryResponse)
async def query(request: QueryRequest):
try:
# 这里调用实际的问答逻辑
# result = qa_chain({"query": request.question})
return QueryResponse(
answer="这是示例回答",
sources=["来源1", "来源2"],
confidence=0.95
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(
"api:app",
host="0.0.0.0",
port=8000,
reload=True
)
实战代码示例
示例1:完整的机器学习项目
"""
项目:预测客户是否会购买理财产品
数据集:模拟银行客户数据
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve
from sklearn.pipeline import Pipeline
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# ========== 1. 数据生成 ==========
np.random.seed(42)
n_samples = 5000
data = {
'年龄': np.random.randint(18, 70, n_samples),
'收入': np.random.randint(3000, 50000, n_samples),
'存款': np.random.randint(0, 1000000, n_samples),
'债务': np.random.randint(0, 500000, n_samples),
'信用评分': np.random.randint(300, 850, n_samples),
'已购买产品数': np.random.randint(0, 10, n_samples),
'上次购买天数': np.random.randint(30, 3650, n_samples),
'职业': np.random.choice(['学生', '上班族', '个体户', '退休', '自由职业'], n_samples),
'婚姻状况': np.random.choice(['单身', '已婚', '离异'], n_samples),
'学历': np.random.choice(['高中', '本科', '硕士', '博士'], n_samples),
}
df = pd.DataFrame(data)
# 生成目标变量(基于特征组合)
def calc_purchase_prob(row):
score = 0
if 25 <= row['年龄'] <= 55:
score += 20
if row['收入'] > 15000:
score += 20
if row['存款'] > 100000:
score += 20
if row['信用评分'] > 650:
score += 15
if row['职业'] in ['上班族', '个体户']:
score += 15
return min(score + np.random.randint(–10, 10), 100) / 100
df['购买概率'] = df.apply(calc_purchase_prob, axis=1)
df['是否购买'] = (df['购买概率'] > 0.5).astype(int)
# ========== 2. 数据探索 ==========
print("=" * 50)
print("数据集基本信息")
print("=" * 50)
print(df.info())
print("\\n目标变量分布:")
print(df['是否购买'].value_counts())
print(f"购买率: {df['是否购买'].mean():.2%}")
# 可视化
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
# 年龄分布
axes[0, 0].hist(df[df['是否购买']==0]['年龄'], bins=30, alpha=0.5, label='未购买')
axes[0, 0].hist(df[df['是否购买']==1]['年龄'], bins=30, alpha=0.5, label='购买')
axes[0, 0].set_xlabel('年龄')
axes[0, 0].set_ylabel('人数')
axes[0, 0].legend()
axes[0, 0].set_title('年龄与购买关系')
# 收入分布
axes[0, 1].hist(df[df['是否购买']==0]['收入'], bins=30, alpha=0.5, label='未购买')
axes[0, 1].hist(df[df['是否购买']==1]['收入'], bins=30, alpha=0.5, label='购买')
axes[0, 1].set_xlabel('收入')
axes[0, 1].legend()
axes[0, 1].set_title('收入与购买关系')
# 信用评分分布
axes[0, 2].hist(df[df['是否购买']==0]['信用评分'], bins=30, alpha=0.5, label='未购买')
axes[0, 2].hist(df[df['是否购买']==1]['信用评分'], bins=30, alpha=0.5, label='购买')
axes[0, 2].set_xlabel('信用评分')
axes[0, 2].legend()
axes[0, 2].set_title('信用评分与购买关系')
# 职业分布
career_purchase = df.groupby('职业')['是否购买'].mean()
axes[1, 0].bar(career_purchase.index, career_purchase.values)
axes[1, 0].set_ylabel('购买率')
axes[1, 0].set_title('不同职业的购买率')
# 学历分布
edu_purchase = df.groupby('学历')['是否购买'].mean()
axes[1, 1].bar(edu_purchase.index, edu_purchase.values)
axes[1, 1].set_ylabel('购买率')
axes[1, 1].set_title('不同学历的购买率')
# 相关性热图
numeric_cols = ['年龄', '收入', '存款', '债务', '信用评分', '已购买产品数', '上次购买天数', '是否购买']
correlation = df[numeric_cols].corr()
sns.heatmap(correlation, annot=True, fmt='.2f', cmap='coolwarm',
center=0, ax=axes[1, 2])
axes[1, 2].set_title('特征相关性热图')
plt.tight_layout()
plt.savefig('data_exploration.png', dpi=300)
plt.show()
# ========== 3. 特征工程 ==========
# 编码分类变量
le = LabelEncoder()
df['职业编码'] = le.fit_transform(df['职业'])
df['婚姻编码'] = le.fit_transform(df['婚姻状况'])
df['学历编码'] = le.fit_transform(df['学历'])
# 创建新特征
df['债务收入比'] = df['债务'] / (df['收入'] * 12 + 1)
df['存款收入比'] = df['存款'] / (df['收入'] * 12 + 1)
df['净资产'] = df['存款'] – df['债务']
# 选择特征
feature_cols = [
'年龄', '收入', '存款', '债务', '信用评分',
'已购买产品数', '上次购买天数',
'职业编码', '婚姻编码', '学历编码',
'债务收入比', '存款收入比', '净资产'
]
X = df[feature_cols]
y = df['是否购买']
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# ========== 4. 模型训练与评估 ==========
# 定义模型
models = {
'逻辑回归': Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression(max_iter=1000, random_state=42))
]),
'随机森林': RandomForestClassifier(n_estimators=100, random_state=42),
'梯度提升': GradientBoostingClassifier(random_state=42)
}
# 训练和评估
results = {}
for name, model in models.items():
print(f"\\n训练 {name}…")
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
# 评估
results[name] = {
'model': model,
'predictions': y_pred,
'probabilities': y_pred_proba,
'accuracy': model.score(X_test, y_test),
'roc_auc': roc_auc_score(y_test, y_pred_proba)
}
print(f"准确率: {results[name]['accuracy']:.4f}")
print(f"AUC: {results[name]['roc_auc']:.4f}")
# ========== 5. 最佳模型分析 ==========
best_model_name = max(results, key=lambda x: results[x]['roc_auc'])
best_model = results[best_model_name]['model']
print(f"\\n最佳模型: {best_model_name}")
print("=" * 50)
print("\\n分类报告:")
print(classification_report(y_test, results[best_model_name]['predictions']))
# 混淆矩阵
cm = confusion_matrix(y_test, results[best_model_name]['predictions'])
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.title(f'{best_model_name} – 混淆矩阵')
plt.show()
# ROC曲线
plt.figure(figsize=(10, 6))
for name, result in results.items():
fpr, tpr, _ = roc_curve(y_test, result['probabilities'])
plt.plot(fpr, tpr, label=f"{name} (AUC = {result['roc_auc']:.3f})")
plt.plot([0, 1], [0, 1], 'k–', label='随机分类器')
plt.xlabel('假正率')
plt.ylabel('真正率')
plt.title('ROC曲线对比')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# 特征重要性(树模型)
if hasattr(best_model, 'feature_importances_'):
feature_importance = pd.DataFrame({
'feature': feature_cols,
'importance': best_model.feature_importances_
}).sort_values('importance', ascending=False)
plt.figure(figsize=(10, 6))
plt.barh(feature_importance['feature'], feature_importance['importance'])
plt.xlabel('重要性')
plt.title('特征重要性')
plt.tight_layout()
plt.show()
print("\\n特征重要性排序:")
print(feature_importance)
print("\\n" + "=" * 50)
print("项目完成!")
print("=" * 50)
学习资源推荐
📚 在线课程
| Coursera | Machine Learning (Andrew Ng) | 初学者 | ⭐⭐⭐ |
| 吴恩达深度学习课程 | Deep Learning Specialization | 阶段2-3 | ⭐⭐⭐⭐ |
| 李宏毅机器学习 | Machine Learning | 中级 | ⭐⭐⭐⭐ |
| Fast.ai | Practical Deep Learning for Coders | 实战导向 | ⭐⭐⭐⭐ |
| 极客时间 | Python进阶 | 阶段0-1 | ⭐⭐ |
📖 推荐书籍
┌─────────────────────────────────────────────────────┐
│ Python编程 │
│ – 《Python编程:从入门到实践》 │
│ – 《流畅的Python》 │
│ │
│ 数据科学 │
│ – 《利用Python进行数据分析》 │
│ – 《Python数据科学手册》 │
│ │
│ 机器学习 │
│ – 《机器学习》(周志华) │
│ – 《统计学习方法》(李航) │
│ – 《西瓜书》 │
│ │
│ 深度学习 │
│ – 《深度学习》(花书) │
│ – 《动手学深度学习》 │
│ │
│ NLP与LLM │
│ – 《自然语言处理综论》 │
│ – 《注意力机制》 │
└─────────────────────────────────────────────────────┘
🛠️ 实用工具与库
#mermaid-svg-0no33YHOPbWduL36{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0no33YHOPbWduL36 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0no33YHOPbWduL36 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0no33YHOPbWduL36 .error-icon{fill:#552222;}#mermaid-svg-0no33YHOPbWduL36 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0no33YHOPbWduL36 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0no33YHOPbWduL36 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0no33YHOPbWduL36 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0no33YHOPbWduL36 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0no33YHOPbWduL36 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0no33YHOPbWduL36 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0no33YHOPbWduL36 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0no33YHOPbWduL36 .marker.cross{stroke:#333333;}#mermaid-svg-0no33YHOPbWduL36 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0no33YHOPbWduL36 p{margin:0;}#mermaid-svg-0no33YHOPbWduL36 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-0no33YHOPbWduL36 .cluster-label text{fill:#333;}#mermaid-svg-0no33YHOPbWduL36 .cluster-label span{color:#333;}#mermaid-svg-0no33YHOPbWduL36 .cluster-label span p{background-color:transparent;}#mermaid-svg-0no33YHOPbWduL36 .label text,#mermaid-svg-0no33YHOPbWduL36 span{fill:#333;color:#333;}#mermaid-svg-0no33YHOPbWduL36 .node rect,#mermaid-svg-0no33YHOPbWduL36 .node circle,#mermaid-svg-0no33YHOPbWduL36 .node ellipse,#mermaid-svg-0no33YHOPbWduL36 .node polygon,#mermaid-svg-0no33YHOPbWduL36 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0no33YHOPbWduL36 .rough-node .label text,#mermaid-svg-0no33YHOPbWduL36 .node .label text,#mermaid-svg-0no33YHOPbWduL36 .image-shape .label,#mermaid-svg-0no33YHOPbWduL36 .icon-shape .label{text-anchor:middle;}#mermaid-svg-0no33YHOPbWduL36 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0no33YHOPbWduL36 .rough-node .label,#mermaid-svg-0no33YHOPbWduL36 .node .label,#mermaid-svg-0no33YHOPbWduL36 .image-shape .label,#mermaid-svg-0no33YHOPbWduL36 .icon-shape .label{text-align:center;}#mermaid-svg-0no33YHOPbWduL36 .node.clickable{cursor:pointer;}#mermaid-svg-0no33YHOPbWduL36 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0no33YHOPbWduL36 .arrowheadPath{fill:#333333;}#mermaid-svg-0no33YHOPbWduL36 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0no33YHOPbWduL36 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0no33YHOPbWduL36 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0no33YHOPbWduL36 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0no33YHOPbWduL36 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0no33YHOPbWduL36 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0no33YHOPbWduL36 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0no33YHOPbWduL36 .cluster text{fill:#333;}#mermaid-svg-0no33YHOPbWduL36 .cluster span{color:#333;}#mermaid-svg-0no33YHOPbWduL36 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0no33YHOPbWduL36 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0no33YHOPbWduL36 rect.text{fill:none;stroke-width:0;}#mermaid-svg-0no33YHOPbWduL36 .icon-shape,#mermaid-svg-0no33YHOPbWduL36 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0no33YHOPbWduL36 .icon-shape p,#mermaid-svg-0no33YHOPbWduL36 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0no33YHOPbWduL36 .icon-shape rect,#mermaid-svg-0no33YHOPbWduL36 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0no33YHOPbWduL36 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0no33YHOPbWduL36 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0no33YHOPbWduL36 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Python+AI工具生态
开发环境
数据处理
机器学习
深度学习
部署
Jupyter
VS Code
PyCharm
Google Colab
NumPy
Pandas
Polars
Apache Arrow
Scikit-learn
XGBoost
LightGBM
CatBoost
PyTorch
Transformers
LangChain
Accelerate
FastAPI
Docker
MLflow
Gradio
🔗 重要资源链接
-
官方文档:
- Python官方文档
- NumPy文档
- Pandas文档
- PyTorch文档
- Transformers文档
-
学习平台:
- Kaggle – 数据科学竞赛
- Papers with Code – 论文与代码
- Hugging Face – 预训练模型
- GitHub – 开源项目
常见问题解答
Q1: 没有编程基础,能学Python+AI吗?
答: 完全可以!Python是公认最适合初学者的语言。建议学习路径:
Q2: 数学基础不好,能学AI吗?
答: 可以,但需要补充必要的数学知识:
#mermaid-svg-TfNZYeKtfxPoxTNx{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TfNZYeKtfxPoxTNx .error-icon{fill:#552222;}#mermaid-svg-TfNZYeKtfxPoxTNx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TfNZYeKtfxPoxTNx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TfNZYeKtfxPoxTNx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TfNZYeKtfxPoxTNx .marker.cross{stroke:#333333;}#mermaid-svg-TfNZYeKtfxPoxTNx svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TfNZYeKtfxPoxTNx p{margin:0;}#mermaid-svg-TfNZYeKtfxPoxTNx .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster-label text{fill:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster-label span{color:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster-label span p{background-color:transparent;}#mermaid-svg-TfNZYeKtfxPoxTNx .label text,#mermaid-svg-TfNZYeKtfxPoxTNx span{fill:#333;color:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx .node rect,#mermaid-svg-TfNZYeKtfxPoxTNx .node circle,#mermaid-svg-TfNZYeKtfxPoxTNx .node ellipse,#mermaid-svg-TfNZYeKtfxPoxTNx .node polygon,#mermaid-svg-TfNZYeKtfxPoxTNx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TfNZYeKtfxPoxTNx .rough-node .label text,#mermaid-svg-TfNZYeKtfxPoxTNx .node .label text,#mermaid-svg-TfNZYeKtfxPoxTNx .image-shape .label,#mermaid-svg-TfNZYeKtfxPoxTNx .icon-shape .label{text-anchor:middle;}#mermaid-svg-TfNZYeKtfxPoxTNx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TfNZYeKtfxPoxTNx .rough-node .label,#mermaid-svg-TfNZYeKtfxPoxTNx .node .label,#mermaid-svg-TfNZYeKtfxPoxTNx .image-shape .label,#mermaid-svg-TfNZYeKtfxPoxTNx .icon-shape .label{text-align:center;}#mermaid-svg-TfNZYeKtfxPoxTNx .node.clickable{cursor:pointer;}#mermaid-svg-TfNZYeKtfxPoxTNx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TfNZYeKtfxPoxTNx .arrowheadPath{fill:#333333;}#mermaid-svg-TfNZYeKtfxPoxTNx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TfNZYeKtfxPoxTNx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TfNZYeKtfxPoxTNx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TfNZYeKtfxPoxTNx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TfNZYeKtfxPoxTNx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TfNZYeKtfxPoxTNx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster text{fill:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx .cluster span{color:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TfNZYeKtfxPoxTNx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TfNZYeKtfxPoxTNx rect.text{fill:none;stroke-width:0;}#mermaid-svg-TfNZYeKtfxPoxTNx .icon-shape,#mermaid-svg-TfNZYeKtfxPoxTNx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TfNZYeKtfxPoxTNx .icon-shape p,#mermaid-svg-TfNZYeKtfxPoxTNx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TfNZYeKtfxPoxTNx .icon-shape rect,#mermaid-svg-TfNZYeKtfxPoxTNx .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TfNZYeKtfxPoxTNx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TfNZYeKtfxPoxTNx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TfNZYeKtfxPoxTNx :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
AI所需数学
微积分
线性代数
概率统计
优化理论
导数/梯度
偏导数
矩阵运算
特征值/向量
概率分布
贝叶斯定理
假设检验
梯度下降
凸优化
建议:边做项目边补数学,遇到不懂的再学。
Q3: 学习多久能找到工作?
答: 因人而异,大致时间线:
| 1小时/天 | 12-18个月 | 初级AI工程师 |
| 2-3小时/天 | 8-12个月 | 中级AI工程师 |
| 全职学习 | 4-6个月 | 实战能力 |
关键:项目经验 > 理论知识,一定要做项目!
Q4: GPU不够用怎么办?
答: 多种解决方案:
云平台:
- Google Colab(免费GPU)
- Kaggle Notebooks(免费)
- AutoDL(便宜)
优化技巧:
# 减小batch size
batch_size = 16 # 而不是64
# 使用混合精度训练
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
# 梯度累积
accumulation_steps = 4
模型压缩:
- 量化(Quantization)
- 剪枝(Pruning)
- 知识蒸馏(Distillation)
Q5: 如何保持技术更新?
答: AI技术迭代快,建议:
关注前沿:
- arXiv.org(论文预印本)
- Hugging Face(新模型)
- Twitter/X(大佬动态)
实践导向:
- 每月做一个小项目
- 参与Kaggle竞赛
- 贡献开源项目
社区交流:
- 加入技术Discord/微信群
- 参加线下meetup
- 写技术博客
学习时间线总览
#mermaid-svg-FjsqNUrqgoV4QTqc{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FjsqNUrqgoV4QTqc .error-icon{fill:#552222;}#mermaid-svg-FjsqNUrqgoV4QTqc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FjsqNUrqgoV4QTqc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FjsqNUrqgoV4QTqc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FjsqNUrqgoV4QTqc .marker.cross{stroke:#333333;}#mermaid-svg-FjsqNUrqgoV4QTqc svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FjsqNUrqgoV4QTqc p{margin:0;}#mermaid-svg-FjsqNUrqgoV4QTqc .mermaid-main-font{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-FjsqNUrqgoV4QTqc .exclude-range{fill:#eeeeee;}#mermaid-svg-FjsqNUrqgoV4QTqc .section{stroke:none;opacity:0.2;}#mermaid-svg-FjsqNUrqgoV4QTqc .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-FjsqNUrqgoV4QTqc .section2{fill:#fff400;}#mermaid-svg-FjsqNUrqgoV4QTqc .section1,#mermaid-svg-FjsqNUrqgoV4QTqc .section3{fill:white;opacity:0.2;}#mermaid-svg-FjsqNUrqgoV4QTqc .sectionTitle0{fill:#333;}#mermaid-svg-FjsqNUrqgoV4QTqc .sectionTitle1{fill:#333;}#mermaid-svg-FjsqNUrqgoV4QTqc .sectionTitle2{fill:#333;}#mermaid-svg-FjsqNUrqgoV4QTqc .sectionTitle3{fill:#333;}#mermaid-svg-FjsqNUrqgoV4QTqc .sectionTitle{text-anchor:start;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-FjsqNUrqgoV4QTqc .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-FjsqNUrqgoV4QTqc .grid .tick text{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;fill:#333;}#mermaid-svg-FjsqNUrqgoV4QTqc .grid path{stroke-width:0;}#mermaid-svg-FjsqNUrqgoV4QTqc .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-FjsqNUrqgoV4QTqc .task{stroke-width:2;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskText{text-anchor:middle;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutsideRight{fill:black;text-anchor:start;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-FjsqNUrqgoV4QTqc .task.clickable{cursor:pointer;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskText0,#mermaid-svg-FjsqNUrqgoV4QTqc .taskText1,#mermaid-svg-FjsqNUrqgoV4QTqc .taskText2,#mermaid-svg-FjsqNUrqgoV4QTqc .taskText3{fill:white;}#mermaid-svg-FjsqNUrqgoV4QTqc .task0,#mermaid-svg-FjsqNUrqgoV4QTqc .task1,#mermaid-svg-FjsqNUrqgoV4QTqc .task2,#mermaid-svg-FjsqNUrqgoV4QTqc .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutside0,#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutside2{fill:black;}#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutside1,#mermaid-svg-FjsqNUrqgoV4QTqc .taskTextOutside3{fill:black;}#mermaid-svg-FjsqNUrqgoV4QTqc .active0,#mermaid-svg-FjsqNUrqgoV4QTqc .active1,#mermaid-svg-FjsqNUrqgoV4QTqc .active2,#mermaid-svg-FjsqNUrqgoV4QTqc .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-FjsqNUrqgoV4QTqc .activeText0,#mermaid-svg-FjsqNUrqgoV4QTqc .activeText1,#mermaid-svg-FjsqNUrqgoV4QTqc .activeText2,#mermaid-svg-FjsqNUrqgoV4QTqc .activeText3{fill:black!important;}#mermaid-svg-FjsqNUrqgoV4QTqc .done0,#mermaid-svg-FjsqNUrqgoV4QTqc .done1,#mermaid-svg-FjsqNUrqgoV4QTqc .done2,#mermaid-svg-FjsqNUrqgoV4QTqc .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-FjsqNUrqgoV4QTqc .doneText0,#mermaid-svg-FjsqNUrqgoV4QTqc .doneText1,#mermaid-svg-FjsqNUrqgoV4QTqc .doneText2,#mermaid-svg-FjsqNUrqgoV4QTqc .doneText3{fill:black!important;}#mermaid-svg-FjsqNUrqgoV4QTqc .crit0,#mermaid-svg-FjsqNUrqgoV4QTqc .crit1,#mermaid-svg-FjsqNUrqgoV4QTqc .crit2,#mermaid-svg-FjsqNUrqgoV4QTqc .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-FjsqNUrqgoV4QTqc .activeCrit0,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCrit1,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCrit2,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-FjsqNUrqgoV4QTqc .doneCrit0,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCrit1,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCrit2,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-FjsqNUrqgoV4QTqc .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-FjsqNUrqgoV4QTqc .milestoneText{font-style:italic;}#mermaid-svg-FjsqNUrqgoV4QTqc .doneCritText0,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCritText1,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCritText2,#mermaid-svg-FjsqNUrqgoV4QTqc .doneCritText3{fill:black!important;}#mermaid-svg-FjsqNUrqgoV4QTqc .vert{stroke:navy;}#mermaid-svg-FjsqNUrqgoV4QTqc .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-FjsqNUrqgoV4QTqc .activeCritText0,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCritText1,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCritText2,#mermaid-svg-FjsqNUrqgoV4QTqc .activeCritText3{fill:black!important;}#mermaid-svg-FjsqNUrqgoV4QTqc .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-FjsqNUrqgoV4QTqc :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
2025-01-01
2025-02-01
2025-03-01
2025-04-01
2025-05-01
2025-06-01
2025-07-01
2025-08-01
2025-09-01
2025-10-01
2025-11-01
Python语法
数据结构
OOP编程
NumPy/Pandas
数据可视化
实战项目1
ML基础理论
Scikit-learn
实战项目2
PyTorch基础
CNN/RNN/Transformer
实战项目3
NLP基础
Transformers
RAG与Agent
实战项目4
基础阶段
数据科学
机器学习
深度学习
NLP与LLM
Python+AI学习时间线(全职学习)
总结
核心要点
学习建议
- ✅ 每天至少写代码30分钟
- ✅ 每周学习一个新概念
- ✅ 每月完成一个小项目
- ✅ 每季度进行一次技术复盘
- ✅ 保持好奇心和探索精神
最后的话
“学习Python+AI是一场马拉松,不是短跑。重要的是保持持续学习和实践,不要害怕犯错。每一个错误都是学习的机会。”
祝你学习顺利,早日成为AI工程师! 🚀
附录
A. Python环境搭建
# 1. 安装Anaconda(推荐)
# 下载:https://www.anaconda.com/
# 2. 创建虚拟环境
conda create -n ai_env python=3.10
# 3. 激活环境
conda activate ai_env
# 4. 安装核心库
pip install numpy pandas matplotlib seaborn
pip install scikit-learn xgboost lightgbm
pip install torch torchvision torchaudio
pip install transformers langchain
pip install jupyter lab
# 5. 启动Jupyter
jupyter lab
B. 常用命令速查
# Jupyter相关
jupyter notebook # 启动notebook
jupyter lab # 启动lab
jupyter nbconvert # 转换notebook格式
# Git相关
git clone <url> # 克隆仓库
git add . # 添加更改
git commit -m "msg" # 提交
git push # 推送
# Conda相关
conda env list # 列出环境
conda install <pkg> # 安装包
conda env remove -n <env> # 删除环境
C. 学习检查清单
阶段0检查清单
- 掌握Python基本语法
- 理解数据类型和结构
- 会写函数和类
- 熟悉常用模块
阶段1检查清单
- 能用NumPy进行数组运算
- 熟练使用Pandas处理数据
- 能用Matplotlib绘制图表
- 完成至少3个数据分析项目
阶段2检查清单
- 理解常见ML算法原理
- 能使用Scikit-learn建模
- 会做特征工程
- 完成至少2个ML项目
阶段3检查清单
- 掌握PyTorch基础
- 能搭建神经网络
- 理解CNN/RNN/Transformer
- 完成至少2个DL项目
阶段4检查清单
- 熟练使用Transformers
- 能调用预训练模型
- 理解RAG原理
- 完成至少1个NLP项目
✍️ 坚持用 清晰易懂的图解 + 可落地的代码,让每个知识点都 简单直观!
💡 座右铭:“道路是曲折的,前途是光明的!”




