├── img
└── Datawhale组队学习路线.png
├── 理论应用
├── 图像处理基础
│ └── Image_Processing
│ │ ├── 学习任务
│ │ ├── Task5.md
│ │ ├── Task4.md
│ │ ├── Task6.md
│ │ ├── Task2.md
│ │ ├── Task3.md
│ │ └── Task1.md
│ │ └── README.md
├── Data-mining
│ ├── 学习任务
│ │ ├── Task5.md
│ │ ├── Task3.md
│ │ ├── Task6.md
│ │ ├── Task2.md
│ │ ├── Task4.md
│ │ └── Task1.md
│ └── README.md
└── NLP-theory-practice-
│ ├── 学习任务
│ ├── Task10.md
│ ├── Task9.md
│ ├── Task7.md
│ ├── Task5.md
│ ├── Task8.md
│ ├── Task2.md
│ ├── Task3.md
│ ├── Task6.md
│ ├── Task4.md
│ ├── Task1.md
│ └── 预备任务.md
│ └── README.md
├── 基础知识
├── Statistical
│ ├── 学习任务
│ │ ├── Task2.md
│ │ ├── Task1.md
│ │ ├── Task3.md
│ │ └── Task4.md
│ └── README.md
├── Python
│ ├── 学习任务
│ │ ├── Task3.md
│ │ ├── Task4.md
│ │ ├── Task5.md
│ │ ├── Task2.md
│ │ └── Task1.md
│ └── README.md
└── NLP论文复现
│ └── README.md
├── 机器学习
├── BigData_Learning
│ ├── README.md
│ ├── 学习任务
│ │ ├── Task4.md
│ │ ├── Task3.md
│ │ ├── Task7.md
│ │ ├── Task1.md
│ │ ├── Task5.md
│ │ ├── Task6.md
│ │ └── Task2.md
│ └── 参考答案
│ │ ├── Task4参考答案.md
│ │ ├── Task5参考答案.md
│ │ ├── Task6参考答案.md
│ │ ├── 【Task7】实践.ipynb
│ │ └── PySpark练习.ipynb
├── Spark基础
│ ├── 学习任务
│ │ ├── Task5.md
│ │ ├── Task2.md
│ │ ├── Task4.md
│ │ ├── Task3.md
│ │ └── Task1.md
│ └── README.md
├── Primary-algorithm-combing
│ ├── 学习任务
│ │ ├── Task3.md
│ │ ├── Task2.md
│ │ └── Task1.md
│ └── README.md
└── Advanced-algorithm-combing
│ ├── 学习任务
│ ├── Task3.md
│ ├── Task2.md
│ ├── Task1.md
│ └── Task4.md
│ └── README.md
├── 数据科学
├── Data_Analysis
│ ├── README.md
│ └── 学习任务
│ │ ├── Task1.md
│ │ ├── Task7.md
│ │ ├── Task2.md
│ │ ├── Task3.md
│ │ ├── Task6.md
│ │ ├── Task4.md
│ │ ├── Task0.md
│ │ └── Task5.md
├── MYSQL
│ ├── README.md
│ └── 学习任务
│ │ ├── Task3.md
│ │ ├── Task2.md
│ │ ├── Task4.md
│ │ └── Task1.md
├── Scrapy
│ ├── 学习任务
│ │ ├── Task4.md
│ │ ├── Task1.md
│ │ ├── Task3.md
│ │ └── Task2.md
│ └── README.md
└── Excel
│ ├── 学习任务
│ ├── Task5.md
│ ├── Task2.md
│ ├── Task4.md
│ ├── Task3.md
│ └── Task1.md
│ └── README.md
├── 深度学习
├── Keras
│ ├── README.md
│ └── 学习任务
│ │ ├── Task4.md
│ │ ├── Task3.md
│ │ ├── Task2.md
│ │ └── Task1.md
├── Pytorch
│ ├── README.md
│ └── 学习任务
│ │ ├── Task7.md
│ │ ├── Task3.md
│ │ ├── Task4.md
│ │ ├── Task5.md
│ │ ├── Task2.md
│ │ ├── Task1.md
│ │ └── Task6.md
└── 深度学习
│ └── 深度学习课程设计.md
├── 编程基础
├── leetCode
│ └── README.md
└── Programming
│ ├── 学习任务
│ ├── Task6.md
│ ├── Task3.md
│ ├── Task4.md
│ ├── Task5.md
│ ├── Task1.md
│ ├── Task2.md
│ └── Task7.md
│ └── README.md
└── README.md
/img/Datawhale组队学习路线.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Briareox/Datawhale_Learning/HEAD/img/Datawhale组队学习路线.png
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | 【task5(2天)】图像分割1(提交代码和效果对比图)
2 | 1. 边缘检测常用的算子canny算子、sobel算子和laplacian算子,尝试各自效果
3 | 2. 霍夫变换,直线检测和圆检测
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | ## 任务5 - 模型调优(2天)
2 | 任务5:使用网格搜索法对5个模型进行调优(调参时采用五折交叉验证的方式),并进行模型评估,记得展示代码的运行结果。 时间:2天
3 |
4 |
5 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ## 任务3 - 模型构建(2天)
2 | 任务3:用逻辑回归、svm和决策树;随机森林和XGBoost进行模型构建,评分方式任意,如准确率等。(不需要考虑模型调参)时间:2天
3 |
4 |
5 | [参考答案](./../参考答案)
6 |
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | 【task4(4天)】形态学处理(提交代码和效果对比图)
2 |
3 | 1. 了解膨胀腐蚀的基本原理
4 | 2. 练习实现图像的膨胀腐蚀操作
5 | 3. 练习实现图像和开操作和闭操作
6 | 4. 练习实现图像的顶帽和黑帽操作
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task10.md:
--------------------------------------------------------------------------------
1 | ## Task10 BERT
2 |
3 |
4 |
5 | 1. Transformer的原理
6 |
7 | 2. BERT的原理
8 |
9 | 3. 利用预训练的BERT模型将句子转换为句向量,进行文本分类1
10 |
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | 【task6(2天)】图像分割2(提交代码和效果对比图)
2 |
3 | 1. 图像轮廓与图像分割练习理解函数所包含的返回值使用findCountous和drawCountours函数进行练习
4 | 2. 了解分水岭算法的原理,使用API进行实现
5 |
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | ## 任务6 - 模型融合(2天)
2 | 任务6:模型融合,模型融合方式任意,并结合Task5给出你的最优结果。时间:2天
3 | * 例如Stacking融合,用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分结果。
4 |
5 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/Statistical/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## 任务 2 - 时长:1天
2 | **【任务内容】**
3 |
4 | * 学习内容
5 |
6 | 35-46集 中心极限定理、置信区间
7 |
8 | **【任务时间】**
9 |
10 |
11 | * 总时长:一天
12 |
13 | [参考答案](../参考答案)
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task9.md:
--------------------------------------------------------------------------------
1 | ## Task 9 Attention原理 (2 days)
2 | * 基本的Attention原理。
3 | * HAN的原理(Hierarchical Attention Networks)。
4 | * 利用Attention模型进行文本分类。
5 |
6 |
7 |
8 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | 【task2(3天)】灰度变换和二值化(提交代码效果对比图)
2 |
3 | 1. 灰度化的常用方法,
4 | 2. 了解灰度变换应用场景并加以实现:反转、对数变化、幂律变化、分段性变换
5 | 3. 练习图像直方图,直方图匹配
6 | 4. 了解二值化常用方法阈值选取原理和方法,并练习实现对比效果,熟悉各自的应用场景
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | 【task2(3天)】灰度变换和二值化(提交代码效果对比图)
2 |
3 | 1. 灰度化的常用方法,
4 | 2. 了解灰度变换应用场景并加以实现:反转、对数变化、幂律变化、分段性变换
5 | 3. 练习图像直方图,直方图匹配
6 | 4. 了解二值化常用方法阈值选取原理和方法,并练习实现对比效果,熟悉各自的应用场景
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## 任务2 - 特征工程(2天)
2 |
3 | 任务2:对数据特征进行衍生和进行特征挑选。时间:2天
4 |
5 | * 特征衍生
6 |
7 | * 特征挑选:分别用IV值和随机森林等进行特征选择
8 |
9 | * ……以及你能想到特征工程处理
10 |
11 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task7.md:
--------------------------------------------------------------------------------
1 | ## Task7 卷积神经网络 (2 day)
2 | * 卷积运算的定义、动机(稀疏权重、参数共享、等变表示)。一维卷积运算和二维卷积运算。
3 | * 池化运算的定义、种类(最大池化、平均池化等)、动机。
4 | * Text-CNN的原理。
5 | * 利用Text-CNN模型来进行文本分类。
6 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/Statistical/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ## 任务 1 - 时长:2天
2 |
3 | * 【任务内容】
4 |
5 | 学习内容 1
6 |
7 | 12-26集 统计学基本知识、二项及泊松分布
8 |
9 | 学习内容 2
10 |
11 | 27-34集 大数定律、正态分布
12 |
13 | * 【任务时间】
14 |
15 | 总时长:两天
16 |
17 | [参考答案](../参考答案)
--------------------------------------------------------------------------------
/基础知识/Statistical/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ## 任务 3 - 时长:2天
2 | **【任务内容】**
3 |
4 | * 学习内容 1
5 |
6 | 47-53集 假设检验(一)
7 |
8 | * 学习内容 2
9 |
10 | 54-61集 假设检验(二)
11 |
12 | **【任务时间】**
13 |
14 | * 总时长:两天
15 |
16 | [参考答案](./../参考答案)
17 |
--------------------------------------------------------------------------------
/基础知识/Statistical/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## 任务 4 - 时长:2天
2 | **【任务内容】**
3 |
4 | * 学习内容 1
5 |
6 | 62-71集 线性回归
7 |
8 | * 学习内容 2
9 |
10 | 72-81集 卡方分布与方差分析
11 |
12 | **【任务时间】**
13 |
14 | * 总时长:两天
15 |
16 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## 任务4 - 模型评估(2天)
2 | 任务4:记录5个模型(逻辑回归、SVM、决策树、随机森林、XGBoost)关于accuracy、precision,recall和F1-score、auc值的评分表格,并画出ROC曲线。时间:2天
3 |
4 | 可以参照以下格式:
5 |
6 |
7 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/Python/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 | # **Task3(2day)**
3 |
4 | 1. dict字典
5 |
6 | * 定义
7 |
8 | * 创建
9 |
10 | * 字典的方法
11 |
12 | 2. 集合
13 |
14 | * 特性
15 |
16 | * 创建
17 |
18 | * 方法
19 |
20 | 3. 判断语句(要求掌握多条件判断)
21 |
22 | 4. 三目表达式
23 |
24 | 5. 循环语句
25 |
26 | [参考答案](./../参考答案)
27 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/README.md:
--------------------------------------------------------------------------------
1 | # Bigdata
2 |
3 | **课程设计**: 王晓腾、黑桃
4 |
5 | **组队学习说明**:
6 |
7 | **任务路线**:
8 |
9 | **组队学习周期**:
10 |
11 | **定位人群**:
12 |
13 | **难度系数**:中
14 |
15 | **每个任务完成大概所需时间**:
16 |
17 | ## 任务预览(2天)
18 |
19 |
20 |
21 | [任务分配](学习任务)
22 |
23 | [参考答案](参考答案)
--------------------------------------------------------------------------------
/机器学习/Spark基础/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Task5 **(2day)**
4 |
5 | **内容:逻辑回归,决策树**
6 |
7 | [6.4.1 逻辑斯蒂回归分类器](http://dblab.xmu.edu.cn/blog/1773-2/)
8 |
9 | [6.4.2 决策树分类器](http://dblab.xmu.edu.cn/blog/1776-2/)
10 |
11 | [学习参考](https://www.cnblogs.com/shishanyuan/p/4699644.html)
12 |
13 |
14 |
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | ## Task 5 文本表示:从one-hot到word2vec (2 days)
2 |
3 | * 词袋模型:离散、高维、稀疏。
4 |
5 | * 分布式表示:连续、低维、稠密。word2vec词向量原理并实践,用来表示文本。
6 |
7 | * [word2vec1](https://blog.csdn.net/itplus/article/details/37969519) [word2vec2](http://www.hankcs.com/nlp/word2vec.html)
8 |
9 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/Python/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 |
2 | # Task4 **(2day)**
3 |
4 | 1. 函数关键字
5 |
6 | 2. 函数的定义
7 |
8 | 3. 函数参数与作用域
9 |
10 | 4. 函数返回值
11 |
12 | 5. file
13 |
14 | * 打开文件方式(读写两种方式)
15 |
16 | * 文件对象的操作方法
17 |
18 | * 学习对excel及csv文件进行操作
19 |
20 | 6. os模块
21 |
22 | 7. datetime模块
23 |
24 |
25 |
26 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/Python/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 |
2 | # Task5 **(2day)**
3 |
4 | 1. file
5 |
6 | * 打开文件方式(读写两种方式)
7 |
8 | * 文件对象的操作方法
9 |
10 | * 学习对excel及csv文件进行操作
11 |
12 | 2. 类和对象
13 |
14 | 3. 正则表达式
15 |
16 | 4. re模块
17 |
18 | 5. datetime模块学习
19 |
20 | 6. http请求
21 |
22 | # 飞机大战(待定。。。)[先不上]
23 |
24 |
25 |
26 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/README.md:
--------------------------------------------------------------------------------
1 | # Data_Analysis
2 |
3 | 课程设计:金娟娟
4 |
5 | 组队学习说明:学习python for data analysis基础知识
6 |
7 | 任务路线:python基础-重要的python库(numpy/pandas/matplotlib/seaborn等)-数据清洗和分析
8 |
9 | 组队学习周期:15天定位人群:数据分析小白,难度系数低
10 |
11 | 每个任务完成大概所需时间:每天平均花费时间2小时-4小时不等,根据个人学习接受能力强弱有所浮动
12 |
13 | 任务内容:https://shimo.im/docs/LUrxo7ibzZ0FtjGd/
--------------------------------------------------------------------------------
/数据科学/MYSQL/README.md:
--------------------------------------------------------------------------------
1 | 【MySQL】
2 |
3 | 课程设计:杨皓博 孙涛 杨煜
4 |
5 | 组队学习说明:一周内快速了解并掌握MySQL的主要内容。通过大量SQL语句的实战练习,可以在简历上写熟练掌握MySQL。(注意:本课程只关注SQL查询语句本身,对数据库的涉及较少。)
6 |
7 | 任务路线: MySQL软件安装及数据库基础->查询语句->表操作->表联结->MySQL 实战->MySQL 实战-复杂项目
8 |
9 | 组队学习周期:(8天)
10 |
11 | **定位人群:小白,难度系数小**
12 |
13 | 每个任务完成大概所需时间:2-3h
14 |
15 |
16 |
17 | [学习内容](学习任务)
--------------------------------------------------------------------------------
/基础知识/Python/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 | # Task2**(2day)**
3 |
4 | 1. 列表
5 |
6 | * 标志
7 |
8 | * 基本操作(创建,append( ),pop( ) ,del( ), 拷贝)
9 |
10 | * 列表相关方法
11 |
12 | 2. 元组
13 |
14 | * 标志
15 |
16 | * 基本操作(创建及不可变性)
17 |
18 | 3. string字符串
19 |
20 | * 定义及基本操作(+,*,读取方式)
21 |
22 | * 字符串相关方法
23 |
24 | 4. 字符串格式化问题
25 |
26 |
27 |
28 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Primary-algorithm-combing/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | 【任务3 - 决策树算法梳理】时长:2天
2 | 1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)
3 | 2.决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景
4 | 3. 回归树原理
5 | 4. 决策树防止过拟合手段
6 | 5. 模型评估
7 | 6. sklearn参数详解,Python绘制决策树
8 |
9 | 学习时长:两天
10 |
11 | 参考:西瓜书
12 |
13 | cs229吴恩达机器学习课程
14 |
15 | 李航统计学习
16 |
17 | 谷歌搜索
18 |
19 | 公式推导参考:http://t.cn/EJ4F9Q0
--------------------------------------------------------------------------------
/深度学习/Keras/README.md:
--------------------------------------------------------------------------------
1 |
2 | 课程设计:有容
3 |
4 | 组队学习说明:通过阅读和练习keras中文文档,学习keras的基本模块,侧重于对keras的各模块的了解,主要参考资料为keras中文文档。
5 |
6 | 任务路线:快速认识keras—>keras的网络层—>keras的数据处理—>keras的初始化正则化等—>经典样例加练习
7 |
8 | 定位人群:本课程适合对深度学习有一定基础,想要快速建立自己的神经网络模型的同学,keras是最快捷简单的实现自己想法的框架。经过6天的学习可以使其能够快速使用keras。
9 |
10 | 难度系数:简单
11 |
12 | 组队学习周期:6天
13 |
14 | 每个任务完成大概所需时间:2-3h
15 |
16 |
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/README.md:
--------------------------------------------------------------------------------
1 | # Image_Processing(待内测)
2 |
3 |
4 | **组队学习说明** :学习数字图像处理,用opencv实现图像处理的基础操作。
5 |
6 | **备注**:活用代码补齐,具体参数多看源码解释
7 |
8 | **建议**:原理和代码进行搭配,在理解原理的基础上代码是很容易的东西。
9 |
10 | **任务路线**:安装opencv -> 灰度变换 和二值化 ->滤波操作-> 形态学操作 -> 图像分割
11 |
12 | **学习周期** 17天
13 |
14 | **定位人群** :了解python基础操作和numpy基本操作
15 |
16 | **完成任务所需时间** : 每天2-3小时
--------------------------------------------------------------------------------
/机器学习/Advanced-algorithm-combing/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ##【Task3 XGB算法梳理】3天
2 |
3 |
4 | 1. 算法原理
5 | 2. 损失函数
6 | 3. 分裂结点算法
7 | 4. 正则化
8 | 5. 对缺失值处理
9 | 6. 优缺点
10 | 7. 应用场景
11 | 8. sklearn参数
12 |
13 | **参考**:
14 |
15 | 西瓜书
16 |
17 | cs229吴恩达机器学习课程
18 |
19 | 李航统计学习
20 |
21 | 谷歌搜索
22 |
23 | 公式推导参考:http://t.cn/EJ4F9Q0
24 |
25 | [参考答案](./../参考答案)
26 |
--------------------------------------------------------------------------------
/机器学习/Primary-algorithm-combing/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | 【任务2 - 逻辑回归算法梳理】时长:2天
2 | 1、逻辑回归与线性回归的联系与区别
3 | 2、 逻辑回归的原理
4 | 3、逻辑回归损失函数推导及优化
5 | 4、 正则化与模型评估指标
6 | 5、逻辑回归的优缺点
7 | 6、样本不均衡问题解决办法
8 | 7. sklearn参数
9 |
10 | **学习时长**:两天
11 |
12 | **参考**:
13 |
14 | 西瓜书
15 |
16 | cs229吴恩达机器学习课程
17 |
18 | 李航统计学习
19 |
20 | 谷歌搜索
21 |
22 | 公式推导参考:http://t.cn/EJ4F9Q0
--------------------------------------------------------------------------------
/机器学习/Advanced-algorithm-combing/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## 【Task2 GBDT算法梳理】2天
2 |
3 | 1. 前向分布算法
4 | 2. 负梯度拟合
5 | 3. 损失函数
6 | 4. 回归
7 | 5. 二分类,多分类
8 | 6. 正则化
9 | 7. 优缺点
10 | 8. sklearn参数
11 | 9. 应用场景
12 |
13 | **参考**:
14 |
15 | 西瓜书
16 |
17 | cs229吴恩达机器学习课程
18 |
19 | 李航统计学习
20 |
21 | 谷歌搜索
22 |
23 | 公式推导参考:http://t.cn/EJ4F9Q0
24 |
25 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Advanced-algorithm-combing/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ##【Task1 随机森林算法梳理】2天
2 | 【参考框架】欢迎有自己的框架
3 | 1. 集成学习概念
4 | 2. 个体学习器概念
5 | 3. boosting bagging
6 | 4. 结合策略(平均法,投票法,学习法)
7 | 5. 随机森林思想
8 | 6. 随机森林的推广
9 | 7. 优缺点
10 | 8. sklearn参数
11 | 9.应用场景
12 |
13 | **参考**:
14 |
15 | 西瓜书
16 |
17 | cs229吴恩达机器学习课程
18 |
19 | 李航统计学习
20 |
21 | 谷歌搜索
22 |
23 | 公式推导参考:http://t.cn/EJ4F9Q0
24 |
25 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/数据科学/Scrapy/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 |
2 | # Task4(2天)
3 |
4 | ## **4.1 ** 实战大项目
5 |
6 | 1. 实战大项目:模拟登录丁香园,并抓取论坛页面所有的人员基本信息与回复帖子内容。
7 |
8 | 2. 丁香园论坛:[http://www.dxy.cn/bbs/thread/626626#626626](http://www.dxy.cn/bbs/thread/626626#626626) 。
9 |
10 | 3. 参考资料:[https://blog.csdn.net/naonao77/article/details/88316754](https://blog.csdn.net/naonao77/article/details/88316754) (Task7的参考资料,任务结束之后再发出来)
11 |
12 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Primary-algorithm-combing/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | 【任务1 - 线性回归算法梳理】时长:2天
2 | 1. 机器学习的一些概念
3 | 有监督、无监督、泛化能力、过拟合欠拟合(方差和偏差以及各自解决办法)、交叉验证
4 | 2. 线性回归的原理
5 | 3. 线性回归损失函数、代价函数、目标函数
6 | 4. 优化方法(梯度下降法、牛顿法、拟牛顿法等)
7 | 5. 线性回归的评估指标
8 | 6. sklearn参数详解
9 |
10 | **学习时长**:两天
11 |
12 | **参考**:
13 |
14 | 西瓜书
15 |
16 | cs229吴恩达机器学习课程
17 |
18 | 李航统计学习
19 |
20 | 谷歌搜索
21 |
22 | 公式推导参考:http://t.cn/EJ4F9Q0
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task8.md:
--------------------------------------------------------------------------------
1 | ## Task8 循环和递归神经网络 (2 days)
2 | * RNN的结构。循环神经网络的提出背景、优缺点。着重学习RNN的反向传播、RNN出现的问题(梯度问题、长期依赖问题)、BPTT算法。
3 | * 双向RNN
4 | * 递归神经网络
5 | * LSTM、GRU的结构、提出背景、优缺点。
6 | * 针对梯度消失(LSTM等其他门控RNN)、梯度爆炸(梯度截断)的解决方案。
7 | * Memory Network(自选)
8 | * Text-RNN的原理。
9 | * 利用Text-RNN模型来进行文本分类。
10 | * Recurrent Convolutional Neural Networks(RCNN)原理。
11 | * 利用RCNN模型来进行文本分类。
12 |
13 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/编程基础/leetCode/README.md:
--------------------------------------------------------------------------------
1 | # LeetCode
2 |
3 | **课程简介**
4 |
5 | 课程设计:老表、于鸿飞、杨皓博
6 |
7 | 组队学习说明:Leetcode刷题组队学习,从零开始每天一道算法题,在良好的学习氛围下,培养刷题习惯,学习算法思想。(不限制编程语言)
8 |
9 | 任务路线:腾讯精选练习(50 题)顺序每天一道题。
10 |
11 | 地址链接:https://leetcode-cn.com/problemset/50/
12 |
13 | 组队学习周期:50天(50题全部完成即结束)
14 |
15 | 定位人群:适合有一门语言基础的同学,难度系数中
16 |
17 | 每个任务完成大概所需时间:2-3h
18 |
19 | **任务安排**
20 |
21 | 选取腾讯精选练习(50 题)解答,每天1题
22 |
23 |
24 |
25 |
26 |
27 | ## 优化建议
--------------------------------------------------------------------------------
/机器学习/Spark基础/README.md:
--------------------------------------------------------------------------------
1 | 【课程简介】
2 |
3 | 课程设计:Summer
4 |
5 | 组队学习说明:学习spark基础知识,针对spark小白的学习之路
6 |
7 | 任务路线:运行原理-环境搭建-RDD编程-SparkSQL-MLlib-常用算法
8 |
9 | 组队学习周期:12天
10 |
11 | 定位人群:spark小白,**难度系数中**
12 |
13 | 每个任务完成大概所需时间:每天平均花费时间**2小时-4小时**不等,根据个人学习接受能力强弱有所浮动
14 |
15 | [课程内容](http://dblab.xmu.edu.cn/blog/1709-2/)
16 | - 厦门大学林子雨 大数据之Spark入门教程(Python版)
17 | - MOOC上有对应SCALA版本的视频教程(未更新完毕,理论知识部分可参考)
18 |
19 | # 备注:本课程基于单机模式
20 |
--------------------------------------------------------------------------------
/理论应用/Data-mining/README.md:
--------------------------------------------------------------------------------
1 | # Data-mining
2 |
3 | **课程设计**:范晶晶、李碧涵、
4 |
5 | **组队学习说明**:应用机器学习算法,完整地走完一个数据挖掘项目流程
6 |
7 | **任务路线**:数据分析→特征工程→模型构建→模型评估→模型调优→模型融合
8 |
9 | **组队学习周期**:12天
10 |
11 | **定位人群**:有Python基础,sklearn基础。难度系数中
12 |
13 | **每个任务完成大概所需时间**:2-3h/天
14 |
15 |
16 | ## 任务预览(2天)
17 | 要求:数据切分方式 - 三七分,其中测试集30%,训练集70%,随机种子设置为2018
18 | 1. 任务1:对数据进行探索和分析。时间:2天
19 | 2. 数据类型的分析
20 | 3. 无关特征删除
21 | 4. 数据类型转换
22 | 5. 缺失值处理
23 | 6. ……以及你能想到和借鉴的数据分析处理
--------------------------------------------------------------------------------
/理论应用/Data-mining/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ## 任务1 - 数据分析(2天)
2 |
3 | **数据集下载**
4 |
5 | 这是我们本次实践数据的下载地址 https://pan.baidu.com/s/1wO9qJRjnrm8uhaSP67K0lw
6 |
7 | 说明:这份数据集是金融数据(非原始数据,已经处理过了),我们要做的是预测贷款用户是否会逾期。表格中 "status" 是结果标签:0表示未逾期,1表示逾期。
8 |
9 |
10 |
11 | 数据集涉密,不要开源到网上,谢谢~
12 |
13 | 要求:数据切分方式 - 三七分,其中测试集30%,训练集70%,随机种子设置为2018
14 |
15 | 任务1:对数据进行探索和分析。时间:2天
16 |
17 | * 数据类型的分析
18 | * 无关特征删除
19 | * **数据类型转换**
20 | * **缺失值处理**
21 | * ……以及你能想到和借鉴的数据分析处理
22 |
23 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Advanced-algorithm-combing/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## 【Task4 LightGBM算法梳理】(3days)
2 |
3 | 【参考框架】欢迎有自己的框架
4 |
5 | 1. LightGBM
6 | 2. LightGBM的起源
7 | 3. Histogram VS pre-sorted
8 | 4. leaf-wise VS level-wise
9 | 5. 特征并行和数据并行
10 | 6. 顺序访问梯度
11 | 7. 支持类别特征
12 | 8. 应用场景
13 | 9. sklearn参数
14 | 10. CatBoost(了解)
15 |
16 | **参考**:
17 |
18 | 西瓜书
19 |
20 | cs229吴恩达机器学习课程
21 |
22 | 李航统计学习
23 |
24 | 谷歌搜索
25 |
26 | 公式推导参考:http://t.cn/EJ4F9Q0
27 |
28 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | # 【Task4】MapReduce+MapReduce执行过程
2 | 1. MR原理
3 | 2. 使用Hadoop Streaming -python写出WordCount
4 | 3. 使用mr计算movielen中每个用户的平均评分。
5 | 4. 使用mr实现去重任务。
6 | 5. 使用mr实现排序。
7 | 6. 使用mapreduce实现倒排索引。
8 | 7. 使用mr实现join功能。
9 | 8. 使用mapreduce计算Jaccard相似度。
10 | 9. 使用mapreduce实现PageRank。
11 |
12 |
13 | 参考: [https://segmentfault.com/a/1190000002672666](https://segmentfault.com/a/1190000002672666)
14 |
15 | 参考资料:[Python3调用Hadoop的API](https://www.cnblogs.com/sss4/p/10443497.html)
16 |
--------------------------------------------------------------------------------
/深度学习/Pytorch/README.md:
--------------------------------------------------------------------------------
1 | # Pytorch
2 |
3 | **课程设计**:许辉 李奇锋
4 |
5 | **组队学习说明**:通过学习pytorch的基本操作,最终完成手写数字的识别
6 |
7 | **任务路线**:安装pytorch->设立图并计算->实现逻辑回归->构建多层神经网络->PyTorch实现L1,L2正则化以及Dropout->书写优化器代码->用PyTorch完成手写数字识别
8 |
9 | **学习周期**:14天
10 |
11 | **定位人群**:熟悉python的基础用法
12 |
13 | **任务完成所需时间**:2-3h/天
14 |
15 | **难度系数**:中
16 | ## 任务预览(2天)
17 | 1. 什么是Pytorch,为什么选择Pytroch?
18 | 2. Pytroch的安装
19 | 3. 配置Python环境
20 | 4. 准备Python管理器
21 | 5. 通过命令行安装PyTorch
22 | 6. PyTorch基础概念
23 | 7. 通用代码实现流程(实现一个深度学习的代码流程)
--------------------------------------------------------------------------------
/深度学习/Keras/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 |
2 | ## Task 4 keras其他功能(3day)
3 | 1、了解keras中的其他功能以及经典样例,并在最后进行两个项目的练习。
4 | * 应用(了解Keras 的应用模块(keras.applications)中带有预训练权值的常见深度学习模型,如VGG16等)
5 | * 后端(了解keras的后端函数set_epsilon,cast_to_floatx等)
6 | * 初始化(了解设置 Keras 各层权重随机初始值的方法。)
7 | * 正则化(了解在优化过程中对层的参数或层的激活情况进行惩罚的正则化方法。)
8 | * 约束项(了解在优化期间如何对网络参数设置约束(例如非负性)。)
9 | * 可视化(了解Keras 模型可视化以及训练历史可视化。)
10 | * 其他工具
11 |
12 | 2、开放性练习,大家可以选择自己感兴趣的任意方面进行编程练习。
13 |
14 | [实现一个用来执行加法的序列到序列学习模型](https://keras-zh.readthedocs.io/examples/addition_rnn/)
15 |
16 |
17 |
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task7.md:
--------------------------------------------------------------------------------
1 | ## Task7(2天)】手写数字识别(给代码截图参考)
2 |
3 | 用PyTorch完成手写数字识别
4 |
5 |
6 | **参考资料**:
7 |
8 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
9 |
10 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
11 |
12 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
13 |
14 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
15 |
16 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
17 |
18 |
19 |
20 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Advanced-algorithm-combing/README.md:
--------------------------------------------------------------------------------
1 | # Advanced-algorithm-combing
2 |
3 | **课程设计**:黑桃,刘广月,于鸿飞
4 |
5 | **组队学习说明**:通过查阅相关文献,对机器学习算法进行梳理
6 |
7 | **任务路线**:RF--->GBDT--->XGB--->LightGBM
8 |
9 | **组队学习周期**:10天
10 |
11 | **定位人群:有概率论、矩阵运算、求导、泰勒展开等基础数学知识;**
12 |
13 | **难度系数**:中
14 |
15 | **每个任务完成大概所需时间:2-3h**
16 |
17 | ## 任务预览(2天)
18 | 1. 集成学习概念
19 | 2. 个体学习器概念
20 | 3. boosting bagging
21 | 4. 结合策略(平均法,投票法,学习法)
22 | 5. 随机森林思想
23 | 6. 随机森林的推广
24 | 7. 优缺点
25 | 8. sklearn参数
26 | 9. 应用场景
27 |
28 |
29 | [任务分配](学习任务)
30 |
31 |
--------------------------------------------------------------------------------
/机器学习/Spark基础/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Task2**(3day)**
4 |
5 | **内容:RDD编程,熟悉算子,读写文件**
6 |
7 | 第3章 Spark编程基础
8 |
9 | [3.1 Spark入门:RDD编程](http://dblab.xmu.edu.cn/blog/1700-2/)
10 |
11 | [3.2 Spark入门:键值对RDD](http://dblab.xmu.edu.cn/blog/1706-2/)
12 |
13 | [3.3 Spark入门:共享变量](http://dblab.xmu.edu.cn/blog/1707-2/)(提升-分布式必备)
14 |
15 | 3.4 数据读写
16 |
17 | [3.4.1 Spark入门:文件数据读写](http://dblab.xmu.edu.cn/blog/1708-2/)
18 |
19 |
20 |
21 | **问题扩展:请用RDD实现一个PAT排名器,题目要求**
22 |
23 | [参考](https://pintia.cn/problem-sets/16/problems/677)
24 |
25 |
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/README.md:
--------------------------------------------------------------------------------
1 | # NLP-theory-practice
2 |
3 |
4 | **课程设计**:jepson
5 |
6 | **组队学习说明**:学习自然语言处理理论,并且通过对某些数据集的文本分类任务不断优化来进行实践。
7 |
8 | **任务路线**:特征提取—>特征选择—>文本表示—>传统机器学习算法跑模型—>LDA生成新特征—>深度学习算法跑模型
9 |
10 | **定位人群**:有Python基础,基本框架的基础(例如TensorFlow、Keras和pyTorch等)!难度系数高
11 |
12 | **组队学习周期**:18天
13 |
14 |
15 |
16 | **每个任务完成大概所需时间**:3-4h
17 |
18 |
19 |
20 |
21 |
22 | ## 任务预览(2天)
23 |
24 | IMDB数据集下载和探索(参考TensorFlow官方教程)
25 |
26 | THUCNews数据集下载和探索(参考博客中的数据集部分和预处理部分)
27 |
28 | 学习召回率、准确率、ROC曲线、AUC、PR曲线这些基本概念
29 |
--------------------------------------------------------------------------------
/基础知识/Python/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 |
2 | # Task1**(2day)**
3 |
4 | 1. 环境搭建
5 |
6 | * anaconda环境配置
7 |
8 | * 解释器
9 |
10 | 1. python初体验
11 |
12 | * print and input
13 |
14 | 1. python基础讲解
15 |
16 | * python变量特性+命名规则
17 |
18 | * 注释方法
19 |
20 | * python中“:”作用
21 |
22 | * 学会使用dir( )及和help( )
23 |
24 | * import使用
25 |
26 | * pep8介绍
27 |
28 |
29 |
30 | 4. python数值基本知识
31 |
32 | * python中数值类型,int,float,bool,e记法等
33 |
34 | * 算数运算符
35 |
36 | * 逻辑运算符
37 |
38 | * 成员运算符
39 |
40 | * 身份运算符
41 |
42 | * 运算符优先级
43 |
44 |
45 |
46 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | # 【Task 3】HDFS常用命令/API+上传下载过程
2 | 1. 认识HDFS
3 | 2. 熟悉hdfs常用命令
4 | 3. Python操作HDFS的其他API
5 | 4. 观察上传后的文件,上传大于128M的文件与小于128M的文件有何区别?
6 | 5. 启动HDFS后,会分别启动NameNode/DataNode/SecondaryNameNode,这些进程的的作用分别是什么?
7 | 6. NameNode是如何组织文件中的元信息的,edits log与fsImage的区别?使用hdfs oiv命令观察HDFS上的文件的metadata
8 | 7. SecondaryNameNode作用是什么?
9 |
10 |
11 | 参考: [https://segmentfault.com/a/1190000002672666](https://segmentfault.com/a/1190000002672666)
12 |
13 | 参考资料:[Python3调用Hadoop的API](https://www.cnblogs.com/sss4/p/10443497.html)
14 |
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | ## Task6(2天)
2 | * 【图】
3 |
4 | 实现有向图、无向图、有权图、无权图的邻接矩阵和邻接表表示方法
5 |
6 | 实现图的深度优先搜索、广度优先搜索
7 |
8 | 实现 Dijkstra 算法、A* 算法
9 |
10 |
11 | 实现拓扑排序的 Kahn 算法、DFS 算法
12 |
13 | * 练习:
14 |
15 | Number of Islands(岛屿的个数)
16 |
17 | 英文版:https://leetcode.com/problems/number-of-islands/description/
18 |
19 | 中文版:https://leetcode-cn.com/problems/number-of-islands/description/
20 |
21 |
22 |
23 | Valid Sudoku(有效的数独)
24 |
25 | 英文版:https://leetcode.com/problems/valid-sudoku/
26 |
27 | 中文版:https://leetcode-cn.com/problems/valid-sudoku/
--------------------------------------------------------------------------------
/机器学习/Primary-algorithm-combing/README.md:
--------------------------------------------------------------------------------
1 | # Primary-algorithm-combing
2 |
3 |
4 | **课程设计**:苏静、康兵兵
5 |
6 | **组队学习说明**:通过查阅书籍或参考文献、学习视频等,对传统机器学习算法进行梳理
7 |
8 | **任务路线**:线性回归--->逻辑回归--->决策树
9 |
10 | **组队学习周期**:7天
11 |
12 | **定位人群**:有概率论、矩阵运算、求导、泰勒展开等基础数学知识
13 |
14 | **难度系数**:低
15 |
16 | **每个任务完成大概所需时间:2-3h**
17 |
18 |
19 | ## 任务预览(2天)
20 | 1. 机器学习的一些概念
21 | 有监督、无监督、泛化能力、过拟合欠拟合(方差和偏差以及各自解决办法)、交叉验证
22 | 2. 线性回归的原理
23 | 3. 线性回归损失函数、代价函数、目标函数
24 | 4. 优化方法(梯度下降法、牛顿法、拟牛顿法等)
25 | 5. 线性回归的评估指标
26 | 6. sklearn参数详解
27 |
28 | **课程详情**:
29 |
30 | [任务分配](学习任务)
31 |
32 | [参考答案](./参考答案)
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ## 【Task3(2天)】PyTorch实现Logistic regression
2 | 1. PyTorch基础实现代码
3 | 2. 用PyTorch类实现Logistic regression,torch.nn.module写网络结构
4 |
5 | **参考资料**:
6 |
7 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
8 |
9 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
10 |
11 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
12 |
13 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
14 |
15 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
16 |
17 |
18 |
19 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## Task2 特征提取 (2 days)
2 |
3 | 1. 基本文本处理技能
4 |
5 | 1.1 分词的概念(分词的正向最大、逆向最大、双向最大匹配法);
6 |
7 | 1.2 词、字符频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
8 |
9 | 2. 语言模型
10 |
11 | 2.1 语言模型中unigram、bigram、trigram的概念;
12 |
13 | 2.2 unigram、bigram频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
14 |
15 | 3. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化
16 |
17 | 步骤有:
18 |
19 | 分词(可采用结巴分词来进行分词操作,其他库也可以);去停用词;构造词表。
20 |
21 | 每篇文档的向量化。
22 |
23 | 4. 参考
24 |
25 | 结巴分词介绍和使用:
26 |
27 | [GitHub - fxsjy/jieba: 结巴中文分词](https://github.com/fxsjy/jieba)
28 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task7.md:
--------------------------------------------------------------------------------
1 |
2 | # 【Task7】实践
3 |
4 | 1. 计算每个content的CTR。
5 |
6 | 数据集下载:链接:https://pan.baidu.com/s/1YDvBWp35xKLg5zsysEjDGA 提取码:rpgs
7 |
8 | 2. 【选做】 使用Spark实现ALS矩阵分解算法
9 |
10 | movielen 数据集:http://files.grouplens.org/datasets/movielens/ml-100k.zip
11 |
12 | [基于ALS矩阵分解算法的Spark推荐引擎实现](https://www.cnblogs.com/muchen/p/6882465.html)
13 |
14 | 3. 使用Spark分析Amazon DataSet(实现 Spark LR、Spark TFIDF)
15 |
16 | 数据集:[http://jmcauley.ucsd.edu/data/amazon/](http://jmcauley.ucsd.edu/data/amazon/)
17 |
18 | **preprocess**
19 |
20 | * Spark LR
21 |
22 | * Spark TFIDF
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ## Task3(2天)
2 | * 【排序】
3 |
4 | 实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做)(完成leetcode上的返回滑动窗口中的最大值(239),这是上一期第三天的任务进行保留(涉及队列可以对第二天进行整理复习))
5 |
6 | 编程实现 O(n) 时间复杂度内找到一组数据的第 K 大元素
7 |
8 | * 练习:
9 |
10 | 中文版:https://leetcode-cn.com/problems/sliding-window-maximum/
11 |
12 | 英文版:https://leetcode.com/problems/sliding-window-maximum/
13 |
14 | * 【二分查找】
15 |
16 | 实现一个有序数组的二分查找算法
17 |
18 | 实现模糊二分查找算法(比如大于等于给定值的第一个元素)
19 |
20 | * 练习:
21 |
22 | Sqrt(x) (x 的平方根)
23 |
24 | 英文版:https://leetcode.com/problems/sqrtx/
25 |
26 | 中文版:https://leetcode-cn.com/problems/sqrtx/
--------------------------------------------------------------------------------
/基础知识/Python/README.md:
--------------------------------------------------------------------------------
1 | # Python
2 |
3 | 【课程简介】
4 |
5 | **课程设计**:马晶敏,叶梁
6 |
7 | **组队学习说明**:学习python基础知识,针对python小白的学习之路
8 |
9 | **任务路线**:基础知识-函数-第三方模块-类和对象
10 |
11 | **组队学习周期**:10天
12 |
13 | **定位人群**:python小白,难度系数低
14 |
15 | **每个任务完成大概所需时间**:每天平均花费时间2小时-4小时不等,根据个人学习接受能力强弱有所浮动
16 |
17 |
18 |
19 | ## 任务预览(2天)
20 |
21 | 1. 环境搭建
22 |
23 | 2. python初体验
24 |
25 | 3. python基础讲解
26 |
27 |
28 |
29 | python变量特性+命名规则、注释方法、python中“:”作用、学会使用dir( )及和help( )、import使用、pep8介绍
30 |
31 |
32 |
33 | 4. python数值基本知识
34 |
35 | python中数值类型,int,float,bool,e记法等、算数运算符、逻辑运算符、成员运算符、身份运算符、运算符优先级
36 |
--------------------------------------------------------------------------------
/数据科学/Scrapy/README.md:
--------------------------------------------------------------------------------
1 | # Scrapy
2 |
3 | **课程设计**:光城、李方
4 |
5 | **组队学习说明**:从零基础到能独立完成一个简易的爬虫项目
6 |
7 | **任务路线**:请求→re→beautifulsoup→lxml→selenium→IP问题→实战小项目
8 |
9 | **组队学习周期**:7天
10 |
11 | **定位人群**:有Python基础。难度系数中
12 |
13 | **每个任务完成大概所需时间**:2-3h/天
14 |
15 |
16 | ## 任务预览(2天)
17 |
18 | 1. 学习get与post请求,尝试使用requests或者是urllib用get方法向https://www.baidu.com/发出一个请求,并将其返回结果输出。
19 |
20 | 2. 如果是断开了网络,再发出申请,结果又是什么。了解申请返回的状态码。
21 |
22 | 3. 了解什么是请求头,如何添加请求头。
23 |
24 | 4. 学习什么是正则表达式并尝试一些正则表达式并进行匹配。
25 |
26 | 5. 然后结合requests、re两者的内容爬取https://movie.douban.com/top250里的内容
27 |
28 | 6. 要求抓取名次、影片名称、国家、导演等字段。
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## 【Task4(2天)】用PyTorch实现多层网络(给代码截图参考)
2 | 1. 引入模块,读取数据
3 | 2. 构建计算图(构建网络模型)
4 | 3. 损失函数与优化器
5 | 4. 开始训练模型
6 | 5. 对训练的模型预测结果进行评估
7 |
8 |
9 | **参考资料**:
10 |
11 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
12 |
13 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
14 |
15 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
16 |
17 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
18 |
19 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
20 |
21 |
22 |
23 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/机器学习/Spark基础/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | # Task4 **(2day)**
5 |
6 | **内容:MLlib流设计,特征工程**
7 |
8 | 第6章 Spark MLlib
9 |
10 | [6.1 Spark MLlib简介](http://dblab.xmu.edu.cn/blog/1762-2/)
11 |
12 | 6.2 机器学习工作流
13 |
14 | [6.2.1 机器学习工作流(ML Pipelines) ](http://dblab.xmu.edu.cn/blog/1763-2/)
15 |
16 | [6.2.2 构建一个机器学习工作流](http://dblab.xmu.edu.cn/blog/1764-2/)
17 |
18 | 6.3 特征抽取、转化和选择
19 |
20 | [6.3.1 特征抽取:TF-IDF](http://dblab.xmu.edu.cn/blog/1766-2/)
21 |
22 | [6.3.4 特征变换:标签和索引的转化](http://dblab.xmu.edu.cn/blog/1770-2/)
23 |
24 | [6.3.5 特征选取:卡方选择器](http://dblab.xmu.edu.cn/blog/1771-2/)
25 |
26 |
27 |
--------------------------------------------------------------------------------
/基础知识/Statistical/README.md:
--------------------------------------------------------------------------------
1 | # Statistical
2 |
3 | **课程设计**:王佳鑫、许辉
4 |
5 | **组队学习说明**:学习内容涵盖统计学中所有的主要知识,并对其分部分进行梳理总结。
6 |
7 | **任务路线**:根据所学习内容进行(1)统计学基本知识、二项及泊松分布、大数定律、正态分布等内容的总结进行整体的回顾、梳理与完善;(2)中心极限定理、置信区间、 假设检验等内容的总结进行整体的回顾、梳理与完善。
8 |
9 | **组队学习周期**:7天
10 |
11 | **定位人群**:微积分、基本概率知识储备,难度系数中
12 |
13 | **每个任务完成大概所需时间**:2-3h
14 |
15 | **学习内容**
16 |
17 | (1)本次统计学学习以网易云可汗学院公开课为主:
18 |
19 | 视频链接:http://open.163.com/special/Khan/khstatistics.html
20 |
21 | (2)并以《深入浅出统计学》为辅:
22 |
23 | 书籍链接:https://pan.baidu.com/s/1dCV6rrOWZU-deKxAoectGA
24 |
25 |
26 |
27 | ## 任务预览(2天)
28 |
29 | 学习内容 1:统计学基本知识、二项及泊松分布
30 |
31 | 学习内容 2: 大数定律、正态分布
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | ## 【Task5(2天)】PyTorch实现L1,L2正则化以及Dropout(给代码截图参考)
2 | 1. 了解知道Dropout原理
3 | 2. 用代码实现正则化(L1、L2、Dropout)
4 | 3. Dropout的numpy实现
5 | 4. PyTorch中实现dropout
6 | 5. 参考资料:PyTorch 中文文档
7 |
8 |
9 | **参考资料**:
10 |
11 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
12 |
13 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
14 |
15 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
16 |
17 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
18 |
19 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
20 |
21 |
22 |
23 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## 【Task2(2天)】设立计算图并自动计算(给代码截图参考)
2 | 1. numpy和pytorch实现梯度下降法
3 | 2. 设定初始值
4 | 3. 求取梯度
5 | 4. 在梯度方向上进行参数的更新
6 | 5. numpy和pytorch实现线性回归
7 | 6. pytorch实现一个简单的神经网络
8 | 7. 参考资料:PyTorch 中文文档
9 |
10 | **参考资料**:
11 |
12 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
13 |
14 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
15 |
16 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
17 |
18 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
19 |
20 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
21 |
22 |
23 |
24 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/数据科学/Scrapy/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 |
2 | # **Task1(2天)**
3 |
4 | ## **1.1 学习get与post请求**
5 |
6 | 1. 学习get与post请求,尝试使用requests或者是urllib用get方法向[https://www.baidu.com/](https://www.baidu.com/)发出一个请求,并将其返回结果输出。
7 |
8 | 2. 如果是断开了网络,再发出申请,结果又是什么。了解申请返回的状态码。
9 |
10 | 3. 了解什么是请求头,如何添加请求头。
11 |
12 | ## **1.2 正则表达式**
13 |
14 | 1. 学习什么是正则表达式并尝试一些正则表达式并进行匹配。
15 |
16 | 2. 然后结合requests、re两者的内容爬取[https://movie.douban.com/top250](https://movie.douban.com/top250)里的内容
17 |
18 | 3. 要求抓取名次、影片名称、年份、导演等字段。
19 |
20 | 4. 参考资料: [https://desmonday.github.io/2019/03/02/python爬虫学习-day2正则表达式/](https://desmonday.github.io/2019/03/02/python爬虫学习-day2正则表达式/)
21 |
22 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ## 【Task1(2天)】PyTorch的基本概念
2 |
3 | 1. 什么是Pytorch,为什么选择Pytroch?
4 | 2. Pytroch的安装
5 | 3. 配置Python环境
6 | 4. 准备Python管理器
7 | 5. 通过命令行安装PyTorch
8 | 6. PyTorch基础概念
9 | 7. 通用代码实现流程(实现一个深度学习的代码流程)
10 |
11 | **参考资料**:
12 |
13 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
14 |
15 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
16 |
17 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
18 |
19 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
20 |
21 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
22 |
23 |
24 |
25 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/深度学习/Pytorch/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | ## 【Task6(2天)】PyTorch理解更多神经网络优化方法
2 |
3 | 1. 了解不同优化器
4 | 2. 书写优化器代码
5 | 3. Momentum
6 | 4. 二维优化,随机梯度下降法进行优化实现
7 | 5. Ada自适应梯度调节法
8 | 6. RMSProp
9 | 7. Adam
10 | 8. PyTorch种优化器选择
11 |
12 |
13 |
14 | **参考资料**:
15 |
16 | [新手必备 | 史上最全的PyTorch学习资源汇总](https://mp.weixin.qq.com/s/YO8hoZzOWy025LhPdBGpEA)
17 |
18 | [快速上手笔记,PyTorch模型训练实用教程(附代码)](https://mp.weixin.qq.com/s/c7QEnZ0_NTY1aUaoZ4nT7g)
19 |
20 | [PyTorch学习笔记](https://github.com/tensor-yu/PyTorch_Tutorial)
21 |
22 | [《深度学习框架PyTorch:入门与实践》的对应代码](https://github.com/chenyuntc/pytorch-book)
23 |
24 | [PyTorch 中文文档](http://t.cn/RoUCYdB)
25 |
26 |
27 |
28 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | ## Task3 特征选择 (2 days)
2 |
3 | 1. TF-IDF原理。
4 |
5 | 2. 文本矩阵化,使用词袋模型,以TF-IDF特征值为权重。(可以使用Python中TfidfTransformer库)
6 |
7 | 3. 互信息的原理。
8 |
9 | 4. 使用第二步生成的特征矩阵,利用互信息进行特征筛选。
10 |
11 | 5. 参考
12 |
13 | [文本挖掘预处理之TF-IDF:文本挖掘预处理之TF-IDF - 刘建平Pinard - 博客园](https://www.cnblogs.com/pinard/p/6693230.html)
14 |
15 | [使用不同的方法计算TF-IDF值:使用不同的方法计算TF-IDF值 - 简书](https://www.jianshu.com/p/f3b92124cd2b)
16 |
17 | [sklearn-点互信息和互信息:sklearn:点互信息和互信息 - 专注计算机体系结构 - CSDN博客](https://blog.csdn.net/u013710265/article/details/72848755)
18 |
19 | [如何进行特征选择(理论篇)机器学习你会遇到的“坑”:如何进行特征选择(理论篇)机器学习你会遇到的“坑” ](https://baijiahao.baidu.com/s?id=1604074325918456186&wfr=spider&for=pc)
--------------------------------------------------------------------------------
/深度学习/Keras/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 | ## Task3 数据预处理(2 days)
3 | 1、了解在keras中如何处理数据,并选择常用数据集中任意数据集进行数据处理练习。
4 | * 序列预处理,(了解序列预处理的常用函数TimeseriesGenerator)
5 | * 文本预处理(了解文本数据常用的处理函数Tokenizer等。)
6 | * 图像预处理(了解图像预处理的函数ImageDataGenerator等。)
7 | * 损失函数(了解常用的损失函数mean_squared_error等)
8 | * 评估标准(了解评价函数metrics的用法)
9 | * 优化器(优化器 (optimizer) 是编译 Keras 模型的所需的两个参数之一,了解优化器可选的参数如SGD等。)
10 | * 激活函数(了解激活函数除了通过设置单独的激活层实现,也可以在构造层对象时通过传递 activation 参数实现)
11 | * 回调(了解回调函数,使用回调函数来查看训练模型的内在状态和统计。)
12 |
13 | 2、尝试用已下载的数据集,用keras完成boston房价数据预测的回归问题练习。
14 |
15 | 参考资料:
16 | [序列预处理](https://keras-zh.readthedocs.io/preprocessing/sequence/)
17 | [Keras学习之3:回归问题(boston_housing数据为例)](https://blog.csdn.net/cskywit/article/details/80899571)
18 |
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | ## Task6 神经网络基础 (2 days )
2 | 建议第一天基础,第二天FastText
3 | * 前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数的概念。
4 | * 感知机相关;定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。
5 | * 激活函数的种类以及各自的提出背景、优缺点。(和线性模型对比,线性模型的局限性,去线性化)
6 | * 深度学习中的正则化(参数范数惩罚:L1正则化、L2正则化;数据集增强;噪声添加;early stop;**Dropout层**)、正则化的介绍。
7 | * 深度模型中的优化:参数初始化策略;自适应学习率算法(梯度下降、AdaGrad、RMSProp、Adam;优化算法的选择);**batch norm层**(提出背景、解决什么问题、层在训练和测试阶段的计算公式);layer norm层。
8 | * FastText的原理。
9 | * 利用FastText模型进行文本分类。
10 | * [fasttext1](https://github.com/facebookresearch/fastText#building-fasttext-for-python) [fasttext2](https://github.com/salestock/fastText.py) [fasttext3 其中的参考](https://jepsonwong.github.io/2018/05/02/fastText/)
11 |
12 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/数据科学/Scrapy/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 | # Task3(2天)
3 |
4 | ## **3.1 安装selenium并学习**
5 |
6 | 1. 安装selenium并学习。
7 |
8 | 2. 使用selenium模拟登陆163邮箱。
9 |
10 | 3. 163邮箱直通点:[https://mail.163.com/](https://mail.163.com/) 。
11 |
12 | 4. 参考资料:[https://blog.csdn.net/weixin_42937385/article/details/88150379](https://blog.csdn.net/weixin_42937385/article/details/88150379)
13 |
14 | ## **3.2 学习IP相关知识**
15 |
16 | 1. 学习什么是IP,为什么会出现IP被封,如何应对IP被封的问题。
17 |
18 | 2. 抓取西刺代理,并构建自己的代理池。
19 |
20 | 3. 西刺直通点:[https://www.xicidaili.com/](https://www.xicidaili.com/) 。
21 |
22 | 4. 参考资料:[https://blog.csdn.net/weixin_43720396/article/details/88218204](https://blog.csdn.net/weixin_43720396/article/details/88218204)
23 |
24 |
25 | [参考答案](./../参考答案)
26 |
--------------------------------------------------------------------------------
/理论应用/图像处理基础/Image_Processing/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | 【task1(2天)】 初识opencv
2 |
3 | 1. 什么是opencv,它有哪些优势?
4 | 2. opencv 安装和环境配置
5 | 3. 了解数字图像的基本概念:像素、彩色图像、灰度图像、二值图像、图像算数操作
6 | 4. 练习numpy中array的基本操作
7 | 5. 练习图像的加载、保存、以及算术操作
8 |
9 | **参考资料**:
10 |
11 | 主要推荐两本书
12 |
13 | 一本岗萨雷斯的数字图像处理讲原理(必读经典)
14 |
15 | 一本opencv3编程入门(入门)
16 |
17 | 一本opencv3 计算机视觉 Python语言实现(进阶)
18 |
19 | 链接:https://pan.baidu.com/s/1ZW_c1ZeD1tdb-MmINXTAZw
20 |
21 | 提取码:9ui7
22 |
23 | 链接:https://pan.baidu.com/s/1elGl2yNJ95eYzuV-lEMewA
24 |
25 | 提取码:ofay
26 |
27 | 链接:https://pan.baidu.com/s/1Nl5OxQ2c4e5s_qSoTipBTQ
28 |
29 | 提取码:awkn
30 |
31 | 官方文档:https://opencv.org/releases/
32 |
33 | https://www.bilibili.com/video/av24998616?from=search&seid=13314634921990920315
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ### 【Task1(2天)】
2 | 完成4章的学习及作业1,代码实现的过程上传到GitHub
3 |
4 | 【参考资料(择一即可)】
5 |
6 | 视频版
7 |
8 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
9 |
10 | 网页版
11 |
12 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
13 |
14 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
15 |
16 | 文档版
17 |
18 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
19 |
20 |
21 |
22 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
23 |
24 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task7.md:
--------------------------------------------------------------------------------
1 | ### 【Task7(3天)】
2 | 完成大作业及学习总结,代码实现的过程上传到GitHub
3 |
4 | 【参考资料(择一即可)】
5 |
6 | 视频版
7 |
8 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
9 |
10 | 网页版
11 |
12 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
13 |
14 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
15 |
16 | 文档版
17 |
18 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
19 |
20 |
21 |
22 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
23 |
24 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 | ### 【Task2(3天)】
3 | 完成5+6章的学习,代码实现的过程上传到GitHub
4 |
5 | 【参考资料(择一即可)】
6 |
7 | 视频版
8 |
9 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
10 |
11 | 网页版
12 |
13 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
14 |
15 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
16 |
17 | 文档版
18 |
19 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
20 |
21 |
22 |
23 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
24 |
25 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 | ### 【Task3(3天)】
3 | 完成7+8章的学习,代码实现的过程上传到GitHub
4 |
5 | 【参考资料(择一即可)】
6 |
7 | 视频版
8 |
9 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
10 |
11 | 网页版
12 |
13 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
14 |
15 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
16 |
17 | 文档版
18 |
19 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
20 |
21 |
22 |
23 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
24 |
25 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 | ### 【Task6(2天)】
2 | 完成11章的学习,代码实现的过程上传到GitHub
3 |
4 |
5 | 【参考资料(择一即可)】
6 |
7 | 视频版
8 |
9 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
10 |
11 | 网页版
12 |
13 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
14 |
15 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
16 |
17 | 文档版
18 |
19 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
20 |
21 |
22 |
23 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
24 |
25 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ### 【Task4(3天)】
2 | 完成10+12章的学习及作业2,代码实现的过程上传到GitHub
3 |
4 | 【参考资料(择一即可)】
5 |
6 | 视频版
7 |
8 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
9 |
10 | 网页版
11 |
12 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
13 |
14 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
15 |
16 | 文档版
17 |
18 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
19 |
20 |
21 |
22 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
23 |
24 |
25 |
--------------------------------------------------------------------------------
/机器学习/Spark基础/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # **Task3(2day)**
4 |
5 | **内容:DataFrame,SparkSQL**
6 |
7 | 第4章
8 |
9 | [4.1 Spark SQL简介](http://dblab.xmu.edu.cn/blog/1717-2/)
10 |
11 | [4.2 DataFrame与RDD的区别](http://dblab.xmu.edu.cn/blog/1718-2/)
12 |
13 | [4.3 DataFrame的创建](http://dblab.xmu.edu.cn/blog/1719-2/)
14 |
15 | [4.4 从RDD转换得到DataFrame](http://dblab.xmu.edu.cn/blog/1720-2/)
16 |
17 | [4.5.2 通过JDBC连接数据库(DataFrame)](http://dblab.xmu.edu.cn/blog/1724-2/)
18 |
19 |
20 |
21 | 第5章
22 |
23 | [5.1 流计算简介](http://dblab.xmu.edu.cn/blog/1732-2/)
24 |
25 | [5.2 Spark Streaming简介](http://dblab.xmu.edu.cn/blog/1733-2/)
26 |
27 | 第5.3节 DStream操作
28 |
29 | [5.3.1 DStream操作概述](http://dblab.xmu.edu.cn/blog/1737-2/)
30 |
31 |
32 |
33 | **问题扩展:请简述下spark sql的运行机制。**
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## Task4 (2day)
2 |
3 | ### 朴素贝叶斯
4 |
5 | * 朴素贝叶斯的原理(了解)
6 |
7 | * 利用朴素贝叶斯模型进行文本分类
8 |
9 | * [朴素贝](https://blog.csdn.net/u013710265/article/details/72780520)[叶](https://blog.csdn.net/u013710265/article/details/72780520)[斯](https://blog.csdn.net/u013710265/article/details/72780520)[1](https://blog.csdn.net/u013710265/article/details/72780520)
10 |
11 | ### SVM模型
12 |
13 | * SVM的原理(了解)
14 |
15 | * 利用SVM模型进行文本分类
16 |
17 | ### LDA主题模型
18 |
19 | * pLSA、共轭先验分布
20 |
21 | * LDA原理(了解)
22 |
23 | * 使用LDA生成主题特征,在之前特征的基础上加入主题特征进行文本分类
24 |
25 | * LDA数学八卦 [lda2](https://blog.csdn.net/u013710265/article/details/73480332) [合并特征](https://blog.csdn.net/u013710265/article/details/72848564)
26 |
27 |
28 |
29 | [参考答案](./../参考答案)
30 |
31 |
32 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task0.md:
--------------------------------------------------------------------------------
1 | ### 【Task0(1天)】
2 |
3 | 学习使用Git上传文件至Github,Jupyter notebook基础环境搭建
4 |
5 |
6 |
7 | 【参考资料(择一即可)】
8 |
9 | 视频版
10 |
11 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
12 |
13 | 网页版
14 |
15 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
16 |
17 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
18 |
19 | 文档版
20 |
21 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
22 |
23 |
24 |
25 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/数据科学/Scrapy/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 | # **Task2(2天)**
3 |
4 | ## **2.1 学习beautifulsoup**
5 |
6 | 1. 学习beautifulsoup,并使用beautifulsoup提取内容。
7 |
8 | 2. 使用beautifulsoup提取丁香园论坛的回复内容。
9 |
10 | 3. 丁香园直通点:[http://www.dxy.cn/bbs/thread/626626#626626](http://www.dxy.cn/bbs/thread/626626#626626) 。
11 |
12 | 4. 参考资料:[https://blog.csdn.net/wwq114/article/details/88085875](https://blog.csdn.net/wwq114/article/details/88085875)
13 |
14 | ## **2.2学习xpath **
15 |
16 | 1. 学习xpath,使用lxml+xpath提取内容。
17 |
18 | 2. 使用xpath提取丁香园论坛的回复内容。
19 |
20 | 3. 丁香园直通点:[http://www.dxy.cn/bbs/thread/626626#626626](http://www.dxy.cn/bbs/thread/626626#626626) 。
21 |
22 | 4. 参考资料:[https://blog.csdn.net/naonao77/article/details/88129994](https://blog.csdn.net/naonao77/article/details/88129994)
23 |
24 |
25 | [参考答案](./../参考答案)1
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | # 【Task1】创建虚拟机+熟悉linux(2day)
2 |
3 | 1. [创建三台虚拟机](https://mp.weixin.qq.com/s/WkjX8qz7nYvuX4k9vaCdZQ)
4 | 2. 在本机使用Xshell连接虚拟机
5 | 3. [CentOS7配置阿里云yum源和EPEL源](https://www.cnblogs.com/jimboi/p/8437788.html)
6 | 4. 安装jdk
7 | 5. 熟悉linux 常用命令
8 | 6. shell 变量/函数
9 |
10 | 注意:
11 | * 电脑系统需要64位(4g+)
12 | * 三台虚拟机的运行内存不能超过电脑的运行内存
13 | * 三台虚拟机ip不能一样,否则会有冲突、
14 |
15 |
16 |
17 | 参考资料:
18 | 1. [安装ifconfig](https://jingyan.baidu.com/article/363872ec26bd0f6e4aa16f59.html)
19 | 2. [bash: wget: command not found的两种解决方法](https://www.cnblogs.com/areyouready/p/8909665.html)
20 | 3. linux系统下载ssh服务
21 | 4. [关闭windows的防火墙!如果不关闭防火墙的话,可能和虚拟机直接无法ping通!](https://www.linuxidc.com/Linux/2017-11/148427.htm)
22 | 5. 大数据软件 :[链接](https://pan.baidu.com/s/17fEq3IPVoeE29cWCrSpO8Q) 提取码:finf
23 |
--------------------------------------------------------------------------------
/数据科学/Excel/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 |
2 | 1. 数据透视表(2天)
3 | ### 创建数据透视表
4 | ### 数据透视表字段与区域
5 | 筛选
6 | 行
7 | 列
8 | 值
9 | ### 如何改变数据透视表布局
10 | 分类汇总
11 | 总计
12 | 报表布局
13 | ### 数据透视表刷新
14 | 手动刷新
15 | 设置全部刷新
16 | 打开文件时自动刷新
17 | ### 实现数据分段统计
18 | 自动等距离组合
19 | 自定义组合
20 | ### 变更值汇总依据
21 | 求和
22 | 计数
23 | 平均值
24 | 最大/最小值
25 | 乘积
26 | ### 设置三种值百分比
27 | 总计百分比
28 | 分类百分比
29 | ### 计算字段和计算项
30 |
31 | ### (补充,非必修)学习数据透视图
32 |
33 |
34 | ### 作业
35 | 任务一
36 | 1.1统计汇总每个城市大专、本科、硕士、博士的招聘人数,对学历没有要求的招聘不计算在内,效果图如下:
37 | 
38 |
39 | 1.2统计汇总每个城市大专、本科、硕士、博士的最低工资平均值,对学历没有要求的招聘不计算在内,效果图如下:
40 | 
41 |
42 | 任务二
43 | 使用筛选器,统计每个城市,不同的工作年限,不同的学历,最低工资的平均值是多少,对学历和工作年限没有要求的不计算在内,效果如下
44 | 
45 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # 【Task5】Spark常用API
4 | 1. spark集群搭建
5 | 2. 初步认识Spark (解决什么问题,为什么比Hadoop快,基本组件及架构Driver/)
6 | 3. 理解spark的RDD
7 | 4. 使用shell方式操作Spark,熟悉RDD的基本操作
8 | 5. 使用jupyter连接集群的pyspark
9 | 6. 理解Spark的shuffle过程
10 | 7. 学会使用SparkStreaming
11 | 8. 说一说take,collect,first的区别,为什么不建议使用collect?(虽然我用了。。。)
12 | 9. 向集群提交Spark程序
13 | 10. 使用spark计算《The man of property》中共出现过多少不重复的单词,以及出现次数最多的10个单词。
14 | 11. 计算出movielen数据集中,平均评分最高的五个电影。
15 | 12. 计算出movielen中,每个用户最喜欢的前5部电影
16 | 13. 学会阅读Spark源码,整理Spark任务submit过程
17 |
18 | 参考资料:
19 |
20 | [远程连接jupyter](https://blog.csdn.net/qq_18293213/article/details/72910834)
21 |
22 | 【没有jblas库解决办法】
23 |
24 | 下载jblas包 :[https://pan.baidu.com/s/1o8w6Wem](https://pan.baidu.com/s/1o8w6Wem)
25 |
26 | 运行spark-shell时添加jar:spark-shell --jars [jblas path] /jblas-1.2.4.jar
27 |
--------------------------------------------------------------------------------
/数据科学/Excel/README.md:
--------------------------------------------------------------------------------
1 | ## 【 Excel入门课程】
2 |
3 | **课程设计**:杨煜,李严
4 |
5 | **组队学习说明**:职场人士必备学习内容。通过集中式学习和大量实战练习,快速了解并掌握Excel核心功能,保证今后工作中用得到。
6 |
7 | **任务路线**:基础界面(2天) --> 基础文件操作&单元格操作(2天) --> 基础函数(2天) --> 查找函数vlookup和 match/index(2天) --> 基础图表(3天) --> 数据透视表(2天)
8 |
9 | **组队学习周期**:11天
10 |
11 | **定位人群**:小白或有一点基础但不熟练的人群;初入职场人群必学;难度系数简单
12 |
13 | **每个任务完成大概所需时间**:2-3h/每天
14 |
15 | ##任务预览(2天)
16 |
17 | 文件操作
18 |
19 | 新建workbook
20 |
21 | 新建sheet/移动sheet/重命名sheet/修改sheet颜色、sheet种类: 工作表/图表/宏表等、保存为xls/xlsx/csv
22 |
23 | 基础单元格操作
24 |
25 | 输入数据、数据格式、合并单元格、自动填充、选择性粘贴、去重、分列、排序、筛选、条件格式、插入下拉列表、行高列宽设置、冻结首行首列、边框、单元格换行
26 |
27 | **作业**:
28 |
29 | **任务一**:
30 |
31 | 生成一个行高30,列宽15(第六列列宽45),名为“Excel组队学习”的表,冻结窗格1-3行
32 |
33 | **任务二**:
34 |
35 | 操作对象为任务一生成的“Excel组队学习”表
36 |
37 | 将第六列分列,效果如下
38 |
39 | 利用条件格式,将薪资列大于8000的收入填充为深绿色,并将它们筛选出来
40 |
41 | 第二列将重复值删除,只保留唯一值
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task6.md:
--------------------------------------------------------------------------------
1 |
2 | # 【Task6】Hive原理及其使用
3 | 1. 安装MySQL、Hive
4 | 2. 采用MySQL作为hive元数据库
5 | 3. Hive与传统RDBMS的区别
6 | 4. HIve原理及架构图
7 | 5. HQL的基本操作(Hive中的SQL)
8 | 6. Hive内部表/外部表/分区
9 |
10 |
11 | 参考资料:
12 |
13 |
14 | [https://www.shiyanlou.com/courses/running](https://www.shiyanlou.com/courses/running)
15 |
16 | [MySQL安装](https://blog.csdn.net/z13615480737/article/details/78906598)
17 |
18 | [采用MySQL作为hive元数据库](https://blog.csdn.net/u010003835/article/details/80324038)
19 |
20 | [Hive on Spark环境部署](https://www.cnblogs.com/xinfang520/p/7684605.html)
21 |
22 | [https://blog.csdn.net/qq_26937525/article/details/54136317](https://blog.csdn.net/qq_26937525/article/details/54136317)
23 |
24 | [https://docs.azure.cn/zh-cn/hdinsight/hadoop/python-udf-hdinsight](https://docs.azure.cn/zh-cn/hdinsight/hadoop/python-udf-hdinsight)
25 |
26 |
--------------------------------------------------------------------------------
/深度学习/Keras/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 | ## Task2 keras的网络层 (2 days)
3 | 1、熟悉各个网络层的使用同时可以加深对理论的理解,最后可以尝试编写自己的网络层。
4 | * 核心网络层(了解全连接层Dense,激活函数Activation等。)
5 | * 卷积层(了解常用的卷积层的创建。Conv1D,Conv2D等。)
6 | * 池化层(了解常用的池化方式最大池化MaxPooling1D,平均池化AveragePooling1D等。)
7 | * 局部连接层(了解局部连层的创建如1D 输入的局部连接层LocallyConnected1D。)
8 | * 循环层(了解常用循环层的创建如RNN,GRU等。)
9 | * 嵌入层(适用于文本数据的神经网络层)
10 | * 融合层(Add,Substract等)
11 | * 高级激活层(了解常用的激活函数softmax,Relu等。)
12 | * 噪声层(了解在缓解过拟合时应该如何选择合适的噪声层。)
13 | * 层封装器
14 |
15 | 2、尝试用已下载的数据集,用keras完成minist手写识别的分类问题练习。
16 |
17 | 参考资料:
18 |
19 | [Keras 网络层](https://keras-zh.readthedocs.io/layers/about-keras-layers/)
20 |
21 | [深度学习中Keras中的Embedding层的理解与使用](https://juejin.im/entry/5acc23f26fb9a028d1416bb3)
22 |
23 | [keras学习笔记(五):TimeDistributed详解](https://blog.csdn.net/linxid/article/details/86316250)
24 |
25 | [keras入门--Mnist手写体识别 - 胡卫雄 - 博客园](https://www.cnblogs.com/ncuhwxiong/p/9836648.html)
26 |
27 |
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | ## Task4(2天)
2 | * 【散列表(哈希表)】
3 |
4 | 实现一个基于链表法解决冲突问题的散列表
5 |
6 | 实现一个 LRU 缓存淘汰算法
7 |
8 | * 练习:
9 |
10 | 两数之和
11 |
12 | 英文版:https://leetcode.com/problems/two-sum/
13 |
14 | 中文版:https://leetcode-cn.com/problems/two-sum/
15 |
16 |
17 | * 【字符串】
18 |
19 | 实现一个字符集,只包含 a~z 这 26 个英文字母的 Trie 树
20 |
21 | 实现朴素的字符串匹配算法
22 |
23 | * 练习:
24 |
25 | Reverse String (反转字符串)
26 |
27 | 英文版:https://leetcode.com/problems/reverse-string/
28 |
29 | 中文版:https://leetcode-cn.com/problems/reverse-string/
30 |
31 | Reverse Words in a String(翻转字符串里的单词)
32 |
33 | 英文版:https://leetcode.com/problems/reverse-words-in-a-string/
34 |
35 | 中文版:https://leetcode-cn.com/problems/reverse-words-in-a-string/
36 |
37 | String to Integer (atoi)(字符串转换整数 (atoi))[作为可选]
38 |
39 | 英文版:https://leetcode.com/problems/string-to-integer-atoi/
40 |
41 | 中文版:https://leetcode-cn.com/problems/string-to-integer-atoi/
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 |
2 | # 【Task 2】搭建Hadoop集群(3day)
3 |
4 | 1. 搭建HA的Hadoop集群并验证,3节点(1主2从),理解HA/Federation,并截图记录搭建过程
5 | 2. 阅读Google三大论文,并总结
6 | 3. Hadoop的作用(解决了什么问题)/运行模式/基础组件及架构
7 | 4. 学会阅读HDFS源码,并自己阅读一段HDFS的源码(推荐HDFS上传/下载过程)
8 | 5. Hadoop中各个组件的通信方式,RPC/Http等
9 | 6. 学会写WordCount(Java/Python-Hadoop Streaming),理解分布式/单机运行模式的区别
10 | 7. 理解MapReduce的执行过程
11 | 8. Yarn在Hadoop中的作用
12 |
13 | 参考资料:
14 | [Google三大论文](https://blog.csdn.net/w1573007/article/details/52966742)
15 |
16 |
17 | 集群规划1-省机器:
18 | 
19 |
20 |
21 | 集群规划2-清晰:
22 | 
23 |
--------------------------------------------------------------------------------
/编程基础/Programming/README.md:
--------------------------------------------------------------------------------
1 | # Programming
2 |
3 |
4 | **课程设计**:光城 、LeoLRH
5 |
6 | **组队学习说明**:利用自己所熟知的编程语言,具有一定基础,讨论在面试中可能出现的数据结构问题,一起学习重温经典数据结构
7 |
8 | **任务路线**:数组->链表->栈->队列->递归->排序->二分查找->哈希表->字符串->二叉树->堆->图->回溯->分治->动态规划
9 |
10 | **组队学习周期**:14天甚至往上大概16天左右(周末进行整体整理讨论)(每天任务时间具体看任务情况)
11 |
12 | **定位人群**:有一门语言基础和算法基础的同学,
13 | 每个任务完成大概所需时间:平均每天学习时间在1个小时左右,晚上统一,半个小时进行集体讨论总结打卡。
14 |
15 | **难度系数**:高,小白慎入!!!
16 |
17 | ## 任务预览(2天)
18 | **【数组】**
19 | 1. 实现一个支持动态扩容的数组
20 | 2. 实现一个大小固定的有序数组,支持动态增删改操作
21 | 3. 实现两个有序数组合并为一个有序数组
22 | 4. 学习哈希表思想,并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)**(选做)(注意:在第四天会进行继续学习)**
23 | * 练习:
24 |
25 | Three Sum(求三数之和)
26 |
27 | Majority Element(求众数)
28 |
29 | Missing Positive(求缺失的第一个正数)
30 |
31 | **【链表】**
32 | 1. 实现单链表、循环链表、双向链表,支持增删操作
33 | 2. 实现单链表反转
34 | 3. 实现两个有序的链表合并为一个有序链表
35 | 4. 实现求链表的中间结点
36 |
37 | * 练习:
38 |
39 | Linked List Cycle I(环形链表)
40 |
41 | Merge k Sorted Lists(合并 k 个排序链表)
42 |
43 | ## 优化建议
--------------------------------------------------------------------------------
/机器学习/Spark基础/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 |
2 | # Task1(3day)
3 | # 【环境部署】
4 |
5 | [window下参考](https://blog.csdn.net/SummerHmh/article/details/89518567)
6 |
7 | [linux下参考1](https://mp.weixin.qq.com/s/gIf_QGQL26MqMzZKk-YTLg)
8 |
9 | [linux下参考2](https://mp.weixin.qq.com/s/vufnqfG1vYjT9Ec8kvjcAg)
10 |
11 | **内容:运行原理,RDD设计,DAG,安装与使用**
12 |
13 | 第1章 Spark的设计与运行原理(大概了解)
14 |
15 | * [1.1 Spark简介](http://dblab.xmu.edu.cn/blog/1710-2/)
16 |
17 | * [1.2 Spark运行架构](http://dblab.xmu.edu.cn/blog/1711-2/)
18 |
19 | * [1.3 RDD的设计与运行原理](http://dblab.xmu.edu.cn/blog/1681-2/)
20 |
21 | * [1.4 Spark的部署模式](http://dblab.xmu.edu.cn/blog/1713-2/)
22 |
23 | 第2章 Spark的安装与使用(主要内容)
24 |
25 | * [2.1 Spark的安装和使用](http://dblab.xmu.edu.cn/blog/1689-2/) (如果想在window上安装,[参考](https://blog.csdn.net/SummerHmh/article/details/89518567),之后可以用pyspark或者jupyter上进行学习)
26 |
27 | * 2.2 第一个Spark应用程序:WordCount
28 |
29 |
30 |
31 | 问题扩展:
32 | 1. spark 和 mapreduce有哪些区别,请用具体的例子说明?
33 |
34 | 2. rdd的本质是什么?
35 |
36 |
--------------------------------------------------------------------------------
/数据科学/Excel/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | 1. 基础函数(2天)
2 | ### 单元格引用
3 | 混合引用
4 | 绝对引用
5 | 相对引用
6 | ### 运算符
7 | ### 文本函数
8 | 连接符 &
9 | 字符提取 left/right/mid
10 | text函数
11 | 常与find配合
12 | ### 逻辑函数
13 | if函数
14 | 单条件
15 | 多条件
16 | ### 计算函数
17 | max
18 | min
19 | average
20 | sum
21 | count
22 | sumif
23 | countif
24 | sumproduct
25 |
26 | ### 作业
27 | 任务一
28 | 1.1将列salary最低工资提取出来,假如单元格为“10k以上”、“8k以下”等,最低工资直接为10和8,效果如下:
29 |
30 | 
31 |
32 | 1.2 计算北京最低工资的平均值?
33 | 1.3 最低工资平均值最低的城市是哪一个?
34 | 1.4 北京本科的招聘中,最低工资介于7-11(大于7小于11)的岗位有多少个?
35 |
36 | 任务二
37 | 将职位标签(positionLables)中,包含“大数据”的岗位筛选出来。
38 |
39 | 任务三
40 | 将最低工资分段,(0,4]为低,(4,8]为中,8以上为高。
41 |
42 | # 【参考资料】
43 | 1. 如何从零开始学习Excel,并在工作中熟练运用?
44 |
45 | [https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card](https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card)
46 | 1. 书籍 《竞争力 玩转职场Excel,从此不加班》 安伟星 裴雷
47 | 2. 数据集下载 - 《DataAnalyst》
48 |
49 | 链接:[https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA](https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA)
50 | 提取码:f55z
51 |
52 |
--------------------------------------------------------------------------------
/数据科学/Data_Analysis/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | ### 【Task5(2天)】
2 | 完成9章的学习及作业3,代码实现的过程上传到GitHub
3 |
4 | 【参考资料】
5 | [https://nbviewer.jupyter.org/github/pydata/pydata-book/blob/2nd-edition/ch09.ipynb](https://nbviewer.jupyter.org/github/pydata/pydata-book/blob/2nd-edition/ch09.ipynb)
6 | [https://nbviewer.jupyter.org/github/pydata/pydata-book/blob/2nd-edition/ch10.ipynb](https://nbviewer.jupyter.org/github/pydata/pydata-book/blob/2nd-edition/ch10.ipynb)
7 |
8 |
9 | 【参考资料(择一即可)】
10 |
11 | 视频版
12 |
13 | [https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372](https://www.bilibili.com/video/av10475153?from=search&seid=11281184335048850372)
14 |
15 | 网页版
16 |
17 | [https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)
18 |
19 | [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
20 |
21 | 文档版
22 |
23 | [git(1).pdf](https://uploader.shimo.im/f/WuXfgqcdB0I0lXlw.pdf)
24 |
25 |
26 |
27 | [两小时学会Git玩转Github(1).doc](https://uploader.shimo.im/f/Noa5u0K4qCkqubTI.doc)
28 |
29 |
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task5.md:
--------------------------------------------------------------------------------
1 | ## Task5(2天)
2 | * 【二叉树】
3 |
4 | 实现一个二叉查找树,并且支持插入、删除、查找操作
5 |
6 | 实现查找二叉查找树中某个节点的后继、前驱节点
7 |
8 | 实现二叉树前、中、后序以及按层遍历
9 |
10 | 并完成leetcode上的验证二叉搜索树(98)及二叉树 层次遍历(102,107)!(选做)(保留往期第四天任务)注:这个跟下面的习题有重复
11 |
12 | * 练习:
13 |
14 | Invert Binary Tree(翻转二叉树)
15 |
16 | 英文版:https://leetcode.com/problems/invert-binary-tree/
17 |
18 | 中文版:https://leetcode-cn.com/problems/invert-binary-tree/
19 |
20 |
21 | Maximum Depth of Binary Tree(二叉树的最大深度)
22 |
23 | 英文版:https://leetcode.com/problems/maximum-depth-of-binary-tree/
24 |
25 | 中文版:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
26 |
27 | Validate Binary Search Tree(验证二叉查找树)[作为可选]
28 |
29 | 英文版:https://leetcode.com/problems/validate-binary-search-tree/
30 |
31 | 中文版:https://leetcode-cn.com/problems/validate-binary-search-tree/
32 |
33 | * 【堆】
34 |
35 | 实现一个小顶堆、大顶堆、优先级队列
36 |
37 | 实现堆排序
38 |
39 | 利用优先级队列合并 K 个有序数组
40 |
41 | 求一组动态数据集合的最大 Top K
42 |
43 | (选做)第三天堆排序学习(复习)
44 |
45 | * 练习:
46 |
47 |
48 | Path Sum(路径总和)
49 |
50 | 英文版:https://leetcode.com/problems/path-sum/
51 |
52 | 中文版:https://leetcode-cn.com/problems/path-sum/
--------------------------------------------------------------------------------
/深度学习/Keras/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 |
2 | ## 【预备任务】
3 | 1. tensorflow安装
4 |
5 | 推荐Anaconda(针对自己操作系统和位数下载对应版本);推荐用conda create创建对应的python环境(注:某些python版本可能不支持tensorflow);通过pip install来安装tensorflow。
6 |
7 | 参考:
8 |
9 | [tensorflow安装教程](http://www.tensorflownews.com/series/tensorflow-install-tutorial/)
10 |
11 | 2.keras安装:
12 | 在安装 Keras 之前,请安装以下后端引擎之一:TensorFlow,Theano,或者 CNTK。我们推荐 TensorFlow 后端。避免麻烦,安装其中一个后端即可,不需要安装所有后端。
13 | [参考资料](https://keras-zh.readthedocs.io/)
14 |
15 | ## Task1 快速了解keras (2days)
16 | keras的优势,以及keras模型构建的两种方式,Sequential 模型函数式API。
17 | 1. [关于keras模型](https://keras-zh.readthedocs.io/models/about-keras-models/)
18 | 2. [Keras FAQ: 常见问题解答](https://keras-zh.readthedocs.io/getting-started/faq/)
19 | 3. [Sequential 模型](https://keras-zh.readthedocs.io/models/sequential/)
20 | 通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型。
21 | 4. [model函数API](https://keras-zh.readthedocs.io/models/model/)
22 | 函数式 API 是定义复杂模型(如多输出模型、有向无环图,或具有共享层的模型)的方法,利用函数式 API创建一个模型。
23 | 5. [常用数据集](https://keras-zh.readthedocs.io/datasets/)(数据集提前下载后续就可以使用)
24 | 6. 经典样例(任选两个跑一下,观察代码的实现,都包含有哪些结构,对于一个完整的keras模型有总体的认知,在后续学习中可以进行对应。)
25 |
26 |
27 | [参考资料:](https://keras-zh.readthedocs.io/why-use-keras/)
28 |
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ## Task1(2天)
2 | * 【数组】
3 | 实现一个支持动态扩容的数组
4 |
5 | 实现一个大小固定的有序数组,支持动态增删改操作
6 |
7 | 实现两个有序数组合并为一个有序数组
8 |
9 | 学习哈希表思想,并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)(选做)(注意:在第四天会进行继续学习)
10 |
11 | * 练习:
12 | **Three Sum(求三数之和)**
13 |
14 | 英文版:https://leetcode.com/problems/3sum/
15 |
16 | 中文版:https://leetcode-cn.com/problems/3sum/
17 |
18 | **Majority Element(求众数)**
19 |
20 | 英文版:https://leetcode.com/problems/majority-element/
21 |
22 | 中文版:https://leetcode-cn.com/problems/majority-element/
23 |
24 | **Missing Positive(求缺失的第一个正数)[作为可选]**
25 |
26 | 英文版:https://leetcode.com/problems/first-missing-positive/
27 |
28 | 中文版:https://leetcode-cn.com/problems/first-missing-positive/
29 |
30 |
31 |
32 | * 【链表】
33 |
34 | 实现单链表、循环链表、双向链表,支持增删操作
35 |
36 | 实现单链表反转
37 |
38 | 实现两个有序的链表合并为一个有序链表
39 |
40 | 实现求链表的中间结点
41 |
42 | * 练习:
43 | **Linked List Cycle I(环形链表)**
44 |
45 | 英文版:https://leetcode.com/problems/linked-list-cycle/
46 |
47 | 中文版:https://leetcode-cn.com/problems/linked-list-cycle/
48 |
49 | **Merge k Sorted Lists(合并 k 个排序链表)**
50 |
51 | 英文版:https://leetcode.com/problems/merge-k-sorted-lists/
52 |
53 | 中文版:https://leetcode-cn.com/problems/merge-k-sorted-lists/
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | ## Task1 数据集探索 (2 days)
2 |
3 |
4 | 1. 数据集
5 |
6 |
7 |
8 | 数据集:中、英文数据集各一份
9 |
10 |
11 |
12 | 中文数据集:THUCNews
13 |
14 | THUCNews数据子集:[https://pan.baidu.com/s/1hugrfRu](https://pan.baidu.com/s/1hugrfRu) 密码:qfud
15 |
16 | 英文数据集:IMDB数据集 [Sentiment Analysis](http://ai.stanford.edu/~amaas/data/sentiment/)
17 |
18 |
19 |
20 | 2. IMDB数据集下载和探索
21 |
22 |
23 |
24 | 参考TensorFlow官方教程:[影评文本分类 | TensorFlow](https://tensorflow.google.cn/tutorials/keras/basic_text_classification)
25 |
26 | [科赛 - Kesci.com](https://www.kesci.com/home/project/5b6c05409889570010ccce90)
27 |
28 |
29 |
30 | 3. THUCNews数据集下载和探索
31 |
32 |
33 |
34 | 参考博客中的数据集部分和预处理部分:[CNN字符级中文文本分类-基于TensorFlow实现 - 一蓑烟雨 - CSDN博客](https://blog.csdn.net/u011439796/article/details/77692621)
35 |
36 | 参考代码:[text-classification-cnn-rnn/cnews_loader.py at mas...](https://github.com/gaussic/text-classification-cnn-rnn/blob/master/data/cnews_loader.py)
37 |
38 |
39 |
40 | 4. 学习召回率、准确率、ROC曲线、AUC、PR曲线这些基本概念
41 |
42 |
43 |
44 | 参考1:[机器学习之类别不平衡问题 (2) —— ROC和PR曲线_慕课手记](https://www.imooc.com/article/48072)
45 |
46 |
47 |
48 | 打卡规则
49 |
50 | 学员编号+任务名称+作业链接 (例如:01+数据集探索+www.baidu.com)
51 |
52 | 使用博客记录对数据的分析过程 主要是代码+适量的文字描述
53 |
54 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/基础知识/NLP论文复现/README.md:
--------------------------------------------------------------------------------
1 | # Python
2 |
3 | 【课程简介】
4 |
5 | 课程设计:杨开漠,王翔
6 |
7 | 任务路线:论文学习->研读模型->跑模型->针对学习中存在的问题进行后期讨论
8 |
9 | 学习周期:14天(每周一篇)
10 |
11 | 定位人群:具有nlp基础、代码阅读能力以及论文学习能力
12 |
13 | 学习难度:高
14 |
15 | 【学习模式】
16 |
17 | 论文发布(第一天或者最后一天晚上) -> 论文研读笔记作业(3天)-> 模型调试心得作业(4天)-> 后期讨论(最后一天晚上)
18 |
19 | * 论文研读笔记作业模板
20 | * 研究动机,研究方法,实验结果,创新点,个人点评
21 |
22 | * 模型调试心得作业
23 | * 模型地址,模型运行环境,数据集选择与下载,模型运行步骤,问题与解决方法汇总,个人点评
24 |
25 | 【小组介绍】
26 | * 短期论文学习小组
27 | - 基本信息介绍
28 |
29 | 面向群体:短期论文学习小组主要面向所有学习者;
30 | 学习周期 : 两个星期;
31 | 阅读论文数:两篇论文;
32 | 论文讨论时间:每篇论文的提交时间21:30结束之后;
33 |
34 | - 基本制度介绍
35 |
36 | 提问者工作:学习者可以在论文讨论期间提出自己的一些问题,让其他学习者帮忙解答,后期提问者需要将问题及回答者所回答的内容复制到石墨任务中;
37 | 临时负责人工作:本次组织学习的每次讨论,都会选择两个学习者,作为临时负责人,临时负责人主要工作是按时召开论文讨论,维持好讨论气氛,以及对最后的讨论结果(包括每个人的个人总结,想法)进行收集并粘贴到石墨任务中;
38 |
39 | - 短期学习优秀者筛选标准
40 |
41 | 对于在该小组中学习优秀者将有机会被选入长期论文学习小组,筛选的标准如下:
42 |
43 |
44 | 1、作业完成效果优秀;
45 |
46 | 2、每次组织讨论,都能准时参加,并有自己独特的见解;
47 |
48 | 3、在讨论中,能够帮助其他人解决他们所存在的问题;
49 |
50 | 4、每次讨论,都会选择两个学习者,作为临时负责人,临时负责人主要工作是按时召开论文讨论,维持好讨论气氛,以及对最后的讨论结果(包括每个人的个人总结,想法)进行收集并粘贴到石墨任务中;
51 |
52 |
53 | - 长期论文学习小组
54 | - 基本信息介绍
55 |
56 | 面向群体:短期论文学习小组优秀学习者
57 | 学习周期 :不限
58 | 阅读论文数:追踪顶会最新论文步伐
59 | 论文讨论时间:每篇论文的提交时间21:30结束之后
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | ## Task2(3天)
2 | * 【栈】
3 |
4 | 用数组实现一个顺序栈
5 |
6 | 用链表实现一个链式栈
7 |
8 | 编程模拟实现一个浏览器的前进、后退功能
9 |
10 | * 练习:
11 |
12 | Valid Parentheses(有效的括号)
13 |
14 | 英文版:https://leetcode.com/problems/valid-parentheses/
15 |
16 | 中文版:https://leetcode-cn.com/problems/valid-parentheses/
17 |
18 |
19 | Longest Valid Parentheses(最长有效的括号)[作为可选]
20 |
21 | 英文版:https://leetcode.com/problems/longest-valid-parentheses/
22 |
23 | 中文版:https://leetcode-cn.com/problems/longest-valid-parentheses/
24 |
25 |
26 | Evaluate Reverse Polish Notatio(逆波兰表达式求值)
27 |
28 | 英文版:https://leetcode.com/problems/evaluate-reverse-polish-notation/
29 |
30 | 中文版:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
31 |
32 | * 【队列】
33 |
34 | 用数组实现一个顺序队列
35 |
36 | 用链表实现一个链式队列
37 |
38 | 实现一个循环队列
39 |
40 | * 练习:
41 |
42 | Design Circular Deque(设计一个双端队列)
43 |
44 | 英文版:https://leetcode.com/problems/design-circular-deque/
45 |
46 | 中文版:https://leetcode-cn.com/problems/design-circular-deque/
47 |
48 | Sliding Window Maximum(滑动窗口最大值)
49 |
50 | 英文版:https://leetcode.com/problems/sliding-window-maximum/
51 |
52 | 中文版:https://leetcode-cn.com/problems/sliding-window-maximum/
53 |
54 | * 【递归】
55 |
56 | 编程实现斐波那契数列求值 f(n)=f(n-1)+f(n-2)
57 |
58 | 编程实现求阶乘 n!
59 |
60 | 编程实现一组数据集合的全排列
61 | * 练习:
62 | Climbing Stairs(爬楼梯)
63 |
64 | 英文版:https://leetcode.com/problems/climbing-stairs/
65 |
66 | 中文版:https://leetcode-cn.com/problems/climbing-stairs/
67 |
--------------------------------------------------------------------------------
/数据科学/Excel/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1. 基础图表(3天)
4 | ### 了解excel有哪些图表类型
5 | 1、柱形图
6 | 2、折线图
7 | 3、饼图
8 | 4、条形图
9 | 5、组合图
10 | 6、散点图
11 | 。。。
12 | ### andrew abela大神制作的图表类型选择指南
13 | 
14 |
15 | 
16 |
17 | ### 图表的构成要素
18 | 
19 |
20 | ### 作业:
21 | 请按要求自行选择类型作图
22 |
23 | 任务一:统计各个城市对于数据分析师的需求情况
24 |
25 | 任务二:统计对求职者学历要求的情况
26 |
27 | 任务三:统计对求职者工作经验要求的情况
28 |
29 | 任务四:统计各种职位的需求情况
30 |
31 | 任务五:统计不同城市不同行业对于数据分析师的需求情况
32 |
33 | 任务六:统计不同城市的平均工资水平情况
34 |
35 | 任务七:统计不同行业的平均工资水平情况
36 |
37 | 任务八:统计不同职位的需求情况
38 |
39 | 任务九:分别统计北京, 上海,深圳,广州四个城市 不同行业和学历的工资分布情况
40 |
41 | 任务十:分别统计北京, 上海,深圳,广州四个城市 不同行业和工作年限的工资分布情况
42 |
43 | P.S. 请注意几点:
44 |
45 | ①以上都是开放式的,并不一定存在标准唯一答案
46 |
47 | ②有很多需要先进行数据处理,比如平均工资水平的定义和求解、比如所谓的“不同职位”
48 |
49 | ③请注意图表的构成要素,自行决定是否需要添加数据标签、坐标轴标题等
50 |
51 | ④图表不是选定一种类型,然后往里面拖数据就完事的。需要多思考应该怎么样去呈现这些数据。 比如 :
52 |
53 | 图表的配色 不要太多颜色,且所有的图表配色风格要保持一致
54 |
55 | 图表的分布,比如柱状图,你的横坐标应该根据柱子大小从大到小排列
56 |
57 | 图表画完,你应该有一两句总结性的话。即图表展现的规律或你想表达的观点。
58 |
59 | 你可以假设这是一份你向公司大老板汇报的图表结果,这次汇报会决定你是否升职为公司数据分析总监:-)。 如何尽可能清晰 简练的用图表表达出你的意思和数据规律情况
60 |
61 | # 【参考资料】
62 | 1. 如何从零开始学习Excel,并在工作中熟练运用?
63 |
64 | [https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card](https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card)
65 | 1. 书籍 《竞争力 玩转职场Excel,从此不加班》 安伟星 裴雷
66 | 2. 数据集下载 - 《DataAnalyst》
67 |
68 | 链接:[https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA](https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA)
69 | 提取码:f55z
70 |
71 |
--------------------------------------------------------------------------------
/编程基础/Programming/学习任务/Task7.md:
--------------------------------------------------------------------------------
1 | ## Task7(2天)
2 | * 【递归(保留往期第五天任务)】
3 |
4 | 通过LeetCode上【70. 爬楼梯】学习(建议)
5 |
6 | * 【回溯】
7 |
8 | 利用回溯算法求解八皇后问题
9 |
10 | 利用回溯算法求解 0-1 背包问题
11 |
12 | * 【分治】
13 |
14 | 利用分治算法求一组数据的逆序对个数
15 |
16 | * 【动态规划】
17 |
18 | 0-1 背包问题
19 |
20 | 最小路径和(详细可看 Minimum Path Sum)
21 |
22 | 编程实现莱文斯坦最短编辑距离
23 |
24 | 编程实现查找两个字符串的最长公共子序列
25 |
26 | 编程实现一个数据序列的最长递增子序列
27 |
28 | * 练习:
29 |
30 |
31 | 实战递归:完成Leetcode上的Letter Combinations of a Phone Number(17)及permutations(46)
32 | (保留往期第六天任务)
33 |
34 | 实战DP:完成0-1背包问题实现(自我实现)及Leetcode上Palindrome Partitioning II(132)
35 | (保留往期第七天任务)
36 |
37 | Regular Expression Matching(正则表达式匹配)
38 |
39 | 英文版:https://leetcode.com/problems/regular-expression-matching/
40 |
41 | 中文版:https://leetcode-cn.com/problems/regular-expression-matching/
42 |
43 | Minimum Path Sum(最小路径和)
44 |
45 | 英文版:https://leetcode.com/problems/minimum-path-sum/
46 |
47 | 中文版:https://leetcode-cn.com/problems/minimum-path-sum/
48 |
49 | Coin Change (零钱兑换)[作为可选]
50 |
51 | 英文版:https://leetcode.com/problems/coin-change/
52 |
53 | 中文版:https://leetcode-cn.com/problems/coin-change/
54 |
55 | Best Time to Buy and Sell Stock(买卖股票的最佳时机)[作为可选]
56 |
57 | 英文版:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
58 |
59 | 中文版:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
60 |
61 | Maximum Product Subarray(乘积最大子序列)[作为可选]
62 |
63 | 英文版:https://leetcode.com/problems/maximum-product-subarray/
64 |
65 | 中文版:https://leetcode-cn.com/problems/maximum-product-subarray/
66 |
67 | Triangle(三角形最小路径和)[作为可选]
68 |
69 | 英文版:https://leetcode.com/problems/triangle/
70 |
71 | 中文版:https://leetcode-cn.com/problems/triangle/
--------------------------------------------------------------------------------
/数据科学/Excel/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 |
2 | 1. match index 和vlookup函数 和双条件查找匹配 (2天)
3 | ### vlookup函数用法
4 | ### vlookup、hlookup、lookup函数的用法和三者的区别
5 |
6 | ### match和index
7 | match函数用法
8 | index函数用法
9 | 用match和index函数实现vlookup功能
10 | ### 双条件查找
11 | [https://jingyan.baidu.com/article/fd8044faf87ea55031137af6.html](https://jingyan.baidu.com/article/fd8044faf87ea55031137af6.html)
12 | ###
13 | ### 作业
14 | (请下载提供的数据集《DataAnalyst》)
15 | 链接:[https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA](https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA)
16 | 提取码:f55z
17 |
18 | 1. 用vlookup函数 查找以下公司的 companyId
19 | | companyFullName |
20 | |:----|
21 | | 上海云贝网络科技有限公司 |
22 | | 携程计算机技术(上海)有限公司 |
23 | | 浙江康健绿线网络技术有限公司 |
24 | | 久亿财富(北京)投资有限公司 |
25 | | 杭州木瓜科技有限公司 |
26 | | 思特沃克软件技术(成都)有限公司 |
27 | | 北京金山云网络技术有限公司 |
28 |
29 |
30 | 2. 用match和index函数实现第一题的功能
31 | 3. 用match和index函数查找以下id对应的公司名称,注意id是横向排列的
32 | | companyId | 127200 | 151079 | 22225 |
33 | |----|----|----|----|
34 | 4. 请根据companyId和postionId两个条件查找对应的工资水平
35 | | companyId | positionId | salary |
36 | |:----|:----|:----|
37 | | 62 | 938038 | |
38 | | 1575 | 1157620 | |
39 | | 157392 | 2574696 | |
40 |
41 | 请思考,是否会存在相同的公司id和职位di对应多种工资水平,如果有请查找出来。
42 | 并思考,如果存在多种的情况,目前的公式还能不能用?
43 |
44 | # 【参考资料】
45 | 1. 如何从零开始学习Excel,并在工作中熟练运用?
46 |
47 | [https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card](https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card)
48 | 1. 书籍 《竞争力 玩转职场Excel,从此不加班》 安伟星 裴雷
49 | 2. 数据集下载 - 《DataAnalyst》
50 |
51 | 链接:[https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA](https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA)
52 | 提取码:f55z
53 |
54 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/参考答案/Task4参考答案.md:
--------------------------------------------------------------------------------
1 | # 【Task4】MapReduce+MapReduce执行过程
2 | 1. MR原理
3 |
4 | hadoop streaming 原理
5 | 
6 | 2. 使用Hadoop Streaming -python写出WordCount
7 |
8 | Python版本
9 | mapper
10 | ```
11 | import sys
12 | import re
13 |
14 | p = re.compile(r'\w+')
15 | for line in sys.stdin:
16 | ss = line.strip().split(' ')
17 | for s in ss:
18 | if len(p.findall(s))<1:
19 | continue
20 | s_low = p.findall(s)[0].lower()
21 | print(s_low+'\t'+'1')
22 |
23 | ```
24 |
25 | reducer.py
26 |
27 | ```
28 | import sys
29 |
30 | cur_word = None
31 | sum = 0
32 | for line in sys.stdin:
33 | word,val = line.strip().split('\t')
34 |
35 | if cur_word==None:
36 | cur_word = word
37 | if cur_word!=word:
38 | print('%s\t%s'%(cur_word,sum))
39 | cur_word = word
40 | sum = 0
41 | sum+=int(val)
42 | print('%s\t%s'%(cur_word,sum))
43 | ```
44 |
45 | run.sh
46 | ```
47 | HADOOP_CMD="/path/to/hadoop"
48 | STREAM_JAR_PATH="/path/to/hadoop-streaming-2.6.1.jar"
49 |
50 | INPUT_FILE_PATH_1="/inputt"
51 | OUTPUT_PATH="/output/wc"
52 |
53 | $HADOOP_CMD jar $STREAM_JAR_PATH \
54 | -input $INPUT_FILE_PATH_1 \
55 | -output $OUTPUT_PATH \
56 | -mapper "python mapper.py" \
57 | -reducer "python reducer.py" \
58 | -file ./mapper.py \
59 | -file ./reducer.py
60 | ```
61 |
62 | 2. 使用mr计算movielen中每个用户的平均评分。
63 |
64 | 3. 使用mr实现去重任务。
65 |
66 | 4. 使用mr实现排序。
67 |
68 | 5. 使用mapreduce实现倒排索引。
69 |
70 | 6. 使用mr实现join功能。
71 |
72 | 7. 使用mapreduce计算Jaccard相似度。
73 |
74 | 8. 使用mapreduce实现PageRank。
75 |
76 | [基于MapReduce的PageRank算法实现](https://blog.csdn.net/a819825294/article/details/53674353)
77 |
78 | [Python3调用Hadoop的API](https://www.cnblogs.com/sss4/p/10443497.html)
--------------------------------------------------------------------------------
/理论应用/NLP-theory-practice-/学习任务/预备任务.md:
--------------------------------------------------------------------------------
1 |
2 | ## 【预备任务】
3 | 1. tensorflow安装
4 |
5 | 推荐Anaconda(针对自己操作系统和位数下载对应版本);推荐用conda create创建对应的python环境(注:某些python版本可能不支持tensorflow);通过pip install来安装tensorflow。
6 |
7 | 参考:
8 | tensorflow安装教程 [http://www.tensorflownews.com/series/tensorflow-install-tutorial/](http://www.tensorflownews.com/series/tensorflow-install-tutorial/)
9 |
10 | 2. tensrflow基础
11 |
12 |
13 | 关注图、会话、tensor、变量、feed和fetch。
14 |
15 | 使用图(graphs)来表示计算任务、在被称之为会话(Session)的上下文(context)中执行图、使用tensor表示数据、通过变量(Variable)维护状态;使用feed和fetch为任意的操作赋值或者从其中获取数据。
16 |
17 | 参考:
18 |
19 | TENSORFLOW从入门到精通之——TENSORFLOW基本操作 [http://www.tensorflownews.com/2018/03/28/tensorflow_base/](http://www.tensorflownews.com/2018/03/28/tensorflow_base/)
20 |
21 | tensorflow简介 [http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/introduction.html](http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/introduction.html)
22 |
23 | tensorflow基本使用 [http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/basic_usage.html](http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/basic_usage.html)
24 |
25 | 莫凡tensorflow [https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/](https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/)
26 |
27 | TensorFlow-Examples [https://github.com/aymericdamien/TensorFlow-Examples(关注Hello](https://github.com/aymericdamien/TensorFlow-Examples(关注Hello) World、Basic Operations、Linear Regression、Simple Neural Network)
28 |
29 | 史上最全的Tensorflow学习资源汇总 [https://zhuanlan.zhihu.com/p/35515805](https://zhuanlan.zhihu.com/p/35515805)
30 |
31 | 3. NLP
32 |
33 |
34 | 关注NLP基础技术、NLP核心技术、NLP+的介绍。
35 |
36 | 微软周明:自然语言处理的历史与未来 [http://zhigu.news.cn/2017-06/08/c_129628590.htm](http://zhigu.news.cn/2017-06/08/c_129628590.htm)
37 |
38 | [参考答案](./../参考答案)
--------------------------------------------------------------------------------
/深度学习/深度学习/深度学习课程设计.md:
--------------------------------------------------------------------------------
1 | # 【课程简介】
2 | 课程设计:居居,于鸿飞
3 | 组队学习说明:学习深度学习的相关概念和经典算法
4 | 任务路线:感知机-神经网络-深度神经网络-CNN-RNN-LSTM-GRU
5 | 组队学习周期:22天
6 | 定位人群:深度学习初学者,有一定机器学习基础,难度系数中
7 | 每个任务完成大概所需时间:每天平均花费时间2小时-4小时不等,根据个人学习接受能力强弱有所浮动
8 | 课程内容:https://shimo.im/docs/RsLcH4Ky8JAK6Ycf/
9 | 参考资料:
10 | [吴恩达深度学习专项课程](https://mooc.study.163.com/university/deeplearning_ai#/c)
11 | [深度学习笔记](http://www.ai-start.com/dl2017/)
12 |
13 | # Task1(2天)
14 | 1、Perceptron(感知机)
15 | (1)什么是感知机
16 | (2)感知机的优化方法
17 | (3)感知机的适用场景
18 | # Task2(3天)
19 | 2、Neural Network(神经网络)(3天)
20 | (1)从Perceptron如何发展到神经网络?或者说是perceptron的哪方面问题导致神经网络的产生?
21 | (2)神经网络的结构、隐藏层、神经元
22 | (3)前馈神经网络
23 | (4)反向传播在神经网络中如何应用
24 | (5)神经网络常见的损失函数
25 | (6)神经网络如何优化
26 | # Task3(3天)
27 | 3、深度神经网络DNN(3天)
28 | (1)是什么促使深度学习的发展
29 | (2)什么是深度学习
30 | (3)深度学习结构
31 | (4)深度学习的优化方法
32 | (5)深度学习的应用场景
33 | (6)如何避免过拟合
34 | # Task4(2天)
35 | 4、CNN(2天)
36 | (1)CNN与DNN的区别?CNN的优点
37 | (2)CNN的网络结构
38 | (3)解释filter、padding、stride、channel分别代表的含义,举例说明某一层m*m*c(长*宽*channel)在经过l个f*f大小的filter,以步长s进行stride进行卷积后,下一层的大小是如何计算?
39 | (4)pooling层的作用是什么?
40 | (5)1x1的filter作用是什么?
41 | (6)图像数据增强的常见方式
42 |
43 | # Task5(3天)
44 | 5、CNN的发展上的几种常见算法、网络结构以及它们的优缺点(3天)
45 | (1)LeNet-5
46 | (2)AlexNet
47 | (3)VGG-16
48 | (4)ResNet(残差网络)
49 | (5)Inception
50 | # Task6(3天)
51 | 6、CNN算法的应用(3天)
52 | 1、图像分类(如何定义标签、损失函数)
53 | 2、目标检测(如何定义标签、损失函数、
54 | 3、常用的CNN进行物体检测的方法原理介绍、优缺点
55 | 4、如何用CNN进行人脸验证(通过一张照片或一个人去识别这个人)
56 | # Task7(3天)
57 | 7、RNN(3天)
58 | (1)时间序列模型样本的表示方式
59 | (2)为什么不用标准的神经网络来训练时间序列模型?
60 | (3)RNN里的前向传播与反向传播(网络结构、每层输入输出的表示)
61 | (4)RNN的常见网络结构,以及它们与标准神经网络的区别
62 | (5)如何用一个常规的NLP问题(情绪分类、命名实体识别等)转化为对应的RNN网络结构
63 | (6)梯度爆炸和梯度消失问题
64 |
65 | # Task8(3天)
66 | 8、GRU及LSTM(3天)
67 | (1)GRU的网络结构及不同单元的表示
68 | (2)LSTM的网络结构及不同单元的表示
69 | (3)GRU与LSTM之间的联系及区别
70 | (4)为什么GRU和LSTM可以避免梯度消失?
71 |
72 | 参考资料:吴恩达深度学习专项课程
73 |
74 |
75 |
--------------------------------------------------------------------------------
/数据科学/Excel/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | 1. 界面和基础操作(3天)
2 | ### 基础界面
3 | 类似这种的
4 | 
5 |
6 | ### 文件操作
7 | 新建workbook
8 | 新建sheet/移动sheet/重命名sheet/修改sheet颜色
9 | sheet种类: 工作表/图表/宏表等
10 | 保存为xls/xlsx/csv
11 |
12 |
13 | ### 基础单元格操作
14 | 输入数据
15 | 数据格式
16 | 合并单元格
17 | 自动填充
18 | 选择性粘贴
19 | 去重
20 | 分列
21 | 排序
22 | 筛选
23 | 条件格式
24 | 插入下拉列表
25 | 行高列宽设置
26 | 冻结首行首列
27 | 边框
28 | 单元格换行
29 |
30 | ### 作业:
31 | 任务一
32 | 参考下图。给Excel截图并标注功能。
33 | 建议将开始/插入等功能区里的具体内容模块也标注。
34 | 
35 | p.s 根据自己的需求决定详细程度。目的是对整个excel的功能布局有个大致了解,之后要用到的时候知道去哪里找即可。
36 |
37 | 任务二
38 | 生成一个行高30,列宽15(第六列列宽45),名为“Excel组队学习”的表,要求如下:
39 | 1、第一列为职位ID,背景色为浅蓝;
40 | 2、第二列为职位类型,字体颜色为红色;
41 | 3、第三列为学历,每个单元格有下拉列表,选项为大专、本科、硕士、博士;
42 | 4、第四列为行业方向,单元格边框为红色虚线;
43 | 5、第五列为薪资水平,数据类型为货币,保留两位小数;
44 | 6、第六列为职位标签。
45 | 
46 |
47 | 任务三
48 | 操作对象为任务一生成的“Excel组队学习”表
49 | 2.1 冻结窗格1-3行,效果如下
50 |
51 | 
52 |
53 | 2.2 将第六列分列,效果如下
54 |
55 | 
56 |
57 | 2.3 利用条件格式,将薪资列大于8000的收入填充为深绿色,并将它们筛选出来,效果如下
58 |
59 | 
60 |
61 | 2.4 第二列将重复值删除,只保留唯一值,效果如下:
62 |
63 | 
64 |
65 | # 【参考资料】
66 | 1. 如何从零开始学习Excel,并在工作中熟练运用?
67 |
68 | [https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card](https://www.zhihu.com/question/36888983/answer/84860536?from=profile_answer_card)
69 | 1. 书籍 《竞争力 玩转职场Excel,从此不加班》 安伟星 裴雷
70 | 2. 数据集下载 - 《DataAnalyst》
71 |
72 | 链接:[https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA](https://pan.baidu.com/s/1sCaFkQ9DoxYE-FyiY2ewPA)
73 | 提取码:f55z
74 |
75 |
--------------------------------------------------------------------------------
/数据科学/MYSQL/学习任务/Task3.md:
--------------------------------------------------------------------------------
1 | 负责人:某某某
2 | # 【任务三】
3 |
4 |
5 |
6 | ## 3.1 MySQL 实战
7 | ### #学习内容#
8 |
9 | 数据导入导出
10 |
11 | * 将之前创建的任意一张MySQL表导出,且是CSV格式
12 |
13 | * 再将CSV表导入数据库
14 |
15 | ### #作业#
16 |
17 | 项目七: 各部门工资最高的员工(难度:中等)
18 |
19 | 创建Employee 表,包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
20 |
21 | +----+-------+--------+--------------+
22 | | Id | Name | Salary | DepartmentId |
23 | +----+-------+--------+--------------+
24 | | 1 | Joe | 70000 | 1 |
25 | | 2 | Henry | 80000 | 2 |
26 | | 3 | Sam | 60000 | 2 |
27 | | 4 | Max | 90000 | 1 |
28 | +----+-------+--------+--------------+
29 |
30 | 创建Department 表,包含公司所有部门的信息。
31 |
32 | +----+----------+
33 | | Id | Name |
34 | +----+----------+
35 | | 1 | IT |
36 | | 2 | Sales |
37 | +----+----------+
38 |
39 | 编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
40 |
41 | +------------+----------+--------+
42 | | Department | Employee | Salary |
43 | +------------+----------+--------+
44 | | IT | Max | 90000 |
45 | | Sales | Henry | 80000 |
46 | +------------+----------+--------+
47 |
48 |
49 |
50 | 项目八: 换座位(难度:中等)
51 |
52 | 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
53 |
54 | 其中纵列的 **id **是连续递增的
55 |
56 | 小美想改变相邻俩学生的座位。
57 |
58 | 你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
59 |
60 | 请创建如下所示seat表:
61 |
62 | **示例:**
63 |
64 | +---------+---------+
65 | | id | student |
66 | +---------+---------+
67 | | 1 | Abbot |
68 | | 2 | Doris |
69 | | 3 | Emerson |
70 | | 4 | Green |
71 | | 5 | Jeames |
72 | +---------+---------+
73 |
74 | 假如数据输入的是上表,则输出结果如下:
75 |
76 | +---------+---------+
77 | | id | student |
78 | +---------+---------+
79 | | 1 | Doris |
80 | | 2 | Abbot |
81 | | 3 | Green |
82 | | 4 | Emerson |
83 | | 5 | Jeames |
84 | +---------+---------+
85 |
86 | **注意:**
87 |
88 | 如果学生人数是奇数,则不需要改变最后一个同学的座位。
89 |
90 |
91 |
92 |
93 | 项目九: 分数排名(难度:中等)
94 |
95 | 编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
96 |
97 | 创建以下score表:
98 |
99 | +----+-------+
100 | | Id | Score |
101 | +----+-------+
102 | | 1 | 3.50 |
103 | | 2 | 3.65 |
104 | | 3 | 4.00 |
105 | | 4 | 3.85 |
106 | | 5 | 4.00 |
107 | | 6 | 3.65 |
108 | +----+-------+
109 |
110 | 例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
111 |
112 | +-------+------+
113 | | Score | Rank |
114 | +-------+------+
115 | | 4.00 | 1 |
116 | | 4.00 | 1 |
117 | | 3.85 | 2 |
118 | | 3.65 | 3 |
119 | | 3.65 | 3 |
120 | | 3.50 | 4 |
121 | +-------+------+
122 | ##
123 | # 【打卡说明】
124 |
125 | 1)**任务二请在****4月4日****晚****22:00** 前在下方表格打卡
126 |
127 | 2)未按时打卡者将会被清退,打卡链接包含:博客/Github链接(描述:任务、遇到的问题、实现代码和参考资料)
128 |
129 |
--------------------------------------------------------------------------------
/数据科学/MYSQL/学习任务/Task2.md:
--------------------------------------------------------------------------------
1 | 负责人:杨煜
2 | # 【任务二】
3 |
4 |
5 | ## 2.1 MySQL 基础 (二)- 表操作
6 | ### #学习内容#
7 | 1. MySQL表数据类型
8 |
9 | 2. 用SQL语句创建表
10 |
11 | 语句解释
12 | 设定列类型 、大小、约束
13 | 设定主键
14 | 3. 用SQL语句向表中添加数据
15 |
16 | 语句解释
17 | 多种添加方式(指定列名;不指定列名)
18 | 4. 用SQL语句删除表
19 |
20 | 语句解释
21 | DELETE
22 | DROP
23 | TRUNCATE
24 | 不同方式的区别
25 | 5. 用SQL语句修改表
26 |
27 | 修改列名
28 | 修改表中数据
29 | 删除行
30 | 删除列
31 | 新建列
32 | 新建行
33 |
34 |
35 | ### #作业#
36 |
37 | 项目三:超过5名学生的课(难度:简单)
38 |
39 |
40 | 创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。
41 |
42 |
43 | 例如,表:
44 |
45 | +---------+------------+
46 |
47 | | student | class |
48 | +---------+------------+
49 | | A | Math |
50 | | B | English |
51 | | C | Math |
52 | | D | Biology |
53 | | E | Math |
54 | | F | Computer |
55 | | G | Math |
56 | | H | Math |
57 | | I | Math |
58 | | A | Math |
59 | +---------+------------+
60 |
61 |
62 | 编写一个 SQL 查询,列出所有超过或等于5名学生的课。
63 |
64 |
65 | 应该输出:
66 |
67 | +---------+
68 | | class |
69 | +---------+
70 | | Math |
71 | +---------+
72 |
73 | Note:
74 |
75 | 学生在每个课中不应被重复计算。
76 |
77 |
78 |
79 | 项目四:交换工资(难度:简单)
80 |
81 |
82 | 创建一个 salary表,如下所示,有m=男性 和 f=女性的值 。
83 |
84 |
85 | 例如:
86 |
87 | | id | name | sex | salary |
88 | |----|------|-----|--------|
89 | | 1 | A | m | 2500 |
90 | | 2 | B | f | 1500 |
91 | | 3 | C | m | 5500 |
92 | | 4 | D | f | 500 |
93 |
94 |
95 | 交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
96 |
97 |
98 | 运行你所编写的查询语句之后,将会得到以下表:
99 |
100 | | id | name | sex | salary |
101 | |----|------|-----|--------|
102 | | 1 | A | f | 2500 |
103 | | 2 | B | m | 1500 |
104 | | 3 | C | f | 5500 |
105 | | 4 | D | m | 500 |
106 |
107 | ## 2.2 MySQL 基础 (三)- 表联结
108 | ### #学习内容#
109 | * MySQL别名
110 | * INNER JOIN
111 | * LEFT JOIN
112 | * CROSS JOIN
113 | * 自连接
114 | * UNION
115 | * 以上几种方式的区别和联系
116 | ### #作业#
117 |
118 | 项目五:组合两张表 (难度:简单)
119 |
120 | 在数据库中创建表1和表2,并各插入三行数据(自己造)
121 |
122 | 表1: Person
123 |
124 | +-------------+---------+
125 | | 列名 | 类型 |
126 | +-------------+---------+
127 | | PersonId | int |
128 | | FirstName | varchar |
129 | | LastName | varchar |
130 | +-------------+---------+
131 |
132 | PersonId 是上表主键
133 |
134 | 表2: Address
135 |
136 | +-------------+---------+
137 | | 列名 | 类型 |
138 | +-------------+---------+
139 | | AddressId | int |
140 | | PersonId | int |
141 | | City | varchar |
142 | | State | varchar |
143 | +-------------+---------+
144 |
145 | AddressId 是上表主键
146 |
147 | 编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
148 |
149 | 项目六:删除重复的邮箱(难度:简单)
150 |
151 | 编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 **Id ***最小 *的那个。
152 |
153 | +----+---------+
154 | | Id | Email |
155 | +----+---------+
156 | | 1 | a@b.com |
157 | | 2 | c@d.com |
158 | | 3 | a@b.com |
159 | +----+---------+
160 |
161 | Id 是这个表的主键。
162 |
163 | 例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:
164 |
165 | +----+------------------+
166 | | Id | Email |
167 | +----+------------------+
168 | | 1 | a@b.com |
169 | | 2 | c@d.com |
170 | +----+------------------+
171 | # 【任务说明】
172 |
173 | 本次作业以及之后的都需要小伙伴自己创建表和插入数据啦。就当表操作的练习。请注意语句规范,可参考上次作业的参考答案。
174 |
175 | 表联结是SQL语句核心部分。因为在正式业务中必然会涉及到多表之间的数据调用。所以大家务必完全理解吃透这部分的内容。
176 |
177 | 祝大家学习开心。:-)
178 |
--------------------------------------------------------------------------------
/数据科学/MYSQL/学习任务/Task4.md:
--------------------------------------------------------------------------------
1 | 负责人:某某某
2 | # 【任务四】
3 |
4 |
5 |
6 | ## 4.1 MySQL 实战 - 复杂项目
7 | ### #作业#
8 | 项目十:行程和用户(难度:困难)
9 | Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
10 | +----+-----------+-----------+---------+--------------------+----------+
11 | | Id | Client_Id | Driver_Id | City_Id | Status |Request_at|
12 | +----+-----------+-----------+---------+--------------------+----------+
13 | | 1 | 1 | 10 | 1 | completed |2013-10-01|
14 | | 2 | 2 | 11 | 1 | cancelled_by_driver|2013-10-01|
15 | | 3 | 3 | 12 | 6 | completed |2013-10-01|
16 | | 4 | 4 | 13 | 6 | cancelled_by_client|2013-10-01|
17 | | 5 | 1 | 10 | 1 | completed |2013-10-02|
18 | | 6 | 2 | 11 | 6 | completed |2013-10-02|
19 | | 7 | 3 | 12 | 6 | completed |2013-10-02|
20 | | 8 | 2 | 12 | 12 | completed |2013-10-03|
21 | | 9 | 3 | 10 | 12 | completed |2013-10-03|
22 | | 10 | 4 | 13 | 12 | cancelled_by_driver|2013-10-03|
23 | +----+-----------+-----------+---------+--------------------+----------+
24 | Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
25 | +----------+--------+--------+
26 | | Users_Id | Banned | Role |
27 | +----------+--------+--------+
28 | | 1 | No | client |
29 | | 2 | Yes | client |
30 | | 3 | No | client |
31 | | 4 | No | client |
32 | | 10 | No | driver |
33 | | 11 | No | driver |
34 | | 12 | No | driver |
35 | | 13 | No | driver |
36 | +----------+--------+--------+
37 | 写一段 SQL 语句查出 **2013年10月1日 **至 **2013年10月3日 **期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
38 | +------------+-------------------+
39 | | Day | Cancellation Rate |
40 | +------------+-------------------+
41 | | 2013-10-01 | 0.33 |
42 | | 2013-10-02 | 0.00 |
43 | | 2013-10-03 | 0.50 |
44 | +------------+-------------------+
45 |
46 |
47 | 项目十一:各部门前3高工资的员工(难度:中等)
48 | 将项目7中的employee表清空,重新插入以下数据(其实是多插入5,6两行):
49 | +----+-------+--------+--------------+
50 | | Id | Name | Salary | DepartmentId |
51 | +----+-------+--------+--------------+
52 | | 1 | Joe | 70000 | 1 |
53 | | 2 | Henry | 80000 | 2 |
54 | | 3 | Sam | 60000 | 2 |
55 | | 4 | Max | 90000 | 1 |
56 | | 5 | Janet | 69000 | 1 |
57 | | 6 | Randy | 85000 | 1 |
58 | +----+-------+--------+--------------+
59 | 编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:
60 | +------------+----------+--------+
61 | | Department | Employee | Salary |
62 | +------------+----------+--------+
63 | | IT | Max | 90000 |
64 | | IT | Randy | 85000 |
65 | | IT | Joe | 70000 |
66 | | Sales | Henry | 80000 |
67 | | Sales | Sam | 60000 |
68 | +------------+----------+--------+
69 |
70 | 此外,请考虑实现各部门前N高工资的员工功能。
71 |
72 | 项目十二 分数排名 - (难度:中等)
73 | 依然是昨天的分数表,实现排名功能,但是排名是非连续的,如下:
74 | +-------+------+
75 | | Score | Rank |
76 | +-------+------+
77 | | 4.00 | 1 |
78 | | 4.00 | 1 |
79 | | 3.85 | 3 |
80 | | 3.65 | 4 |
81 | | 3.65 | 4 |
82 | | 3.50 | 6 |
83 | +-------+------
84 |
85 | # 【任务说明】
86 |
87 | 这是本次集训最后一次任务啦,大家再坚持一下。之前的任务中项目是不是觉得水水的?本次任务都是较为复杂的实战了。建议有能力的小伙伴可以在项目本身的基础上拓展,看能不能将问题设置的更复杂点或实现方式更灵活点。举个栗子:各部门工资最高,是不是可以实现工资第二高的甚至是第N高的? 自由发挥~
88 |
89 | 祝大家学习开心。:-)
90 |
--------------------------------------------------------------------------------
/数据科学/MYSQL/学习任务/Task1.md:
--------------------------------------------------------------------------------
1 | 负责人:某某某
2 | # 【任务一】
3 |
4 | ## 1.1 MySQL 软件安装及数据库基础
5 | **#学习内容#**
6 | 1.软件安装及服务器设置。
7 | 教程 [http://www.runoob.com/mysql/mysql-install.html](http://www.runoob.com/mysql/mysql-install.html)
8 |
9 | 2.(选做,但是强烈建议) 使用图形界面软件 Navicat for SQL
10 | 群里提供破解版Navicat for SQL,看群公告或聊天记录搜索888查找。
11 | 简易步骤:
12 | 解压缩文件,复制key
13 | 打开文件夹中的navicat.e
14 | 用户名随意,输入key,然后连接数据库
15 | 输入密码,连接名改成自己喜欢的
16 | 剩下的自己探索,怎么在navicat中创建数据库、表等等
17 |
18 | 3.数据库基础知识
19 | 数据库定义
20 | 关系型数据库
21 | 二维表
22 | 行
23 | 列
24 | 主键
25 | 外键
26 |
27 | 4.MySQL数据库管理系统
28 | 数据库
29 | 数据表
30 | 视图
31 | 存储过程
32 | ## 1.2 MySQL 基础 (一)- 查询语句
33 | #学习内容#
34 | 1. 导入示例数据库,教程 [https://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql-database-server.html](https://www.yiibai.com/mysql/how-to-load-sample-database-into-mysql-database-server.html)
35 |
36 | 2. SQL是什么?MySQL是什么?
37 |
38 | 3. 查询语句 SELECT FROM
39 |
40 | 语句解释
41 | 去重语句
42 | 前N个语句
43 | CASE...END判断语句
44 | 4. 筛选语句 WHERE
45 |
46 | 语句解释
47 | 运算符/通配符/操作符
48 | 5. 分组语句 GROUP BY
49 |
50 | 聚集函数
51 | 语句解释
52 | HAVING子句
53 | 6. 排序语句 ORDER BY
54 |
55 | 语句解释
56 | 正序、逆序
57 | 7. 函数
58 |
59 | 时间函数
60 | 数值函数
61 | 字符串函数
62 | 8. SQL注释
63 |
64 | 9. SQL代码规范
65 |
66 | [SQL编程格式的优化建议] [https://zhuanlan.zhihu.com/p/27466166](https://zhuanlan.zhihu.com/p/27466166)
67 | [SQL Style Guide] [https://www.sqlstyle.guide/](https://www.sqlstyle.guide/)
68 |
69 | #作业#
70 | 项目一:查找重复的电子邮箱(难度:简单)
71 | 创建 email表,并插入如下三行数据
72 | +----+---------+
73 | | Id | Email |
74 | +----+---------+
75 | | 1 | a@b.com |
76 | | 2 | c@d.com |
77 | | 3 | a@b.com |
78 | +----+---------+
79 |
80 | 编写一个 SQL 查询,查找 Email 表中所有重复的电子邮箱。
81 | 根据以上输入,你的查询应返回以下结果:
82 | +---------+
83 | | Email |
84 | +---------+
85 | | a@b.com |
86 | +---------+
87 | 说明:所有电子邮箱都是小写字母。
88 |
89 | 项目二:查找大国(难度:简单)
90 | 创建如下 World 表
91 | +-----------------+------------+------------+--------------+---------------+
92 | | name | continent | area | population | gdp |
93 | +-----------------+------------+------------+--------------+---------------+
94 | | Afghanistan | Asia | 652230 | 25500100 | 20343000 |
95 | | Albania | Europe | 28748 | 2831741 | 12960000 |
96 | | Algeria | Africa | 2381741 | 37100000 | 188681000 |
97 | | Andorra | Europe | 468 | 78115 | 3712000 |
98 | | Angola | Africa | 1246700 | 20609294 | 100990000 |
99 | +-----------------+------------+------------+--------------+---------------+
100 | 如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。
101 | 编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
102 | 例如,根据上表,我们应该输出:
103 | +--------------+-------------+--------------+
104 | | name | population | area |
105 | +--------------+-------------+--------------+
106 | | Afghanistan | 25500100 | 652230 |
107 | | Algeria | 37100000 | 2381741 |
108 | +--------------+-------------+--------------+
109 |
110 | #彩蛋#
111 |
112 | 考虑到本次集训有很多新手,本次作业赠送建表代码,意不意外,开不开心。
113 |
114 | 直接将附件code内容复制到cmd或者navicat运行就行。
115 |
116 | **项目一**
117 | -- 创建表
118 | ```
119 | CREATE TABLE email (
120 | ID INT NOT NULL PRIMARY KEY,
121 | Email VARCHAR(255)
122 | );
123 | ```
124 | -- 插入数据
125 | ```
126 | INSERT INTO email VALUES('1','a@b.com');
127 | INSERT INTO email VALUES('2','c@d.com');
128 | INSERT INTO email VALUES('3','a@b.com');
129 | ```
130 |
131 | **项目二**
132 | -- 创建表
133 | ```
134 | CREATE TABLE World (
135 | name VARCHAR(50) NOT NULL,
136 | continent VARCHAR(50) NOT NULL,
137 | area INT NOT NULL,
138 | population INT NOT NULL,
139 | gdp INT NOT NULL
140 | );
141 | ```
142 | -- 插入数据
143 | ```
144 | INSERT INTO World
145 | VALUES('Afghanistan','Asia',652230,25500100,20343000);
146 | INSERT INTO World
147 | VALUES('Albania','Europe',28748,2831741,12960000);
148 | INSERT INTO World
149 | VALUES('Algeria','Africa',2381741,37100000,188681000);
150 | INSERT INTO World
151 | VALUES('Andorra','Europe',468,78115,3712000);
152 | INSERT INTO World
153 | VALUES('Angola','Africa',1246700,20609294,100990000);
154 | ```
155 |
156 |
157 | **#打卡规则#**
158 |
159 | 学员微信群编号+姓名+CSDN博客或Github链接。
160 |
161 | * 比如我是0号,打卡内容就是 000+杨煜+https://github.com/magicyang5000/
162 | # 【任务说明】
163 |
164 | 1.1 是软件安装和配置,以及一些数据库理论知识储备。
165 |
166 | 1.2 是最最基础的查询语句,可以说学完本次课程,SQL语句就掌握了30%了。
167 |
168 | 语言规范非常重要,请大家认真仔细阅读。请记住,你写SQL需要考虑别人review时的心情。写的过于杂乱会分分钟造成暴力事件。
169 |
170 | 学习内容中函数部分,是让大家了解下MySQL可以怎样处理一些数据。了解些常用的,等实际中遇到了再回头查找详细就行。
171 |
172 |
173 |
174 | 学习内容是指需要在博客文章中总结的知识点,包括但不仅限于这些知识点。比如一些安装过程中的报错及解决办法也可以写。
175 |
176 | 祝大家学习开心。:-)
177 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/参考答案/Task5参考答案.md:
--------------------------------------------------------------------------------
1 |
2 | # 【Task6】Spark常用API
3 | 1. 认识Spark
4 |
5 | 1.1 Spark的组件
6 | Driver
7 | Cluster Manager
8 | Worker
9 | 1.2 Spark的运行模式
10 | 
11 | 2. Spark的RDD
12 |
13 | RDD是弹性分布式数据集。
14 | 弹性的意思是当保存RDD的一台机器遇到错误时,Spark可以根据lineage谱系图重新计算出这些RDD。
15 | 分布式的意思是,这些对象集合(分区)被分布式的存储在集群中的不同节点上。
16 | Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些分区在集群中的不同节点上。
17 | 初次之外,RDD还包含了一些操作API,例如常见的map,reduce,filter等。
18 |
19 |
20 | 1. 使用shell方式操作Spark
21 |
22 | Tips:建议先准备在home目录下新建workspace/learnspark/目录
23 | ```
24 | cd ~
25 | mkdir -r workspace/learnspark/
26 | cd workspace/learnspark/
27 | ```
28 | vim test.txt 输入i进入编辑模式
29 | 
30 | 保存退出(esc+:wq)
31 |
32 | a. 进入交互式编程环境,打开终端,在终端输入pyspark,便可进入pyspark环境。进入pyspark环境后,会初始化好SparkContext。
33 | 
34 | b. 创建rdd
35 | 通常有两种方式创建RDD,一种是读取外部数据集,另外一种是使用已有的对象集合。
36 | 1. 使用已有的对象集合
37 |
38 | 
39 | 2. 读取外部数据集(注意更换目录)
40 |
41 | 
42 | 1. 基础的API操作,为了简便,下面如果未声明,均使用第一种方式创建rdd,这也是在工作中快速验证rdd API功能的最简便快捷的方式。
43 |
44 | map:数据集中的每个元素经过用户自定义的函数转换形成一个新的RDD
45 | 
46 | 我们自定义了一个lambda函数,使得每个元素+1.
47 | 那么,这和普通的python list操作有什么区别的?试想,当list的元素在百万,千万级别的时候,python还尚能处理这种逻辑,假如集合中的元素是百亿,千亿级别呢,这个时候就需要依靠Spark处理了。这也正是RDD要解决的问题,海量大数据处理。
48 | map示意图,其中红色方框代表分区
49 | 
50 | union 两个rdd的并集
51 | 
52 | intersection 两个rdd的交集,注意这里声明了一个新的rdd7= 5,2,1和rdd5=5,2,0的交集是5,2
53 | 
54 | filter: 过滤,筛选出符合条件的元素
55 | 
56 | distinct:去重
57 | 
58 | cartesian:笛卡儿积
59 | 
60 | reduce: 将rdd中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。
61 | 
62 | groupByKey:对于kv类型的数据,按key分组
63 | 
64 |
65 | 需要说明的是,spark RDD的算子分为两种,一种是transformation,例如map,filter;另外一种是action,例如collect(),count(),groupByKey()等。只有action算子才会真正的触发计算。
66 |
67 | RDD API问题与作业
68 | 1. 尽可能多的练习RDD的其他API,包括sortBy,join,reduceByKey,take,first,count,countByKey等。
69 | 2. 整理自己学习过的RDD算子,并给他们按照transformation和action进行归类,画出思维导图。
70 | 3. 说一说take,collect,first的区别,为什么不建议使用collect?(虽然我用了。。。)
71 | 1. 向集群提交Spark程序
72 |
73 | 可以在jupyter book中使用spark,也可以在pySpark中直接使用(会自动创建spark context)
74 | 不过更常用的是,将job提交到集群中运行。
75 | 4.1 先来体验一下Spark版本的wordcount吧
76 | wc.py
77 | ```
78 | import os
79 | from pyspark import SparkConf,SparkContext
80 |
81 | conf = SparkConf().setMaster('local').setAppName('word count')
82 | sc = SparkContext(conf = conf)
83 | ```
84 |
85 | #注意将这里改成自己的路径
86 | ```
87 | import os
88 | from pyspark import SparkConf,SparkContext
89 |
90 | conf = SparkConf().setMaster('local').setAppName('word count')
91 | sc = SparkContext(conf = conf)
92 |
93 | #注意将这里改成自己的路径
94 | text_file = sc.textFile('hdfs:///test/The_Man_of_Property.txt')
95 |
96 | count = text_file.flatMap(lambda line:line.split(" ")).map(lambda word:(word,1)).reduceByKey(lambda a,b:a+b).sortBy(ascending=False, numPartitions=None, keyfunc = lambda x: x[1])
97 |
98 | print(count.take(10))
99 |
100 | #拿出一些结果先看看
101 | print(count_rdd.take(50))
102 | #保存结果
103 | count_rdd.saveAsTextFile('hdfs:///datawhale/out/')
104 | ```
105 |
106 | **提交:****bin/spark-submit --master spark://host:port --executor-memory 2g wc.py**
107 | 4.2 wordcount 的另外一种写法
108 | ```
109 | def splitx():
110 | return line.split(" ")
111 |
112 | count = textfile.flatMap(splitx) \
113 | .map(lambda word:(word,1)) \
114 | .reduceByKey(lambda a,b:a+b)
115 | ```
116 | 这里想说明的是,map/reduce等算子,不仅可以接受lamda函数作为参数,也可以接受自定义的函数,直接把函数名传进去即可。
117 |
118 |
119 | 任务:
120 | 1. 使用上述API计算《The man of property》中共出现过多少不重复的单词,以及出现次数最多的10个单词。
121 |
122 | movielen 数据集:[http://files.grouplens.org/datasets/movielens/ml-1m.zip](http://files.grouplens.org/datasets/movielens/ml-1m.zip)
123 | 2. 计算出movielen中,每个用户最喜欢的前5部电影。
124 | ```
125 | 运行pyspark
126 | import pandas as pd
127 | # 读取文件
128 | user_data = sc.textFile("/test/users.dat")
129 | movie_data = sc.textFile("/test/movies.dat")
130 | ratings_data = sc.textFile("/test/ratings.dat")
131 | # 切分数据
132 | user_rdd = user_data.map(lambda line: line.split("::"))
133 | movie_rdd = movie_data.map(lambda line: line.split("::"))
134 | ratings_rdd = ratings_data.map(lambda line: line.split("::"))
135 | # 将RDD转化为DF
136 | user_df = sqlContext.createDataFrame(user_rdd).toPandas()
137 | movie_df = sqlContext.createDataFrame(movie_rdd).toPandas()
138 | ratings_df = sqlContext.createDataFrame(ratings_rdd).toPandas()
139 | # Rename列名
140 | user_df.columns = ['UserID','Gender',"Age","Occupation","Zip-code"]
141 | ratings_df.columns = ['UserID','MovieID',"Rating","Timestamp"]
142 | movie_df.columns = ['MovieID','Title',"Genres"]
143 | #将三张表合并成一张表
144 | total_df = pd.merge(ratings_df,user_df,on = ["UserID"],how = "right")
145 | total_df = pd.merge(total_df,movie_df,on = ["MovieID"],how = "left")
146 | # 聚合操作
147 | c = total_df["Title"].groupby(total_df["UserID"])
148 | # 取出前5ge
149 | second = c.agg(lambda x: x.value_counts().index[1]).reset_index()
150 | first = c.agg(lambda x: x.value_counts().index[0]).reset_index()
151 | third = c.agg(lambda x: x.value_counts().index[2]).reset_index()
152 | fourth = c.agg(lambda x: x.value_counts().index[3]).reset_index()
153 | fifth = c.agg(lambda x: x.value_counts().index[4]).reset_index()
154 | # 创建新的的DF
155 | like = pd.DataFrame()
156 | like["UserID"] = first.UserID
157 | like["first"] = first.Title
158 | like["second"] = second.Title
159 | like["third"] = third.Title
160 | like["fourth"] = fourth.Title
161 | ```
162 | 3. like["fifth"] = fifth.Title
163 |
164 | print(like[:5])
165 |
166 | 计算出movielen数据集中,平均评分最高的五个电影。
167 | ```
168 | total_df.groupby('Title')['Rating'].mean().reset_index().sort_values("Rating",ascending = False)[:5]
169 | ```
170 | 4. 【选做】 计算出movielen用户的行为相似度(相似度采用Jaccard相似度)。
171 |
172 | 参考资料:[远程连接jupyter](https://blog.csdn.net/qq_18293213/article/details/72910834)
173 |
174 | 【没有jblas库解决办法】
175 | 下载jblas包 :[https://pan.baidu.com/s/1o8w6Wem](https://pan.baidu.com/s/1o8w6Wem)
176 | 运行spark-shell时添加jar:spark-shell --jars [jblas path] /jblas-1.2.4.jar
177 |
178 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/参考答案/Task6参考答案.md:
--------------------------------------------------------------------------------
1 | # 【Task6】Hive原理及其使用
2 | 参考资料:[https://www.shiyanlou.com/courses/running](https://www.shiyanlou.com/courses/running)
3 | 1. 认识Hive
4 |
5 | Hive通常用于数据仓库,可存储/查询结构化数据等,其优势在于存储量极大,可以存储数百亿/千亿(TB/PB)级别的数据。相较于传统的RDBMS,只能存储千万/亿级数据,有很大优势。
6 | 其底层存储依赖于HDFS,因此可以水平扩展,
7 | 元信息存储在derby或mysql中,
8 | 查询使用HQL,底层使用MapReduce实现。
9 | 2. Hive与传统RDBMS的区别
10 |
11 | 
12 | 3. HIve原理及架构图
13 |
14 | 
15 | a、 用户接口主要有三个: CLI, Client 和 WUI。其中最常用的是 CLI, Cli 启动的时候,
16 | 会同时启动一个 Hive 副本。 Client 是 Hive 的客户端,用户连接至 Hive Server。
17 | 在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive
18 | Server。 WUI 是通过浏览器访问 Hive。
19 | b、 元数据:Hive 将元数据存储在数据库中,如 mysql、 derby。 Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
20 | c、 HQL:解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。
21 | d、 Hadoop:Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 任务)。
22 | 4. HQL(Hive中的SQL)
23 |
24 | a. 准备数据
25 | b.建表
26 | ```
27 | CREATE EXTERNAL TABLE datawhale.user_action
28 | (id INT,
29 | uid STRING,
30 | item_id STRING,
31 | behavior_type INT,
32 | item_category STRING,
33 | visit_date DATE,
34 | province STRING) COMMENT 'Welcome to datawhale!'
35 | ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '/datawhale/user_action';
36 | ```
37 | 也可以先建表,再载入数据。
38 |
39 | c. 查看存在的表
40 | ```
41 | show tables;
42 | ```
43 | 查看表结构
44 | ```
45 | desc datawhale.user_action;
46 | ```
47 | d. 筛选10条看看
48 | ```
49 | select * from datawhale.user_action limit 10;
50 | ```
51 | e. 查询表内共多少行数据
52 | ```
53 | select count(*) from datawhale.user_action;
54 | ```
55 | f. 查询不重复的uid共多少行
56 | ```
57 | select count(distinct uid) from datawhale.user_action;
58 | ```
59 | g. 查询2014年12月10日到2014年12月14日有多少人浏览了商品
60 | ```
61 | select count(*) from datawhale.user_action where behavior_type='1' and visit_date<='2014-12-14' and visit_date>='2014-12-10';
62 | ```
63 | h 查询一件商品的购买率
64 | i. 查询某一天在该网站购买商品超过5次的用户id
65 | ```
66 | select uid from datawhale.user_action where behavior_type='4' and visit_date='2014-12-12' group by uid having count(behavior_type='4')>5;
67 | ```
68 | h. 创建中间表,存储每个地区有多少用户浏览了网站
69 | ```
70 | create table datawhale.province_user_dist(
71 | province STRING,
72 | view INT)
73 | COMMENT 'This is the count of user of each city'
74 | ROW FORMAT DELIMITED FIELDS
75 | TERMINATED BY '\t' STORED AS TEXTFILE;
76 | ```
77 | #覆盖式的导入数据(有问题)
78 | ```
79 | insert overwrite table datawhale.provice_user_count
80 | select province,count(behavior_type)
81 | from datawhale.user_action
82 | where behavior_type='1' group by province;
83 | ```
84 | Tips:试想,如果你的表特别的大,有没有什么可以优化的地方?
85 | 当然有,比如分区分桶,分区分桶可以从一定程度上提高查询效率。
86 |
87 | 5. Hive内部表/外部表/分区
88 |
89 | 内部表(managed table)
90 | * 默认创建的是内部表(managed table),存储位置在hive.metastore.warehouse.dir设置,默认位置是/user/hive/warehouse。
91 | * 导入数据的时候是将文件剪切(移动)到指定位置,即原有路径下文件不再存在
92 | * 删除表的时候,数据和元数据都将被删除
93 | * 默认创建的就是内部表create table xxx (xx xxx)
94 |
95 | 外部表(external table)
96 | * 外部表文件可以在外部系统上,只要有访问权限就可以
97 | * 外部表导入文件时不移动文件,仅仅是添加一个metadata
98 | * 删除外部表时原数据不会被删除
99 | * 分辨外部表内部表可以使用DESCRIBE FORMATTED table_name命令查看
100 | * 创建外部表命令添加一个external即可,即create external table xxx (xxx)
101 | * 外部表指向的数据发生变化的时候会自动更新,不用特殊处理
102 |
103 | 表分区(Partitioned table)
104 | * 有些时候数据是有组织的,比方按日期/类型等分类,而查询数据的时候也经常只关心部分数据,比方说我只想查2017年8月8号,此时可以创建分区
105 |
106 | 数据准备:
107 | movielen
108 | user item rate thedate
109 | 分区表的创建:
110 | ```
111 | create table datawhale.user_action_partition(
112 | user int comment "user id",
113 | item int comment "teim_id",
114 | rate int comment "rate"
115 | )
116 | partitioned by (thedate string);
117 | ```
118 | 查询分区;
119 | ```
120 | show partitions datawhale.user_action_partition;
121 | ```
122 | 插入分区。
123 |
124 | 删除分区。
125 | ```
126 | ALTER TABLE table_name DROP PARTITION (thedate='20000101')
127 | ```
128 | 分区表的查询。
129 | 思考一下,为什么要使用分区表?
130 |
131 | 参考:
132 | [https://www.cnblogs.com/wswang/p/7718103.html](https://www.cnblogs.com/wswang/p/7718103.html)
133 |
134 | 6. HiveUDF
135 |
136 | demo1:
137 | 这里用python自定义函数,去实现一个方法,利用身份证号去判断性别(18位身份证的倒数第二位偶数为女,奇数为男.15位身份证的倒数第一位偶数为女,奇数为男.).其实这个需求可以使用hive自带的function去进行解决.我们接下来使用2种方式去实现这个需求.
138 | 数据:
139 | ```
140 | neil 411326199402110030
141 | pony 41132519950911004x
142 | jcak 12312423454556561
143 | tony 412345671234908
144 | ```
145 | HQL:
146 | ```
147 | select idcard,
148 | case when length(idcard) = 18 then
149 | case when substring(idcard,-2,1) % 2 = 1 then '男'
150 | when substring(idcard,-2,1) % 2 = 0 then '女'
151 | else 'unknown' end
152 | when length(idcard) = 15 then
153 | case when substring(idcard,-1,1) % 2 = 1 then '男'
154 | when substring(idcard,-1,1) % 2 = 0 then '女'
155 | else 'unknown' end
156 | else '不合法' end
157 | from person;
158 | ```
159 | hive udf:
160 | ```
161 | # -*- coding: utf-8 -*-
162 | import sys
163 |
164 | for line in sys.stdin:
165 | detail = line.strip().split("\t")
166 | if len(detail) != 2:
167 | continue
168 | else:
169 | name = detail[0]
170 | idcard = detail[1]
171 | if len(idcard) == 15:
172 | if int(idcard[-1]) % 2 == 0:
173 | print("\t".join([name,idcard,"女"]))
174 | else:
175 | print("\t".join([name,idcard,"男"]))
176 | elif len(idcard) == 18:
177 | if int(idcard[-2]) % 2 == 0:
178 | print("\t".join([name,idcard,"女"]))
179 | else:
180 | print("\t".join([name,idcard,"男"]))
181 | else:
182 | print("\t".join([name,idcard,"身份信息不合法!"]))
183 | ```
184 |
185 | ===测试
186 | ```
187 | cat person.txt|python person.py
188 | ```
189 | ===udf
190 | ```
191 | add file hiveudf.py
192 | select transform(name,idcard) USING 'python person.py' AS (name,idcard,gender) from person;
193 | ```
194 |
195 | 1. 文件开头的 add file 语句将 hiveudf.py 文件添加到分布式缓存,使群集中的所有节点都可访问该文件。
196 | 2. SELECT TRANSFORM ... USING 语句从 hivesampletable 中选择数据。 它还将 name、idcard值传递到 hiveudf.py 脚本。
197 | 3. AS 子句描述从 hiveudf.py 返回的字段。
198 |
199 | 脚本文件:
200 | 1. 从 STDIN 读取一行数据。
201 | 2. 尾随的换行符使用 string.strip()删除。
202 | 3. 执行流式处理时,一个行就包含了所有值,每两个值之间有一个制表符。 因此, string.split("\t") 可用于在每个制表符处拆分输入,并只返回字段。
203 | 4. 在处理完成后,必须将输出以单行形式写入到 STDOUT,并在每两个字段之间提供一个制表符。
204 |
205 |
206 |
207 | 参考:
208 | 1. [https://blog.csdn.net/qq_26937525/article/details/54136317](https://blog.csdn.net/qq_26937525/article/details/54136317)
209 | 2. [https://docs.azure.cn/zh-cn/hdinsight/hadoop/python-udf-hdinsight](https://docs.azure.cn/zh-cn/hdinsight/hadoop/python-udf-hdinsight)
210 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | Datawhale_Learning涵盖了AI领域从理论知识到动手实践的学习内容
3 |
4 | 
5 |
6 | # 编程基础
7 | ## 课程列表
8 | ### 【编程】
9 | **课程简介**
10 |
11 | 课程设计:光城 、LeoLRH
12 |
13 | 组队学习说明:利用自己所熟知的编程语言,具有一定基础,讨论在面试中可能出现的数据结构问题,一起学习重温经典数据结构
14 |
15 | 任务路线:数组->链表->栈->队列->递归->排序->二分查找->哈希表->字符串->二叉树->堆->图->回溯->分治->动态规划
16 |
17 | 组队学习周期:14天甚至往上大概16天左右(周末进行整体整理讨论)(每天任务时间具体看任务情况)
18 |
19 | 定位人群:有一门语言基础和算法基础的同学,
20 | 每个任务完成大概所需时间:平均每天学习时间在1个小时左右,晚上统一,半个小时进行集体讨论总结打卡。
21 |
22 | 难度系数:高,小白慎入!!!
23 |
24 | **任务安排**
25 | - Task1:[数组+链表(2天)](./编程基础/Programming/学习任务/Task1.md)
26 | - Task2:[栈+队列+递归(3天)](./编程基础/Programming/学习任务/Task2.md)
27 | - Task3:[排序+二分查找(2天)](./编程基础/Programming/学习任务/Task3.md)
28 | - Task4:[散列表(哈希表)+字符串(2天)](./编程基础/Programming/学习任务/Task4.md)
29 | - Task5:[二叉树+堆(2天)](./编程基础/Programming/学习任务/Task5.md)
30 | - Task6:[图(2天)](./编程基础/Programming/学习任务/Task6.md)
31 | - Task7:[递归+回溯+分治+动态规划(2天)](./编程基础/Programming/学习任务/Task7.md)
32 |
33 |
34 |
35 | ### 【leetCode】
36 |
37 | **课程简介**
38 |
39 | 课程设计:老表、于鸿飞、杨皓博
40 |
41 | 组队学习说明:Leetcode刷题组队学习,从零开始每天一道算法题,在良好的学习氛围下,培养刷题习惯,学习算法思想。(不限制编程语言)
42 |
43 | 任务路线:腾讯精选练习(50 题)顺序每天一道题。
44 |
45 | 地址链接:https://leetcode-cn.com/problemset/50/
46 |
47 | 组队学习周期:50天(50题全部完成即结束)
48 |
49 | 定位人群:适合有一门语言基础的同学,难度系数中
50 |
51 | 每个任务完成大概所需时间:2-3h
52 |
53 | **任务安排**
54 |
55 | 选取腾讯精选练习(50 题)解答,每天1题
56 |
57 |
58 | # 基础知识
59 |
60 | ## 课程列表
61 | ### 【统计学】
62 |
63 | **课程简介**
64 |
65 | 课程设计:王佳鑫、许辉
66 |
67 | 组队学习说明:学习内容涵盖统计学中所有的主要知识,并对其分部分进行梳理总结。
68 |
69 | 任务路线:根据所学习内容进行(1)统计学基本知识、二项及泊松分布、大数定律、正态分布等内容的总结进行整体的回顾、梳理与完善;(2)中心极限定理、置信区间、 假设检验等内容的总结进行整体的回顾、梳理与完善。
70 |
71 | 组队学习周期:7天
72 |
73 | 定位人群:微积分、基本概率知识储备,难度系数中
74 |
75 | 每个任务完成大概所需时间:2-3h
76 |
77 | 学习内容
78 |
79 | (1)本次统计学学习以网易云可汗学院公开课为主:
80 |
81 | 视频链接:http://open.163.com/special/Khan/khstatistics.html
82 |
83 | (2)并以《深入浅出统计学》为辅:
84 |
85 | 书籍链接:https://pan.baidu.com/s/1dCV6rrOWZU-deKxAoectGA
86 |
87 | **任务安排**
88 |
89 | - Task1:[统计学基本知识+二项及泊松分布+大数定律+正态分布(2天)](./基础知识/Statistical/学习任务/Task1.md)
90 | - Task2:[中心极限定理+置信区间(1天)](./基础知识/Statistical/学习任务/Task2.md)
91 | - Task3:[假设检验(2天)](./基础知识/Statistical/学习任务/Task3.md)
92 | - Task4:[线性回归+卡方分布+方差分析(2天)](./基础知识/Statistical/学习任务/Task4.md)
93 |
94 |
95 |
96 | ### 【Python基础】
97 | **课程简介**
98 |
99 |
100 | 课程设计:马晶敏,叶梁
101 |
102 | 组队学习说明:学习python基础知识,针对python小白的学习之路
103 |
104 | 任务路线:基础知识-函数-第三方模块-类和对象
105 |
106 | 组队学习周期:10天
107 |
108 | 定位人群:python小白,难度系数低
109 |
110 | 每个任务完成大概所需时间:每天平均花费时间2小时-4小时不等,根据个人学习接受能力强弱有所浮动
111 |
112 | **任务安排**
113 | - Task1:[环境搭建+python初体验+python基础讲解+ python数值基本知识(2天)](./基础知识/Python/学习任务/Task1.md)
114 | - Task2:[列表+元组+string字符串+字符串格式化问题(2天)](./基础知识/Python/学习任务/Task2.md)
115 | - Task3:[数组+集合+判断语句+三目表达式+循环语句(2天)](./基础知识/Python/学习任务/Task3.md)
116 | - Task4:[数组+集合+判断语句+三目表达式+循环语句(2天)](./基础知识/Python/学习任务/Task4.md)
117 | - Task5:[函数+file+os模块+ datetime模块(2天)](./基础知识/Python/学习任务/Task5.md)
118 |
119 |
120 |
121 |
122 | # 数据科学
123 | ## 课程列表
124 | ### 【Excel入门】
125 | **课程简介**
126 |
127 | 课程设计:杨煜,李严
128 |
129 | 组队学习说明:职场人士必备学习内容。通过集中式学习和大量实战练习,快速了解并掌握Excel核心功能,保证今后工作中用得到。
130 |
131 | 任务路线:基础界面(2天) --> 基础文件操作&单元格操作(2天) --> 基础函数(2天) --> 查找函数vlookup和 match/index(2天) --> 基础图表(3天) --> 数据透视表(2天)
132 |
133 | 组队学习周期:11天
134 |
135 | 定位人群:小白或有一点基础但不熟练的人群;初入职场人群必学;难度系数简单
136 |
137 | 每个任务完成大概所需时间:2-3h/每天
138 |
139 | **任务安排**
140 |
141 | - Task1:[基础界面+文件操作+基础单元格操作(3天)](数据科学/Excel/学习任务/Task1.md)
142 | - Task2:[单元格引用+运算符+文本函数+逻辑函数+计算函数(2天)](数据科学/Excel/学习任务/Task2.md)
143 | - Task3:[vlookup函数用法+match&index+双条件查找(2天)](数据科学/Excel/学习任务/Task3.md)
144 | - Task4:[图表类型+图表类型选择指南+图表的构成要素(3天)](数据科学/Excel/学习任务/Task4.md)
145 | - Task5:[数据透视表+实现数据分段统计+变更值汇总依据+设置三种值百分比+计算字段&计算项(2天)](数据科学/Excel/学习任务/Task5.md)
146 |
147 |
148 |
149 | ### 【数据分析】
150 |
151 | **课程简介**
152 |
153 | 课程设计:金娟娟
154 |
155 | 组队学习说明:学习python for data analysis基础知识
156 |
157 | 任务路线:python基础-重要的python库(numpy/pandas/matplotlib/seaborn等)-数据清洗和分析
158 |
159 | 组队学习周期:15天定位人群:数据分析小白,难度系数低
160 |
161 | 每个任务完成大概所需时间:每天平均花费时间2小时-4小时不等,根据个人学习接受能力强弱有所浮动
162 |
163 | **任务安排**
164 | - Task0:[github+jupyter(1天)](数据科学/Data_Analysis/学习任务/Task0.md)
165 | - Task1:[第4章numpy+作业1(2天)](数据科学/Data_Analysis/学习任务/Task1.md)
166 | - Task2:[第5章pandas+第6章数据载入(3天)](数据科学/Data_Analysis/学习任务/Task2.md)
167 | - Task3:[第7章数据清洗+第8章数据联合(3天)](数据科学/Data_Analysis/学习任务/Task3.md)
168 | - Task4:[第10章数据聚合+第12章高阶pandas+作业2(3天)](数据科学/Data_Analysis/学习任务/Task4.md)
169 | - Task5:[第9章matplotlib+作业3(2天)](数据科学/Data_Analysis/学习任务/Task5.md)
170 | - Task6:[第11章时间序列(2天)](数据科学/Data_Analysis/学习任务/Task6.md)
171 | - Task7:[大作业+总结(3天)](数据科学/Data_Analysis/学习任务/Task7.md)
172 |
173 | ### 【MySQL】
174 |
175 | **课程简介**
176 | 课程设计:杨皓博 孙涛 杨煜
177 |
178 | 组队学习说明:一周内快速了解并掌握MySQL的主要内容。通过大量SQL语句的实战练习,可以在简历上写熟练掌握MySQL。(注意:本课程只关注SQL查询语句本身,对数据库的涉及较少。)
179 |
180 | 任务路线: MySQL软件安装及数据库基础->查询语句->表操作->表联结->MySQL 实战->MySQL 实战-复杂项目
181 |
182 | 组队学习周期:(8天)
183 |
184 | **定位人群:小白,难度系数小**
185 |
186 | 每个任务完成大概所需时间:2-3h
187 | 数据科学/MYSQL/MySQL学习内容/MySQL任务1 - 3天.md
188 | **任务安排**
189 | - Task1:[软件安装及数据库基础+MySQL 基础 (一)- 查询语句(3天)](数据科学/MYSQL/学习任务/Task1.md)
190 | - Task2:[MySQL 基础 (二)- 表操作(3天)](数据科学/MYSQL/学习任务/Task2.md)
191 | - Task3:[MySQL 实战(1天)](数据科学/MYSQL/学习任务/Task3.md)
192 | - Task4:[MySQL 实战 - 复杂项目(1天)](数据科学/MYSQL/学习任务/Task4.md)
193 |
194 |
195 | ### 【爬虫】
196 |
197 | **课程简介**
198 |
199 | 课程设计:光城、李方
200 |
201 | 组队学习说明:从零基础到能独立完成一个简易的爬虫项目
202 |
203 | 任务路线:请求→re→beautifulsoup→lxml→selenium→IP问题→实战小项目
204 |
205 | 组队学习周期:7天
206 |
207 | 定位人群:有Python基础。难度系数中
208 |
209 | 每个任务完成大概所需时间:2-3h/天
210 |
211 | **任务安排**
212 | - Task1:[get与post请求+正则表达式(2天)](./数据科学/Scrapy/学习任务/Task1.md)
213 | - Task2:[beautifulsoup+xpath(2天)](./数据科学/Scrapy/学习任务/Task2.md)
214 | - Task3:[selenium+IP(2天)](./数据科学/Scrapy/学习任务/Task3.md)
215 | - Task4:[实战大项目(2天)](./数据科学/Scrapy/学习任务/Task4.md)
216 | # 机器学习
217 | ## 课程列表
218 | ### 【初级算法梳理】
219 |
220 | **课程简介**
221 |
222 | 课程设计:苏静、康兵兵
223 |
224 | 组队学习说明:通过查阅书籍或参考文献、学习视频等,对传统机器学习算法进行梳理
225 |
226 | 任务路线:线性回归--->逻辑回归--->决策树
227 |
228 | 组队学习周期:7天
229 |
230 | 定位人群:有概率论、矩阵运算、求导、泰勒展开等基础数学知识
231 |
232 | 难度系数:低
233 |
234 | 每个任务完成大概所需时间:2-3h
235 |
236 | **任务安排**
237 | - Task1:[线性回归算法梳理(2天)](./机器学习/Primary-algorithm-combing/学习任务/Task1.md)
238 | - Task2:[逻辑回归算法梳理(2天)](./机器学习/Primary-algorithm-combing/学习任务/Task2.md)
239 | - Task3:[决策树算法梳理(2天)](./机器学习/Primary-algorithm-combing/学习任务/Task3.md)
240 |
241 |
242 |
243 | ### 【高级算法梳理】
244 |
245 | **课程简介**
246 |
247 | 课程设计:黑桃,刘广月,于鸿飞
248 |
249 | 组队学习说明:通过查阅相关文献,对机器学习算法进行梳理
250 |
251 | 任务路线:RF--->GBDT--->XGB--->LightGBM
252 |
253 | 组队学习周期:10天
254 |
255 | 定位人群:有概率论、矩阵运算、求导、泰勒展开等基础数学知识;
256 |
257 | 难度系数:中
258 |
259 | 每个任务完成大概所需时间:2-3h
260 |
261 | **任务安排**
262 | - Task1:[随机森林算法梳理(2天)](./机器学习/Advanced-algorithm-combing/学习任务/Task1.md)
263 | - Task2:[GBDT算法梳理(2天)](./机器学习/Advanced-algorithm-combing/学习任务/Task2.md)
264 | - Task3:[XGB算法梳理(3天)](./机器学习/Advanced-algorithm-combing/学习任务/Task3.md)
265 | - Task4:[LightGBM算法梳理(3天)](./机器学习/Advanced-algorithm-combing/学习任务/Task4.md)
266 |
267 | ### 【李宏毅机器学习】:
268 |
269 | **课程简介**
270 |
271 |
272 | **任务安排**
273 | - Task1:
274 | - Task2:
275 | - Task3:
276 | - Task4:
277 | - Task5:
278 | - Task6:
279 | - Task7:
280 | - Task8:
281 | - Task9:
282 | - Task10:
283 |
284 |
285 | ### 【西瓜书】
286 |
287 | **课程简介**
288 |
289 |
290 | **任务安排**
291 | - Task1:
292 | - Task2:
293 | - Task3:
294 | - Task4:
295 | - Task5:
296 | - Task6:
297 | - Task7:
298 | - Task8:
299 | - Task9:
300 | - Task10:
301 |
302 |
303 | # 深度学习
304 | ## 课程列表
305 | ### 【Pytorch基础】
306 |
307 | **课程简介**
308 | 课程设计:许辉 李奇锋
309 |
310 | 组队学习说明:通过学习pytorch的基本操作,最终完成手写数字的识别
311 |
312 | 任务路线:安装pytorch->设立图并计算->实现逻辑回归->构建多层神经网络->PyTorch实现L1,L2正则化以及Dropout->书写优化器代码->用PyTorch完成手写数字识别
313 |
314 | 学习周期:14天
315 |
316 | 定位人群:熟悉python的基础用法
317 |
318 | 任务完成所需时间:2-3h/天
319 |
320 | 难度系数:中
321 |
322 | **任务安排**
323 | - Task1:[PyTorch的基本概念(2天)](深度学习/Pytorch/学习任务/Task1.md)
324 | - Task2:[设立计算图并自动计算(2天)](深度学习/Pytorch/学习任务/Task2.md)
325 | - Task3:[PyTorch实现Logistic regression(2天)](深度学习/Pytorch/学习任务/Task3.md)
326 | - Task4:[PyTorch实现多层网络(2天)](深度学习/Pytorch/学习任务/Task4.md)
327 | - Task5:[PyTorch实现L1,L2正则化以及Dropout(2天)](深度学习/Pytorch/学习任务/Task5.md)
328 | - Task6:[PyTorch理解更多神经网络优化方法(2天)](深度学习/Pytorch/学习任务/Task6.md)
329 | - Task7:[手写数字识别(2天)](深度学习/Pytorch/学习任务/Task7.md)
330 |
331 | # 理论应用
332 | ## 课程列表
333 | ### 【数据挖据】
334 |
335 | **课程简介**
336 |
337 | 课程设计:范晶晶、李碧涵、
338 |
339 | 组队学习说明:应用机器学习算法,完整地走完一个数据挖掘项目流程
340 |
341 | 任务路线:数据分析→特征工程→模型构建→模型评估→模型调优→模型融合
342 |
343 | 组队学习周期:12天
344 |
345 | 定位人群:有Python基础,sklearn基础。难度系数中
346 |
347 | 每个任务完成大概所需时间:2-3h/天
348 |
349 | **任务安排**
350 | - Task1:[数据分析(2天)](./理论应用/Data-mining/学习任务/Task1.md)
351 | - Task2:[特征工程(2天)](./理论应用/Data-mining/学习任务/Task2.md)
352 | - Task3:[模型构建 (2天)](./理论应用/Data-mining/学习任务/Task3.md)
353 | - Task4:[模型评估(2天)](./理论应用/Data-mining/学习任务/Task4.md)
354 | - Task5:[模型调优(2天)](./理论应用/Data-mining/学习任务/Task5.md)
355 | - Task6:[模型融合(2天)](./理论应用/Data-mining/学习任务/Task6.md)
356 |
357 |
358 | ### 【自然语言处理(理论+实践)】
359 |
360 | **课程简介**
361 |
362 | 课程设计:jepson
363 |
364 | 组队学习说明:学习自然语言处理理论,并且通过对某些数据集的文本分类任务不断优化来进行实践。
365 |
366 | 任务路线:特征提取—>特征选择—>文本表示—>传统机器学习算法跑模型—>LDA生成新特征—>深度学习算法跑模型
367 |
368 | 定位人群:有Python基础,基本框架的基础(例如TensorFlow、Keras和pyTorch等)!难度系数高
369 |
370 | 组队学习周期:18天
371 |
372 | 每个任务完成大概所需时间:3-4h
373 |
374 | **任务安排**
375 | - 预备任务:[tensorflow安装+tensrflow基础+NLP](./理论应用/NLP-theory-practice-/学习任务/预备任务.md)
376 | - Task1:[数据集探索(2天)](./理论应用/NLP-theory-practice-/学习任务/Task1.md)
377 | - Task2:[特征提取(2天)](./理论应用/NLP-theory-practice-/学习任务/Task2.md)
378 | - Task3:[特征选择 (2天)](./理论应用/NLP-theory-practice-/学习任务/Task3.md)
379 | - Task4:[模型 (2天)](./理论应用/NLP-theory-practice-/学习任务/Task4.md)
380 | - Task5:[文本表示(2天)](./理论应用/NLP-theory-practice-/学习任务/Task5.md)
381 | - Task6:[神经网络基础(2天)](./理论应用/NLP-theory-practice-/学习任务/Task6.md)
382 | - Task7:[卷积神经网络(2天)](./理论应用/NLP-theory-practice-/学习任务/Task7.md)
383 | - Task8:[循环和递归神经网络(2天)](./理论应用/NLP-theory-practice-/学习任务/Task8.md)
384 | - Task9:[Attention原理(2天)](./理论应用/NLP-theory-practice-/学习任务/Task9.md)
385 | - Task10:[BERT(3天)](./理论应用/NLP-theory-practice-/学习任务/Task10.md)
386 |
387 | ### 【论文复现】
388 |
389 | **课程简介**
390 |
391 | 【课程简介】
392 |
393 | 课程设计:杨开漠,王翔
394 |
395 | 任务路线:论文学习->研读模型->跑模型->针对学习中存在的问题进行后期讨论
396 |
397 | 学习周期:14天(每周一篇)
398 |
399 | 定位人群:具有nlp基础、代码阅读能力以及论文学习能力
400 |
401 | 学习难度:高
402 |
403 | 【学习模式】
404 |
405 | 论文发布(第一天或者最后一天晚上) -> 论文研读笔记作业(3天)-> 模型调试心得作业(4天)-> 后期讨论(最后一天晚上)
406 |
407 | * 论文研读笔记作业模板
408 | * 研究动机,研究方法,实验结果,创新点,个人点评
409 |
410 | * 模型调试心得作业
411 | * 模型地址,模型运行环境,数据集选择与下载,模型运行步骤,问题与解决方法汇总,个人点评
412 |
413 | ### 【Spark基础】
414 |
415 | **课程简介**
416 |
417 | 课程设计:Summer
418 |
419 | 组队学习说明:学习spark基础知识,针对spark小白的学习之路
420 |
421 | 任务路线:运行原理-环境搭建-RDD编程-SparkSQL-MLlib-常用算法
422 |
423 | 组队学习周期:12天
424 |
425 | 定位人群:spark小白,**难度系数中**
426 |
427 | 每个任务完成大概所需时间:每天平均花费时间**2小时-4小时**不等,根据个人学习接受能力强弱有所浮动
428 |
429 | **任务安排**
430 |
431 | - Task1:[运行原理,RDD设计,DAG,安装与使用(3天)](./机器学习/Spark基础/学习任务/Task1.md)
432 | - Task2:[RDD编程,熟悉算子,读写文件(3天)](./机器学习/Spark基础/学习任务/Task2.md)
433 | - Task3:[DataFrame,SparkSQL (2天)](./机器学习/Spark基础/学习任务/Task3.md)
434 | - Task4:[MLlib流设计,特征工程 (2天)](./机器学习/Spark基础/学习任务/Task4.md)
435 | - Task5:[逻辑回归,决策树(2天)](./机器学习/Spark基础/学习任务/Task5.md)
436 |
437 |
438 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/参考答案/【Task7】实践.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "**导入相关包**"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 1,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import pandas as pd\n",
17 | "import numpy as np"
18 | ]
19 | },
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {},
23 | "source": [
24 | "**读取数据**"
25 | ]
26 | },
27 | {
28 | "cell_type": "code",
29 | "execution_count": 2,
30 | "metadata": {
31 | "scrolled": true
32 | },
33 | "outputs": [
34 | {
35 | "data": {
36 | "text/plain": [
37 | "[['uid', 'content_list', 'content_id'],\n",
38 | " ['0', '164423,430922,112513,485726,488385,340139,489273,391258', '112513'],\n",
39 | " ['1',\n",
40 | " '635374,409237,586823,305055,519191,772121,788428,754213',\n",
41 | " '305055,586823,305055,305055'],\n",
42 | " ['2',\n",
43 | " '57518,70020,828660,9511,477360,821209,178443,973485',\n",
44 | " '178443,70020,178443,9511']]"
45 | ]
46 | },
47 | "execution_count": 2,
48 | "metadata": {},
49 | "output_type": "execute_result"
50 | }
51 | ],
52 | "source": [
53 | "content_list_id = sc.textFile('hdfs:///test/content_list_id.txt')\n",
54 | "content_list_id = content_list_id.map(lambda line: line.split(\"\\t\"))\n",
55 | "content_list_id.take(4)"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "**将数据转化为DF**"
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 3,
68 | "metadata": {},
69 | "outputs": [
70 | {
71 | "data": {
72 | "text/html": [
73 | "
\n",
74 | "\n",
87 | "
\n",
88 | " \n",
89 | " \n",
90 | " | \n",
91 | " UID | \n",
92 | " Content_list | \n",
93 | " Content_id | \n",
94 | "
\n",
95 | " \n",
96 | " \n",
97 | " \n",
98 | " | 1 | \n",
99 | " 0 | \n",
100 | " 164423,430922,112513,485726,488385,340139,4892... | \n",
101 | " 112513 | \n",
102 | "
\n",
103 | " \n",
104 | " | 2 | \n",
105 | " 1 | \n",
106 | " 635374,409237,586823,305055,519191,772121,7884... | \n",
107 | " 305055,586823,305055,305055 | \n",
108 | "
\n",
109 | " \n",
110 | "
\n",
111 | "
"
112 | ],
113 | "text/plain": [
114 | " UID Content_list \\\n",
115 | "1 0 164423,430922,112513,485726,488385,340139,4892... \n",
116 | "2 1 635374,409237,586823,305055,519191,772121,7884... \n",
117 | "\n",
118 | " Content_id \n",
119 | "1 112513 \n",
120 | "2 305055,586823,305055,305055 "
121 | ]
122 | },
123 | "execution_count": 3,
124 | "metadata": {},
125 | "output_type": "execute_result"
126 | }
127 | ],
128 | "source": [
129 | "content_list_id_df = sqlContext.createDataFrame(content_list_id).toPandas()\n",
130 | "content_list_id_df.columns = ['UID','Content_list',\"Content_id\"]\n",
131 | "content_list_id_df = content_list_id_df[1:]\n",
132 | "content_list_id_df[:2]"
133 | ]
134 | },
135 | {
136 | "cell_type": "markdown",
137 | "metadata": {},
138 | "source": [
139 | "**计算每个content的CTR**"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 8,
145 | "metadata": {},
146 | "outputs": [],
147 | "source": [
148 | "def ctr(a, b):\n",
149 | " unions = len(set(a).union(set(b)))\n",
150 | " intersections = len(set(a).intersection(set(b)))\n",
151 | " return intersections / unions\n",
152 | "\n",
153 | "def CTR(content_list_id_df):\n",
154 | " R = []\n",
155 | " \n",
156 | " for i in range(content_list_id_df.shape[0]):\n",
157 | " b = content_list_id_df.iat[i,1].split(\",\")\n",
158 | " a = content_list_id_df.iat[i,2].split(\",\")\n",
159 | " R.append(ctr(a, b))\n",
160 | " return R"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 9,
166 | "metadata": {},
167 | "outputs": [],
168 | "source": [
169 | "ctr = CTR(content_list_id_df)\n",
170 | "content_list_id_df[\"CTR\"] = pd.Series(ctr)"
171 | ]
172 | },
173 | {
174 | "cell_type": "code",
175 | "execution_count": 10,
176 | "metadata": {},
177 | "outputs": [
178 | {
179 | "data": {
180 | "text/html": [
181 | "\n",
182 | "\n",
195 | "
\n",
196 | " \n",
197 | " \n",
198 | " | \n",
199 | " UID | \n",
200 | " Content_list | \n",
201 | " Content_id | \n",
202 | " CTR | \n",
203 | "
\n",
204 | " \n",
205 | " \n",
206 | " \n",
207 | " | 1 | \n",
208 | " 0 | \n",
209 | " 164423,430922,112513,485726,488385,340139,4892... | \n",
210 | " 112513 | \n",
211 | " 0.250 | \n",
212 | "
\n",
213 | " \n",
214 | " | 2 | \n",
215 | " 1 | \n",
216 | " 635374,409237,586823,305055,519191,772121,7884... | \n",
217 | " 305055,586823,305055,305055 | \n",
218 | " 0.375 | \n",
219 | "
\n",
220 | " \n",
221 | " | 3 | \n",
222 | " 2 | \n",
223 | " 57518,70020,828660,9511,477360,821209,178443,9... | \n",
224 | " 178443,70020,178443,9511 | \n",
225 | " 0.125 | \n",
226 | "
\n",
227 | " \n",
228 | " | 4 | \n",
229 | " 3 | \n",
230 | " 542973,871389,914465,513667,536708,646545,9080... | \n",
231 | " 536708 | \n",
232 | " 0.250 | \n",
233 | "
\n",
234 | " \n",
235 | "
\n",
236 | "
"
237 | ],
238 | "text/plain": [
239 | " UID Content_list \\\n",
240 | "1 0 164423,430922,112513,485726,488385,340139,4892... \n",
241 | "2 1 635374,409237,586823,305055,519191,772121,7884... \n",
242 | "3 2 57518,70020,828660,9511,477360,821209,178443,9... \n",
243 | "4 3 542973,871389,914465,513667,536708,646545,9080... \n",
244 | "\n",
245 | " Content_id CTR \n",
246 | "1 112513 0.250 \n",
247 | "2 305055,586823,305055,305055 0.375 \n",
248 | "3 178443,70020,178443,9511 0.125 \n",
249 | "4 536708 0.250 "
250 | ]
251 | },
252 | "execution_count": 10,
253 | "metadata": {},
254 | "output_type": "execute_result"
255 | }
256 | ],
257 | "source": [
258 | "content_list_id_df[:4]"
259 | ]
260 | },
261 | {
262 | "cell_type": "markdown",
263 | "metadata": {},
264 | "source": [
265 | "**杰卡德相似系数Python实现**"
266 | ]
267 | },
268 | {
269 | "cell_type": "code",
270 | "execution_count": 11,
271 | "metadata": {},
272 | "outputs": [],
273 | "source": [
274 | "def jaccard_sim(a, b):\n",
275 | " unions = len(set(a).union(set(b)))\n",
276 | " intersections = len(set(a).intersection(set(b)))\n",
277 | " return intersections / unions\n",
278 | "\n",
279 | "def jaccard(content_list_id_df):\n",
280 | " js = []\n",
281 | " \n",
282 | " for i in range(content_list_id_df.shape[0]):\n",
283 | " b = content_list_id_df.iat[i,1].split(\",\")\n",
284 | " a = content_list_id_df.iat[i,2].split(\",\")\n",
285 | " js.append(jaccard_sim(a, b))\n",
286 | " return js"
287 | ]
288 | },
289 | {
290 | "cell_type": "code",
291 | "execution_count": 12,
292 | "metadata": {},
293 | "outputs": [],
294 | "source": [
295 | "jcd = jaccard(content_list_id_df)"
296 | ]
297 | },
298 | {
299 | "cell_type": "code",
300 | "execution_count": 13,
301 | "metadata": {},
302 | "outputs": [],
303 | "source": [
304 | "content_list_id_df[\"jaccard\"] = pd.Series(jcd)"
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": 14,
310 | "metadata": {},
311 | "outputs": [
312 | {
313 | "data": {
314 | "text/html": [
315 | "\n",
316 | "\n",
329 | "
\n",
330 | " \n",
331 | " \n",
332 | " | \n",
333 | " UID | \n",
334 | " Content_list | \n",
335 | " Content_id | \n",
336 | " CTR | \n",
337 | " jaccard | \n",
338 | "
\n",
339 | " \n",
340 | " \n",
341 | " \n",
342 | " | 1 | \n",
343 | " 0 | \n",
344 | " 164423,430922,112513,485726,488385,340139,4892... | \n",
345 | " 112513 | \n",
346 | " 0.250 | \n",
347 | " 0.250 | \n",
348 | "
\n",
349 | " \n",
350 | " | 2 | \n",
351 | " 1 | \n",
352 | " 635374,409237,586823,305055,519191,772121,7884... | \n",
353 | " 305055,586823,305055,305055 | \n",
354 | " 0.375 | \n",
355 | " 0.375 | \n",
356 | "
\n",
357 | " \n",
358 | "
\n",
359 | "
"
360 | ],
361 | "text/plain": [
362 | " UID Content_list \\\n",
363 | "1 0 164423,430922,112513,485726,488385,340139,4892... \n",
364 | "2 1 635374,409237,586823,305055,519191,772121,7884... \n",
365 | "\n",
366 | " Content_id CTR jaccard \n",
367 | "1 112513 0.250 0.250 \n",
368 | "2 305055,586823,305055,305055 0.375 0.375 "
369 | ]
370 | },
371 | "execution_count": 14,
372 | "metadata": {},
373 | "output_type": "execute_result"
374 | }
375 | ],
376 | "source": [
377 | "content_list_id_df[:2]"
378 | ]
379 | },
380 | {
381 | "cell_type": "markdown",
382 | "metadata": {},
383 | "source": [
384 | "**Tanimoto系数Python实现**"
385 | ]
386 | },
387 | {
388 | "cell_type": "code",
389 | "execution_count": 15,
390 | "metadata": {},
391 | "outputs": [],
392 | "source": [
393 | "def tanimoto_coefficient(p_vec, q_vec):\n",
394 | " \"\"\"\n",
395 | " This method implements the cosine tanimoto coefficient metric\n",
396 | " :param p_vec: vector one\n",
397 | " :param q_vec: vector two\n",
398 | " :return: the tanimoto coefficient between vector one and two\n",
399 | " \"\"\"\n",
400 | " pq = np.dot(p_vec, q_vec)\n",
401 | " p_square = np.linalg.norm(p_vec)\n",
402 | " q_square = np.linalg.norm(q_vec)\n",
403 | " return pq / (p_square + q_square - pq)\n",
404 | "def tanimoto(content_list_id_df):\n",
405 | " tc = []\n",
406 | " \n",
407 | " for i in range(content_list_id_df.shape[0]):\n",
408 | " b = content_list_id_df.iat[i,1].split(\",\")\n",
409 | " a = content_list_id_df.iat[i,2].split(\",\")\n",
410 | " tc.append(jaccard_sim(a, b))\n",
411 | " return tc"
412 | ]
413 | },
414 | {
415 | "cell_type": "code",
416 | "execution_count": 16,
417 | "metadata": {},
418 | "outputs": [],
419 | "source": [
420 | "tc = tanimoto(content_list_id_df)"
421 | ]
422 | },
423 | {
424 | "cell_type": "code",
425 | "execution_count": 17,
426 | "metadata": {},
427 | "outputs": [],
428 | "source": [
429 | "content_list_id_df[\"tanimoto_coefficient\"] = pd.Series(tc)"
430 | ]
431 | },
432 | {
433 | "cell_type": "code",
434 | "execution_count": 18,
435 | "metadata": {},
436 | "outputs": [
437 | {
438 | "data": {
439 | "text/html": [
440 | "\n",
441 | "\n",
454 | "
\n",
455 | " \n",
456 | " \n",
457 | " | \n",
458 | " UID | \n",
459 | " Content_list | \n",
460 | " Content_id | \n",
461 | " CTR | \n",
462 | " jaccard | \n",
463 | " tanimoto_coefficient | \n",
464 | "
\n",
465 | " \n",
466 | " \n",
467 | " \n",
468 | " | 1 | \n",
469 | " 0 | \n",
470 | " 164423,430922,112513,485726,488385,340139,4892... | \n",
471 | " 112513 | \n",
472 | " 0.250 | \n",
473 | " 0.250 | \n",
474 | " 0.250 | \n",
475 | "
\n",
476 | " \n",
477 | " | 2 | \n",
478 | " 1 | \n",
479 | " 635374,409237,586823,305055,519191,772121,7884... | \n",
480 | " 305055,586823,305055,305055 | \n",
481 | " 0.375 | \n",
482 | " 0.375 | \n",
483 | " 0.375 | \n",
484 | "
\n",
485 | " \n",
486 | " | 3 | \n",
487 | " 2 | \n",
488 | " 57518,70020,828660,9511,477360,821209,178443,9... | \n",
489 | " 178443,70020,178443,9511 | \n",
490 | " 0.125 | \n",
491 | " 0.125 | \n",
492 | " 0.125 | \n",
493 | "
\n",
494 | " \n",
495 | " | 4 | \n",
496 | " 3 | \n",
497 | " 542973,871389,914465,513667,536708,646545,9080... | \n",
498 | " 536708 | \n",
499 | " 0.250 | \n",
500 | " 0.250 | \n",
501 | " 0.250 | \n",
502 | "
\n",
503 | " \n",
504 | " | 5 | \n",
505 | " 4 | \n",
506 | " 530817,401690,813927,107595,472415,375159,1135... | \n",
507 | " 530817,375159 | \n",
508 | " 0.375 | \n",
509 | " 0.375 | \n",
510 | " 0.375 | \n",
511 | "
\n",
512 | " \n",
513 | "
\n",
514 | "
"
515 | ],
516 | "text/plain": [
517 | " UID Content_list \\\n",
518 | "1 0 164423,430922,112513,485726,488385,340139,4892... \n",
519 | "2 1 635374,409237,586823,305055,519191,772121,7884... \n",
520 | "3 2 57518,70020,828660,9511,477360,821209,178443,9... \n",
521 | "4 3 542973,871389,914465,513667,536708,646545,9080... \n",
522 | "5 4 530817,401690,813927,107595,472415,375159,1135... \n",
523 | "\n",
524 | " Content_id CTR jaccard tanimoto_coefficient \n",
525 | "1 112513 0.250 0.250 0.250 \n",
526 | "2 305055,586823,305055,305055 0.375 0.375 0.375 \n",
527 | "3 178443,70020,178443,9511 0.125 0.125 0.125 \n",
528 | "4 536708 0.250 0.250 0.250 \n",
529 | "5 530817,375159 0.375 0.375 0.375 "
530 | ]
531 | },
532 | "execution_count": 18,
533 | "metadata": {},
534 | "output_type": "execute_result"
535 | }
536 | ],
537 | "source": [
538 | "content_list_id_df[:5]"
539 | ]
540 | },
541 | {
542 | "cell_type": "markdown",
543 | "metadata": {},
544 | "source": [
545 | "**pyspark实现TFIDF**"
546 | ]
547 | },
548 | {
549 | "cell_type": "code",
550 | "execution_count": 1,
551 | "metadata": {},
552 | "outputs": [],
553 | "source": [
554 | "# 导入库\n",
555 | "from pyspark.ml.feature import HashingTF, IDF, Tokenizer\n"
556 | ]
557 | },
558 | {
559 | "cell_type": "code",
560 | "execution_count": 2,
561 | "metadata": {},
562 | "outputs": [],
563 | "source": [
564 | "jsons=sqlContext.read.json(\"hdfs:///test/Beauty_5.json\")"
565 | ]
566 | },
567 | {
568 | "cell_type": "code",
569 | "execution_count": 3,
570 | "metadata": {},
571 | "outputs": [
572 | {
573 | "name": "stdout",
574 | "output_type": "stream",
575 | "text": [
576 | "+----------+--------+-------+--------------------+-----------+--------------+--------------------+--------------------+--------------+\n",
577 | "| asin| helpful|overall| reviewText| reviewTime| reviewerID| reviewerName| summary|unixReviewTime|\n",
578 | "+----------+--------+-------+--------------------+-----------+--------------+--------------------+--------------------+--------------+\n",
579 | "|7806397051| [3, 4]| 1.0|Very oily and cre...|01 30, 2014|A1YJEY40YUW4SE| Andrea|Don't waste your ...| 1391040000|\n",
580 | "|7806397051| [1, 1]| 3.0|This palette was ...|04 18, 2014| A60XNB876KYML| Jessica H.| OK Palette!| 1397779200|\n",
581 | "|7806397051| [0, 1]| 4.0|The texture of th...| 09 6, 2013|A3G6XNM240RMWA| Karen| great quality| 1378425600|\n",
582 | "|7806397051| [2, 2]| 2.0|I really can't te...| 12 8, 2013|A1PQFP6SAJ6D80| Norah|Do not work on my...| 1386460800|\n",
583 | "|7806397051| [0, 0]| 3.0|It was a little s...|10 19, 2013|A38FVHZTNQ271F| Nova Amor| It's okay.| 1382140800|\n",
584 | "|7806397051| [1, 2]| 5.0|I was very happy ...|04 15, 2013|A3BTN14HIZET6Z|S. M. Randall \"Wi...| Very nice palette!| 1365984000|\n",
585 | "|7806397051| [1, 3]| 1.0|PLEASE DONT DO IT...|08 16, 2013|A1Z59RFKN0M5QL| tasha \"luvely12b\"| smh!!!| 1376611200|\n",
586 | "|7806397051| [0, 1]| 2.0|Chalky,Not Pigmen...| 09 4, 2013| AWUO9P6PL1SY8| TreMagnifique|Chalky, Not Pigme...| 1378252800|\n",
587 | "|9759091062| [0, 0]| 2.0|Did nothing for m...|07 13, 2014|A3LMILRM9OC3SA| null|no Lightening, no...| 1405209600|\n",
588 | "|9759091062| [0, 0]| 3.0|I bought this pro...|12 27, 2013|A30IP88QK3YUIO| Amina Bint Ibraheem| Its alright| 1388102400|\n",
589 | "|9759091062| [0, 0]| 3.0|I have mixed feel...|05 20, 2014| APBQH4BS48CQO| Charmmy| Mixed feelings.| 1400544000|\n",
590 | "|9759091062| [0, 0]| 1.0|Did nothing for m...|02 18, 2014|A3FE8W8UV95U6B| Culture C Simmons| Nothing| 1392681600|\n",
591 | "|9759091062| [0, 1]| 5.0|I bought this pro...|01 23, 2014|A1EVGDOTGFZOSS|Jessica \"Anarchyk...| This works| 1390435200|\n",
592 | "|9759091062| [0, 0]| 1.0|This gell did not...|01 11, 2014| AP5WTCMP6DTRV| Layla B| Does nothing| 1389398400|\n",
593 | "|9759091062| [0, 1]| 5.0|i got this to get...|02 18, 2014|A21IM16PQWKVO5| mdub9922| it works| 1392681600|\n",
594 | "|9759091062| [0, 0]| 2.0|I used it for ana...| 04 6, 2014|A1TLDR1V4O48PK|Mickey O Neil \"Mi...| burns| 1396742400|\n",
595 | "|9759091062| [2, 4]| 5.0|I order this crea...|09 14, 2013| A6F8KH0J1AVYA| SanBen| Did work for me| 1379116800|\n",
596 | "|9759091062| [2, 4]| 4.0|Good product. Use...|10 18, 2013| AXPKZA7UZXKTT| Shirleyyy| excellent| 1382054400|\n",
597 | "|9759091062| [0, 1]| 3.0|I didn't use it p...| 11 1, 2013|A2SIAYDK7GG7QA| theredtranny| weird smell| 1383264000|\n",
598 | "|9788072216|[24, 24]| 5.0|I haven't been a ...|09 19, 2011|A1QV5IH6HDRN0L| armygirl|Love the smell of...| 1316390400|\n",
599 | "+----------+--------+-------+--------------------+-----------+--------------+--------------------+--------------------+--------------+\n",
600 | "only showing top 20 rows\n",
601 | "\n"
602 | ]
603 | }
604 | ],
605 | "source": [
606 | "jsons.show()"
607 | ]
608 | },
609 | {
610 | "cell_type": "code",
611 | "execution_count": 4,
612 | "metadata": {},
613 | "outputs": [],
614 | "source": [
615 | "tokenizer = Tokenizer(inputCol=\"reviewText\", outputCol=\"words\")\n",
616 | "wordsData = tokenizer.transform(jsons)"
617 | ]
618 | },
619 | {
620 | "cell_type": "code",
621 | "execution_count": 5,
622 | "metadata": {},
623 | "outputs": [],
624 | "source": [
625 | "hashingTF = HashingTF(inputCol=\"words\", outputCol=\"rawFeatures\", numFeatures=20)\n",
626 | "featurizedData = hashingTF.transform(wordsData)"
627 | ]
628 | },
629 | {
630 | "cell_type": "code",
631 | "execution_count": 6,
632 | "metadata": {},
633 | "outputs": [],
634 | "source": [
635 | "idf = IDF(inputCol=\"rawFeatures\", outputCol=\"features\")\n",
636 | "idfModel = idf.fit(featurizedData)\n",
637 | "rescaledData = idfModel.transform(featurizedData)"
638 | ]
639 | },
640 | {
641 | "cell_type": "code",
642 | "execution_count": 7,
643 | "metadata": {},
644 | "outputs": [
645 | {
646 | "name": "stdout",
647 | "output_type": "stream",
648 | "text": [
649 | "+-------+--------------------+\n",
650 | "|overall| features|\n",
651 | "+-------+--------------------+\n",
652 | "| 1.0|(20,[0,3,4,6,7,8,...|\n",
653 | "+-------+--------------------+\n",
654 | "only showing top 1 row\n",
655 | "\n"
656 | ]
657 | }
658 | ],
659 | "source": [
660 | "rescaledData.select(\"overall\", \"features\").show(1)"
661 | ]
662 | },
663 | {
664 | "cell_type": "markdown",
665 | "metadata": {},
666 | "source": [
667 | "**Pyspark实现LR**"
668 | ]
669 | },
670 | {
671 | "cell_type": "code",
672 | "execution_count": 1,
673 | "metadata": {},
674 | "outputs": [],
675 | "source": [
676 | "# 导入包\n",
677 | "import pandas as pd\n",
678 | "from pyspark.sql import Row\n",
679 | "from pyspark.ml.linalg import Vectors\n",
680 | "from pyspark.ml.classification import LogisticRegression"
681 | ]
682 | },
683 | {
684 | "cell_type": "code",
685 | "execution_count": 2,
686 | "metadata": {},
687 | "outputs": [],
688 | "source": [
689 | "# 读取文件\n",
690 | "data_file = \"hdfs:///test/Titanic/train.csv\"\n",
691 | "data_all = spark.read.csv(data_file, header=True, inferSchema=True)"
692 | ]
693 | },
694 | {
695 | "cell_type": "code",
696 | "execution_count": 3,
697 | "metadata": {},
698 | "outputs": [],
699 | "source": [
700 | "# 转换为pandas df 进行数据处理\n",
701 | "data_all = data_all.toPandas()"
702 | ]
703 | },
704 | {
705 | "cell_type": "code",
706 | "execution_count": 4,
707 | "metadata": {},
708 | "outputs": [
709 | {
710 | "data": {
711 | "text/html": [
712 | "\n",
713 | "\n",
726 | "
\n",
727 | " \n",
728 | " \n",
729 | " | \n",
730 | " PassengerId | \n",
731 | " Survived | \n",
732 | " Pclass | \n",
733 | " Name | \n",
734 | " Sex | \n",
735 | " Age | \n",
736 | " SibSp | \n",
737 | " Parch | \n",
738 | " Ticket | \n",
739 | " Fare | \n",
740 | " Cabin | \n",
741 | " Embarked | \n",
742 | "
\n",
743 | " \n",
744 | " \n",
745 | " \n",
746 | " | 0 | \n",
747 | " 1 | \n",
748 | " 0 | \n",
749 | " 3 | \n",
750 | " Braund, Mr. Owen Harris | \n",
751 | " male | \n",
752 | " 22.0 | \n",
753 | " 1 | \n",
754 | " 0 | \n",
755 | " A/5 21171 | \n",
756 | " 7.2500 | \n",
757 | " None | \n",
758 | " S | \n",
759 | "
\n",
760 | " \n",
761 | " | 1 | \n",
762 | " 2 | \n",
763 | " 1 | \n",
764 | " 1 | \n",
765 | " Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
766 | " female | \n",
767 | " 38.0 | \n",
768 | " 1 | \n",
769 | " 0 | \n",
770 | " PC 17599 | \n",
771 | " 71.2833 | \n",
772 | " C85 | \n",
773 | " C | \n",
774 | "
\n",
775 | " \n",
776 | " | 2 | \n",
777 | " 3 | \n",
778 | " 1 | \n",
779 | " 3 | \n",
780 | " Heikkinen, Miss. Laina | \n",
781 | " female | \n",
782 | " 26.0 | \n",
783 | " 0 | \n",
784 | " 0 | \n",
785 | " STON/O2. 3101282 | \n",
786 | " 7.9250 | \n",
787 | " None | \n",
788 | " S | \n",
789 | "
\n",
790 | " \n",
791 | " | 3 | \n",
792 | " 4 | \n",
793 | " 1 | \n",
794 | " 1 | \n",
795 | " Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
796 | " female | \n",
797 | " 35.0 | \n",
798 | " 1 | \n",
799 | " 0 | \n",
800 | " 113803 | \n",
801 | " 53.1000 | \n",
802 | " C123 | \n",
803 | " S | \n",
804 | "
\n",
805 | " \n",
806 | " | 4 | \n",
807 | " 5 | \n",
808 | " 0 | \n",
809 | " 3 | \n",
810 | " Allen, Mr. William Henry | \n",
811 | " male | \n",
812 | " 35.0 | \n",
813 | " 0 | \n",
814 | " 0 | \n",
815 | " 373450 | \n",
816 | " 8.0500 | \n",
817 | " None | \n",
818 | " S | \n",
819 | "
\n",
820 | " \n",
821 | "
\n",
822 | "
"
823 | ],
824 | "text/plain": [
825 | " PassengerId Survived Pclass \\\n",
826 | "0 1 0 3 \n",
827 | "1 2 1 1 \n",
828 | "2 3 1 3 \n",
829 | "3 4 1 1 \n",
830 | "4 5 0 3 \n",
831 | "\n",
832 | " Name Sex Age SibSp \\\n",
833 | "0 Braund, Mr. Owen Harris male 22.0 1 \n",
834 | "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
835 | "2 Heikkinen, Miss. Laina female 26.0 0 \n",
836 | "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
837 | "4 Allen, Mr. William Henry male 35.0 0 \n",
838 | "\n",
839 | " Parch Ticket Fare Cabin Embarked \n",
840 | "0 0 A/5 21171 7.2500 None S \n",
841 | "1 0 PC 17599 71.2833 C85 C \n",
842 | "2 0 STON/O2. 3101282 7.9250 None S \n",
843 | "3 0 113803 53.1000 C123 S \n",
844 | "4 0 373450 8.0500 None S "
845 | ]
846 | },
847 | "execution_count": 4,
848 | "metadata": {},
849 | "output_type": "execute_result"
850 | }
851 | ],
852 | "source": [
853 | "# 数据拼接\n",
854 | "data_all[:5]"
855 | ]
856 | },
857 | {
858 | "cell_type": "code",
859 | "execution_count": 5,
860 | "metadata": {},
861 | "outputs": [],
862 | "source": [
863 | "# 标签\n",
864 | "cate_feature = [\"Sex\",\"Embarked\"]\n",
865 | "for i in cate_feature:\n",
866 | " data_all[i] = data_all[i].map(dict(zip(data_all[i].unique(), range(0, data_all[i].nunique()))))"
867 | ]
868 | },
869 | {
870 | "cell_type": "code",
871 | "execution_count": 6,
872 | "metadata": {},
873 | "outputs": [],
874 | "source": [
875 | "# 删除\n",
876 | "data_all = data_all.drop([\"Name\",\"Cabin\",\"Ticket\",\"PassengerId\"],axis =1)"
877 | ]
878 | },
879 | {
880 | "cell_type": "code",
881 | "execution_count": 7,
882 | "metadata": {
883 | "scrolled": true
884 | },
885 | "outputs": [],
886 | "source": [
887 | "# 填充\n",
888 | "data_all = data_all.fillna(data_all.mean())"
889 | ]
890 | },
891 | {
892 | "cell_type": "code",
893 | "execution_count": 8,
894 | "metadata": {},
895 | "outputs": [
896 | {
897 | "data": {
898 | "text/plain": [
899 | "Survived 0\n",
900 | "Pclass 0\n",
901 | "Sex 0\n",
902 | "Age 0\n",
903 | "SibSp 0\n",
904 | "Parch 0\n",
905 | "Fare 0\n",
906 | "Embarked 0\n",
907 | "dtype: int64"
908 | ]
909 | },
910 | "execution_count": 8,
911 | "metadata": {},
912 | "output_type": "execute_result"
913 | }
914 | ],
915 | "source": [
916 | "data_all.isnull().sum()"
917 | ]
918 | },
919 | {
920 | "cell_type": "code",
921 | "execution_count": 9,
922 | "metadata": {},
923 | "outputs": [],
924 | "source": [
925 | "# 切分\n",
926 | "train = data_all[:491]\n",
927 | "test = data_all[492:891]"
928 | ]
929 | },
930 | {
931 | "cell_type": "code",
932 | "execution_count": 10,
933 | "metadata": {},
934 | "outputs": [
935 | {
936 | "data": {
937 | "text/plain": [
938 | "((491, 8), (399, 8))"
939 | ]
940 | },
941 | "execution_count": 10,
942 | "metadata": {},
943 | "output_type": "execute_result"
944 | }
945 | ],
946 | "source": [
947 | "train.shape,test.shape"
948 | ]
949 | },
950 | {
951 | "cell_type": "code",
952 | "execution_count": 11,
953 | "metadata": {},
954 | "outputs": [],
955 | "source": [
956 | "train = spark.createDataFrame(train)\n",
957 | "test = spark.createDataFrame(test)"
958 | ]
959 | },
960 | {
961 | "cell_type": "code",
962 | "execution_count": 12,
963 | "metadata": {
964 | "scrolled": true
965 | },
966 | "outputs": [
967 | {
968 | "name": "stdout",
969 | "output_type": "stream",
970 | "text": [
971 | "+--------+------+---+-----------------+-----+-----+-------+--------+\n",
972 | "|Survived|Pclass|Sex| Age|SibSp|Parch| Fare|Embarked|\n",
973 | "+--------+------+---+-----------------+-----+-----+-------+--------+\n",
974 | "| 0| 3| 0| 22.0| 1| 0| 7.25| 0.0|\n",
975 | "| 1| 1| 1| 38.0| 1| 0|71.2833| 1.0|\n",
976 | "| 1| 3| 1| 26.0| 0| 0| 7.925| 0.0|\n",
977 | "| 1| 1| 1| 35.0| 1| 0| 53.1| 0.0|\n",
978 | "| 0| 3| 0| 35.0| 0| 0| 8.05| 0.0|\n",
979 | "| 0| 3| 0|29.69911764705882| 0| 0| 8.4583| 2.0|\n",
980 | "| 0| 1| 0| 54.0| 0| 0|51.8625| 0.0|\n",
981 | "| 0| 3| 0| 2.0| 3| 1| 21.075| 0.0|\n",
982 | "| 1| 3| 1| 27.0| 0| 2|11.1333| 0.0|\n",
983 | "| 1| 2| 1| 14.0| 1| 0|30.0708| 1.0|\n",
984 | "| 1| 3| 1| 4.0| 1| 1| 16.7| 0.0|\n",
985 | "| 1| 1| 1| 58.0| 0| 0| 26.55| 0.0|\n",
986 | "| 0| 3| 0| 20.0| 0| 0| 8.05| 0.0|\n",
987 | "| 0| 3| 0| 39.0| 1| 5| 31.275| 0.0|\n",
988 | "| 0| 3| 1| 14.0| 0| 0| 7.8542| 0.0|\n",
989 | "| 1| 2| 1| 55.0| 0| 0| 16.0| 0.0|\n",
990 | "| 0| 3| 0| 2.0| 4| 1| 29.125| 2.0|\n",
991 | "| 1| 2| 0|29.69911764705882| 0| 0| 13.0| 0.0|\n",
992 | "| 0| 3| 1| 31.0| 1| 0| 18.0| 0.0|\n",
993 | "| 1| 3| 1|29.69911764705882| 0| 0| 7.225| 1.0|\n",
994 | "+--------+------+---+-----------------+-----+-----+-------+--------+\n",
995 | "only showing top 20 rows\n",
996 | "\n"
997 | ]
998 | }
999 | ],
1000 | "source": [
1001 | "train.show()"
1002 | ]
1003 | },
1004 | {
1005 | "cell_type": "code",
1006 | "execution_count": 23,
1007 | "metadata": {},
1008 | "outputs": [],
1009 | "source": [
1010 | "trainingSet = train.rdd.map(list).map(lambda x:[float(item) for item in x]).map(lambda x:Row(label=x[0], features=Vectors.dense(x[1:]))).toDF() "
1011 | ]
1012 | },
1013 | {
1014 | "cell_type": "code",
1015 | "execution_count": 24,
1016 | "metadata": {},
1017 | "outputs": [
1018 | {
1019 | "data": {
1020 | "text/plain": [
1021 | "[Row(features=DenseVector([3.0, 0.0, 22.0, 1.0, 0.0, 7.25, 0.0]), label=0.0),\n",
1022 | " Row(features=DenseVector([1.0, 1.0, 38.0, 1.0, 0.0, 71.2833, 1.0]), label=1.0),\n",
1023 | " Row(features=DenseVector([3.0, 1.0, 26.0, 0.0, 0.0, 7.925, 0.0]), label=1.0),\n",
1024 | " Row(features=DenseVector([1.0, 1.0, 35.0, 1.0, 0.0, 53.1, 0.0]), label=1.0),\n",
1025 | " Row(features=DenseVector([3.0, 0.0, 35.0, 0.0, 0.0, 8.05, 0.0]), label=0.0)]"
1026 | ]
1027 | },
1028 | "execution_count": 24,
1029 | "metadata": {},
1030 | "output_type": "execute_result"
1031 | }
1032 | ],
1033 | "source": [
1034 | "trainingSet.take(5)"
1035 | ]
1036 | },
1037 | {
1038 | "cell_type": "code",
1039 | "execution_count": 33,
1040 | "metadata": {},
1041 | "outputs": [],
1042 | "source": [
1043 | "lr = LogisticRegression( regParam=0.3)\n",
1044 | "LRModel = lr.fit(trainingSet)"
1045 | ]
1046 | },
1047 | {
1048 | "cell_type": "code",
1049 | "execution_count": 34,
1050 | "metadata": {},
1051 | "outputs": [
1052 | {
1053 | "name": "stdout",
1054 | "output_type": "stream",
1055 | "text": [
1056 | "相关系数: \n",
1057 | "[-0.24322763358387192,1.024904775215135,-0.008572946912823856,-0.07216838758298957,0.04724060725895138,0.002295553641758597,0.1666864739240968]\n",
1058 | "截距: -0.15029301794960143\n"
1059 | ]
1060 | }
1061 | ],
1062 | "source": [
1063 | "print(\"相关系数: \\n\" + str(LRModel.coefficients))\n",
1064 | "print(\"截距: \" + str(LRModel.intercept))\n"
1065 | ]
1066 | },
1067 | {
1068 | "cell_type": "code",
1069 | "execution_count": 35,
1070 | "metadata": {},
1071 | "outputs": [],
1072 | "source": [
1073 | "\n",
1074 | "# 2.测试\n",
1075 | "#2.1读取数据\n",
1076 | "#2.2 构造测试数据集"
1077 | ]
1078 | },
1079 | {
1080 | "cell_type": "code",
1081 | "execution_count": 36,
1082 | "metadata": {},
1083 | "outputs": [
1084 | {
1085 | "name": "stdout",
1086 | "output_type": "stream",
1087 | "text": [
1088 | "+--------------------+-----+--------------------+--------------------+----------+\n",
1089 | "| features|label| rawPrediction| probability|prediction|\n",
1090 | "+--------------------+-----+--------------------+--------------------+----------+\n",
1091 | "|[1.0,0.0,55.0,0.0...| 0.0|[0.79501834566514...|[0.68890784972023...| 0.0|\n",
1092 | "|[1.0,0.0,71.0,0.0...| 0.0|[0.72187386182752...|[0.67301952067595...| 0.0|\n",
1093 | "|[3.0,0.0,21.0,0.0...| 0.0|[1.04152859705436...|[0.73914484221339...| 0.0|\n",
1094 | "|[3.0,0.0,29.69911...| 0.0|[0.93470860050442...|[0.71802958128616...| 0.0|\n",
1095 | "|[1.0,1.0,54.0,1.0...| 1.0|[-0.4426284849437...|[0.39111483243997...| 1.0|\n",
1096 | "|[3.0,0.0,29.69911...| 0.0|[1.09992201765660...|[0.75024549376767...| 0.0|\n",
1097 | "|[1.0,1.0,25.0,1.0...| 0.0|[-0.7872644322044...|[0.31275635046786...| 1.0|\n",
1098 | "|[3.0,0.0,24.0,0.0...| 0.0|[1.06783096752856...|[0.74418420703166...| 0.0|\n",
1099 | "|[3.0,0.0,17.0,0.0...| 0.0|[1.00583078279748...|[0.73220343445482...| 0.0|\n",
1100 | "|[3.0,1.0,21.0,0.0...| 0.0|[-0.3160604599164...|[0.42163614284074...| 1.0|\n",
1101 | "|[3.0,1.0,29.69911...| 0.0|[-0.2412060832598...|[0.43998915191310...| 1.0|\n",
1102 | "|[3.0,1.0,37.0,0.0...| 0.0|[0.15026155872020...|[0.53749486794483...| 0.0|\n",
1103 | "|[1.0,1.0,16.0,0.0...| 1.0|[-0.6927823630885...|[0.33341440881124...| 1.0|\n",
1104 | "|[1.0,0.0,18.0,1.0...| 0.0|[0.20332981803568...|[0.55065804495809...| 0.0|\n",
1105 | "|[2.0,1.0,33.0,0.0...| 1.0|[-0.2594148511782...|[0.43550755617477...| 1.0|\n",
1106 | "|[1.0,0.0,29.69911...| 1.0|[0.58718266129072...|[0.64271845659611...| 0.0|\n",
1107 | "|[3.0,0.0,28.0,0.0...| 0.0|[1.06831108647967...|[0.74427559851567...| 0.0|\n",
1108 | "|[3.0,0.0,26.0,0.0...| 1.0|[0.97318339900057...|[0.72575356180159...| 0.0|\n",
1109 | "|[3.0,0.0,29.0,0.0...| 1.0|[0.77742789060128...|[0.68512550090201...| 0.0|\n",
1110 | "|[3.0,0.0,29.69911...| 0.0|[1.11610567083100...|[0.75326564408702...| 0.0|\n",
1111 | "+--------------------+-----+--------------------+--------------------+----------+\n",
1112 | "only showing top 20 rows\n",
1113 | "\n",
1114 | "None\n"
1115 | ]
1116 | }
1117 | ],
1118 | "source": [
1119 | "testSet = test.rdd.map(list).map(lambda x:[float(item) for item in x]).map(lambda x:Row(label=x[0], features=Vectors.dense(x[1:]))).toDF() \n",
1120 | "result = LRModel.transform(testSet)\n",
1121 | "print(result.show())\n",
1122 | "\n"
1123 | ]
1124 | },
1125 | {
1126 | "cell_type": "code",
1127 | "execution_count": 37,
1128 | "metadata": {},
1129 | "outputs": [
1130 | {
1131 | "name": "stdout",
1132 | "output_type": "stream",
1133 | "text": [
1134 | "预测准确率为:0.7994987468671679\n"
1135 | ]
1136 | }
1137 | ],
1138 | "source": [
1139 | "\n",
1140 | "# 评估分类效果\n",
1141 | "total_amount=result.count()\n",
1142 | "correct_amount = result.filter(result.label==result.prediction).count()\n",
1143 | "precision_rate = correct_amount/total_amount\n",
1144 | "print(\"预测准确率为:{}\".format(precision_rate))\n"
1145 | ]
1146 | },
1147 | {
1148 | "cell_type": "code",
1149 | "execution_count": 38,
1150 | "metadata": {},
1151 | "outputs": [
1152 | {
1153 | "name": "stdout",
1154 | "output_type": "stream",
1155 | "text": [
1156 | "正样本预测准确数量:90,负样本预测准确数量:229\n"
1157 | ]
1158 | }
1159 | ],
1160 | "source": [
1161 | "positive_precision_amount = result.filter(result.label == 1).filter(result.prediction == 1).count()\n",
1162 | "negative_precision_amount = result.filter(result.label == 0).filter(result.prediction == 0).count()\n",
1163 | "positive_false_amount = result.filter(result.label == 1).filter(result.prediction == 0).count()\n",
1164 | "negative_false_amount = result.filter(result.label== 0).filter(result.prediction == 1).count()\n",
1165 | " \n",
1166 | "print(\"正样本预测准确数量:{},负样本预测准确数量:{}\".format(positive_precision_amount,negative_precision_amount))\n"
1167 | ]
1168 | },
1169 | {
1170 | "cell_type": "code",
1171 | "execution_count": 39,
1172 | "metadata": {},
1173 | "outputs": [
1174 | {
1175 | "name": "stdout",
1176 | "output_type": "stream",
1177 | "text": [
1178 | "正样本数:150,负样本数:249\n"
1179 | ]
1180 | }
1181 | ],
1182 | "source": [
1183 | "positive_amount = result.filter(result.label == 1).count()\n",
1184 | "negative_amount = result.filter(result.label == 0).count()\n",
1185 | " \n",
1186 | "print(\"正样本数:{},负样本数:{}\".format(positive_amount,negative_amount))\n"
1187 | ]
1188 | },
1189 | {
1190 | "cell_type": "code",
1191 | "execution_count": 40,
1192 | "metadata": {},
1193 | "outputs": [
1194 | {
1195 | "name": "stdout",
1196 | "output_type": "stream",
1197 | "text": [
1198 | "正样本预测错误数量:60,负样本预测错误数量:20\n",
1199 | "正样本召回率为:0.6,负样本召回率为:0.9196787148594378\n"
1200 | ]
1201 | }
1202 | ],
1203 | "source": [
1204 | "print(\"正样本预测错误数量:{},负样本预测错误数量:{}\".format(positive_false_amount,negative_false_amount))\n",
1205 | " \n",
1206 | "recall_rate1 = positive_precision_amount/positive_amount\n",
1207 | "recall_rate2 = negative_precision_amount/negative_amount\n",
1208 | " \n",
1209 | "print(\"正样本召回率为:{},负样本召回率为:{}\".format(recall_rate1,recall_rate2))\n"
1210 | ]
1211 | },
1212 | {
1213 | "cell_type": "markdown",
1214 | "metadata": {},
1215 | "source": [
1216 | "[参考文献](https://blog.csdn.net/flysky1991/article/details/80182501)"
1217 | ]
1218 | },
1219 | {
1220 | "cell_type": "code",
1221 | "execution_count": null,
1222 | "metadata": {},
1223 | "outputs": [],
1224 | "source": []
1225 | }
1226 | ],
1227 | "metadata": {
1228 | "kernelspec": {
1229 | "display_name": "Python 3",
1230 | "language": "python",
1231 | "name": "python3"
1232 | },
1233 | "language_info": {
1234 | "codemirror_mode": {
1235 | "name": "ipython",
1236 | "version": 3
1237 | },
1238 | "file_extension": ".py",
1239 | "mimetype": "text/x-python",
1240 | "name": "python",
1241 | "nbconvert_exporter": "python",
1242 | "pygments_lexer": "ipython3",
1243 | "version": "3.7.1"
1244 | }
1245 | },
1246 | "nbformat": 4,
1247 | "nbformat_minor": 2
1248 | }
1249 |
--------------------------------------------------------------------------------
/机器学习/BigData_Learning/参考答案/PySpark练习.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "### 数据处理"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 42,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import numpy as np\n",
17 | "import re\n",
18 | "import matplotlib.pyplot as plt"
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "**读取数据**"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 2,
31 | "metadata": {},
32 | "outputs": [],
33 | "source": [
34 | "user_data = sc.textFile(\"/test/ml-100k/u.user\")\n",
35 | "movie_data = sc.textFile(\"/test/ml-100k/u.item\")\n",
36 | "ratings_data = sc.textFile(\"/test/ml-100k/u.data\")"
37 | ]
38 | },
39 | {
40 | "cell_type": "code",
41 | "execution_count": 3,
42 | "metadata": {},
43 | "outputs": [
44 | {
45 | "name": "stdout",
46 | "output_type": "stream",
47 | "text": [
48 | "1|24|M|technician|85711\n",
49 | "1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0\n",
50 | "196\t242\t3\t881250949\n"
51 | ]
52 | }
53 | ],
54 | "source": [
55 | "print(user_data.first())\n",
56 | "print(movie_data.first())\n",
57 | "print(ratings_data.first())"
58 | ]
59 | },
60 | {
61 | "cell_type": "markdown",
62 | "metadata": {},
63 | "source": [
64 | "**对RDD的数据进行处理(切分)**"
65 | ]
66 | },
67 | {
68 | "cell_type": "code",
69 | "execution_count": 4,
70 | "metadata": {},
71 | "outputs": [],
72 | "source": [
73 | "user_rdd = user_data.map(lambda line: line.split(\"|\"))\n",
74 | "movie_rdd = movie_data.map(lambda line: line.split(\"|\"))\n",
75 | "ratings_rdd = ratings_data.map(lambda line: line.split(\"\\t\"))\n"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 5,
81 | "metadata": {},
82 | "outputs": [],
83 | "source": [
84 | "# 将RDD转化为DF\n",
85 | "user_df = sqlContext.createDataFrame(user_rdd).toPandas()\n",
86 | "movie_df = sqlContext.createDataFrame(movie_rdd).toPandas()\n",
87 | "ratings_df = sqlContext.createDataFrame(ratings_rdd).toPandas()\n"
88 | ]
89 | },
90 | {
91 | "cell_type": "code",
92 | "execution_count": 6,
93 | "metadata": {},
94 | "outputs": [],
95 | "source": [
96 | "# Rename列名\n",
97 | "user_df.columns = ['UserID',\"Age\",'Gender',\"Occupation\",\"Zip-code\"]\n",
98 | "ratings_df.columns = ['UserID','MovieID',\"Rating\",\"Timestamp\"]\n",
99 | "# movie_df.columns = ['MovieID','Title',\"ReleaseDate\",\"VideoLink\",\"Other\"]"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "### 探索用户数据"
107 | ]
108 | },
109 | {
110 | "cell_type": "code",
111 | "execution_count": 7,
112 | "metadata": {},
113 | "outputs": [],
114 | "source": [
115 | "# 获取评分RDD\n",
116 | "ratings = user_rdd.map(lambda fields: int(fields[2]))"
117 | ]
118 | },
119 | {
120 | "cell_type": "code",
121 | "execution_count": 8,
122 | "metadata": {},
123 | "outputs": [
124 | {
125 | "data": {
126 | "text/html": [
127 | "\n",
128 | "\n",
141 | "
\n",
142 | " \n",
143 | " \n",
144 | " | \n",
145 | " UserID | \n",
146 | " MovieID | \n",
147 | " Rating | \n",
148 | " Timestamp | \n",
149 | "
\n",
150 | " \n",
151 | " \n",
152 | " \n",
153 | " | 0 | \n",
154 | " 196 | \n",
155 | " 242 | \n",
156 | " 3 | \n",
157 | " 881250949 | \n",
158 | "
\n",
159 | " \n",
160 | " | 1 | \n",
161 | " 186 | \n",
162 | " 302 | \n",
163 | " 3 | \n",
164 | " 891717742 | \n",
165 | "
\n",
166 | " \n",
167 | " | 2 | \n",
168 | " 22 | \n",
169 | " 377 | \n",
170 | " 1 | \n",
171 | " 878887116 | \n",
172 | "
\n",
173 | " \n",
174 | " | 3 | \n",
175 | " 244 | \n",
176 | " 51 | \n",
177 | " 2 | \n",
178 | " 880606923 | \n",
179 | "
\n",
180 | " \n",
181 | " | 4 | \n",
182 | " 166 | \n",
183 | " 346 | \n",
184 | " 1 | \n",
185 | " 886397596 | \n",
186 | "
\n",
187 | " \n",
188 | "
\n",
189 | "
"
190 | ],
191 | "text/plain": [
192 | " UserID MovieID Rating Timestamp\n",
193 | "0 196 242 3 881250949\n",
194 | "1 186 302 3 891717742\n",
195 | "2 22 377 1 878887116\n",
196 | "3 244 51 2 880606923\n",
197 | "4 166 346 1 886397596"
198 | ]
199 | },
200 | "execution_count": 8,
201 | "metadata": {},
202 | "output_type": "execute_result"
203 | }
204 | ],
205 | "source": [
206 | "ratings_df[:5]"
207 | ]
208 | },
209 | {
210 | "cell_type": "code",
211 | "execution_count": 9,
212 | "metadata": {},
213 | "outputs": [],
214 | "source": [
215 | "\n",
216 | "# 统计用户数\n",
217 | "num_users = user_rdd.map(lambda fields: fields[0]).count()\n",
218 | "# 统计性别数\n",
219 | "num_genders = user_rdd.map(lambda fields: fields[2]).distinct().count()\n",
220 | "# 统计职业数\n",
221 | "num_occupations = user_rdd.map(lambda fields: fields[3]).distinct().count()\n",
222 | "# 统计邮编数\n",
223 | "num_zipcodes = user_rdd.map(lambda fields: fields[4]).distinct().count()\n",
224 | "# 返回结果"
225 | ]
226 | },
227 | {
228 | "cell_type": "code",
229 | "execution_count": 10,
230 | "metadata": {},
231 | "outputs": [
232 | {
233 | "name": "stdout",
234 | "output_type": "stream",
235 | "text": [
236 | "用户数: 943, 性别数: 2, 职业数: 21, 邮编数: 795\n"
237 | ]
238 | }
239 | ],
240 | "source": [
241 | "print( \"用户数: %d, 性别数: %d, 职业数: %d, 邮编数: %d\" % (num_users, num_genders, num_occupations, num_zipcodes))"
242 | ]
243 | },
244 | {
245 | "cell_type": "code",
246 | "execution_count": 12,
247 | "metadata": {},
248 | "outputs": [],
249 | "source": [
250 | "# 获取用户年龄RDD,并将其落地到驱动程序\n",
251 | "ages = user_rdd.map(lambda x: int(x[1])).collect()"
252 | ]
253 | },
254 | {
255 | "cell_type": "code",
256 | "execution_count": 13,
257 | "metadata": {},
258 | "outputs": [
259 | {
260 | "name": "stderr",
261 | "output_type": "stream",
262 | "text": [
263 | "/home/heitao/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_axes.py:6521: MatplotlibDeprecationWarning: \n",
264 | "The 'normed' kwarg was deprecated in Matplotlib 2.1 and will be removed in 3.1. Use 'density' instead.\n",
265 | " alternative=\"'density'\", removal=\"3.1\")\n"
266 | ]
267 | },
268 | {
269 | "data": {
270 | "image/png": "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\n",
271 | "text/plain": [
272 | ""
273 | ]
274 | },
275 | "metadata": {
276 | "needs_background": "light"
277 | },
278 | "output_type": "display_data"
279 | }
280 | ],
281 | "source": [
282 | "# 绘制用户年龄直方图\n",
283 | "\n",
284 | "age_hist= plt.hist(ages, bins=20, color='lightblue', normed=True)"
285 | ]
286 | },
287 | {
288 | "cell_type": "code",
289 | "execution_count": 14,
290 | "metadata": {},
291 | "outputs": [],
292 | "source": [
293 | "# 并行统计各职业人数的个数,返回职业统计RDD后落地\n",
294 | "count_by_occupation = user_rdd.map(lambda fields: (fields[3], 1)).reduceByKey(lambda x, y: x + y).collect()\n",
295 | "# count_by_occupation2 = user_rdd.map(lambda fields: fields[3]).countByValue()"
296 | ]
297 | },
298 | {
299 | "cell_type": "code",
300 | "execution_count": 15,
301 | "metadata": {},
302 | "outputs": [
303 | {
304 | "data": {
305 | "image/png": "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\n",
306 | "text/plain": [
307 | ""
308 | ]
309 | },
310 | "metadata": {
311 | "needs_background": "light"
312 | },
313 | "output_type": "display_data"
314 | }
315 | ],
316 | "source": [
317 | "# 生成x/y坐标轴\n",
318 | "x_axis1 = np.array([c[0] for c in count_by_occupation])\n",
319 | "y_axis1 = np.array([c[1] for c in count_by_occupation])\n",
320 | "x_axis = x_axis1[np.argsort(y_axis1)]\n",
321 | "y_axis = y_axis1[np.argsort(y_axis1)]\n",
322 | " \n",
323 | "# 生成x轴标签\n",
324 | "pos = np.arange(len(x_axis))\n",
325 | "width = 1.0\n",
326 | "ax = plt.axes()\n",
327 | "ax.set_xticks(pos + (width / 2))\n",
328 | "ax.set_xticklabels(x_axis)\n",
329 | " \n",
330 | "# 绘制职业人数条状图\n",
331 | "plt.xticks(rotation=30)\n",
332 | "occupation_bar = plt.bar(pos, y_axis, width, color='lightblue')"
333 | ]
334 | },
335 | {
336 | "cell_type": "code",
337 | "execution_count": 16,
338 | "metadata": {},
339 | "outputs": [],
340 | "source": [
341 | "count_by_occupation2 = user_rdd.map(lambda fields: fields[3]).countByValue()"
342 | ]
343 | },
344 | {
345 | "cell_type": "code",
346 | "execution_count": 19,
347 | "metadata": {},
348 | "outputs": [],
349 | "source": [
350 | "# 统计各职业人数"
351 | ]
352 | },
353 | {
354 | "cell_type": "code",
355 | "execution_count": 18,
356 | "metadata": {},
357 | "outputs": [
358 | {
359 | "data": {
360 | "text/plain": [
361 | "defaultdict(int,\n",
362 | " {'technician': 27,\n",
363 | " 'other': 105,\n",
364 | " 'writer': 45,\n",
365 | " 'executive': 32,\n",
366 | " 'administrator': 79,\n",
367 | " 'student': 196,\n",
368 | " 'lawyer': 12,\n",
369 | " 'educator': 95,\n",
370 | " 'scientist': 31,\n",
371 | " 'entertainment': 18,\n",
372 | " 'programmer': 66,\n",
373 | " 'librarian': 51,\n",
374 | " 'homemaker': 7,\n",
375 | " 'artist': 28,\n",
376 | " 'engineer': 67,\n",
377 | " 'marketing': 26,\n",
378 | " 'none': 9,\n",
379 | " 'healthcare': 16,\n",
380 | " 'retired': 14,\n",
381 | " 'salesman': 12,\n",
382 | " 'doctor': 7})"
383 | ]
384 | },
385 | "execution_count": 18,
386 | "metadata": {},
387 | "output_type": "execute_result"
388 | }
389 | ],
390 | "source": [
391 | "count_by_occupation2"
392 | ]
393 | },
394 | {
395 | "cell_type": "markdown",
396 | "metadata": {},
397 | "source": [
398 | "### 探索电影数据"
399 | ]
400 | },
401 | {
402 | "cell_type": "code",
403 | "execution_count": 24,
404 | "metadata": {},
405 | "outputs": [
406 | {
407 | "data": {
408 | "text/plain": [
409 | "1682"
410 | ]
411 | },
412 | "execution_count": 24,
413 | "metadata": {},
414 | "output_type": "execute_result"
415 | }
416 | ],
417 | "source": [
418 | "\n",
419 | "num_movies = movie_rdd.count()\n",
420 | "\n",
421 | "num_movies"
422 | ]
423 | },
424 | {
425 | "cell_type": "code",
426 | "execution_count": 35,
427 | "metadata": {},
428 | "outputs": [],
429 | "source": [
430 | "# 输入影片的发行时间字段,若非法则返回1900\n",
431 | "def convert_year(x):\n",
432 | " try:\n",
433 | " return int(x[-4:])\n",
434 | " except:\n",
435 | " return 1900\n",
436 | " \n",
437 | "# 以' | '切分每列,返回影片RDD\n",
438 | "movie_fields = movie_data.map(lambda lines: lines.split(\"|\"))\n",
439 | "# 生成新的影片发行年份RDD,并将空/异常的年份置为1900,\n",
440 | "years = movie_fields.map(lambda fields: fields[2]).map(lambda x: convert_year(x))\n",
441 | "# 过滤掉影片发行年份RDD中空/异常的记录\n",
442 | "years_filtered = years.filter(lambda x: x != 1900)"
443 | ]
444 | },
445 | {
446 | "cell_type": "code",
447 | "execution_count": 38,
448 | "metadata": {},
449 | "outputs": [],
450 | "source": [
451 | "# 生成影片年龄RDD,然后统计不同年龄的影片数并落地\n",
452 | "movie_ages = years_filtered.map(lambda yr: 1998-yr).countByValue()\n",
453 | "# 获得影片数\n",
454 | "values = movie_ages.values()\n",
455 | "# 获得年龄\n",
456 | "bins = movie_ages.keys()"
457 | ]
458 | },
459 | {
460 | "cell_type": "code",
461 | "execution_count": 105,
462 | "metadata": {},
463 | "outputs": [
464 | {
465 | "data": {
466 | "text/plain": [
467 | "dict_keys([3, 2, 4, 31, 21, 5, 33, 16, 8, 6, 7, 61, 1, 17, 28, 26, 37, 59, 57, 30, 29, 44, 27, 10, 25, 19, 11, 12, 9, 24, 18, 13, 32, 41, 38, 14, 15, 23, 0, 58, 48, 34, 47, 36, 65, 42, 35, 40, 53, 22, 20, 39, 56, 45, 52, 43, 60, 64, 49, 50, 55, 54, 62, 63, 68, 46, 67, 76, 51, 66, 72])"
468 | ]
469 | },
470 | "execution_count": 105,
471 | "metadata": {},
472 | "output_type": "execute_result"
473 | }
474 | ],
475 | "source": [
476 | "bins"
477 | ]
478 | },
479 | {
480 | "cell_type": "code",
481 | "execution_count": null,
482 | "metadata": {
483 | "scrolled": true
484 | },
485 | "outputs": [],
486 | "source": [
487 | "# 生成影片年龄RDD,然后统计不同年龄的影片数并落地\n",
488 | "movie_ages = years_filtered.map(lambda yr: 1998-yr).countByValue()\n",
489 | "# 获得影片数\n",
490 | "values = movie_ages.values()\n",
491 | "# 获得年龄\n",
492 | "bins = movie_ages.keys()\n",
493 | "# 绘制电影年龄分布图\n",
494 | "# plt.hist(values, bins=bins, color='lightblue', normed=True)"
495 | ]
496 | },
497 | {
498 | "cell_type": "markdown",
499 | "metadata": {},
500 | "source": [
501 | "### 探索评级数据"
502 | ]
503 | },
504 | {
505 | "cell_type": "code",
506 | "execution_count": 70,
507 | "metadata": {},
508 | "outputs": [],
509 | "source": [
510 | "num_ratings = ratings_rdd.count()"
511 | ]
512 | },
513 | {
514 | "cell_type": "code",
515 | "execution_count": 71,
516 | "metadata": {},
517 | "outputs": [
518 | {
519 | "data": {
520 | "text/plain": [
521 | "100000"
522 | ]
523 | },
524 | "execution_count": 71,
525 | "metadata": {},
526 | "output_type": "execute_result"
527 | }
528 | ],
529 | "source": [
530 | "num_ratings"
531 | ]
532 | },
533 | {
534 | "cell_type": "code",
535 | "execution_count": 72,
536 | "metadata": {},
537 | "outputs": [],
538 | "source": [
539 | "# 获取评分RDD\n",
540 | "ratings = ratings_rdd.map(lambda fields: int(fields[2]))"
541 | ]
542 | },
543 | {
544 | "cell_type": "code",
545 | "execution_count": 73,
546 | "metadata": {},
547 | "outputs": [],
548 | "source": [
549 | "# 计算最大/最小评分\n",
550 | "max_rating = ratings.reduce(lambda x, y: max(x, y))\n",
551 | "min_rating = ratings.reduce(lambda x, y: min(x, y))"
552 | ]
553 | },
554 | {
555 | "cell_type": "code",
556 | "execution_count": 74,
557 | "metadata": {},
558 | "outputs": [],
559 | "source": [
560 | "# 计算平均/中位评分\n",
561 | "mean_rating = ratings.reduce(lambda x, y: x + y) / float(num_ratings)\n",
562 | "median_rating = np.median(ratings.collect())"
563 | ]
564 | },
565 | {
566 | "cell_type": "code",
567 | "execution_count": 75,
568 | "metadata": {},
569 | "outputs": [],
570 | "source": [
571 | "# 计算每个观众/每部电影平均打分/被打分次数\n",
572 | "ratings_per_user = num_ratings / num_users\n",
573 | "ratings_per_movie = num_ratings / num_movies"
574 | ]
575 | },
576 | {
577 | "cell_type": "code",
578 | "execution_count": 76,
579 | "metadata": {},
580 | "outputs": [
581 | {
582 | "name": "stdout",
583 | "output_type": "stream",
584 | "text": [
585 | "最低评分: 1\n",
586 | "最高评分: 5\n",
587 | "平均评分: 3.53\n",
588 | "中位评分: 4\n",
589 | "平均每个用户打分(次数): 106.04\n",
590 | "平均每部电影评分(次数): 59.45\n"
591 | ]
592 | }
593 | ],
594 | "source": [
595 | "print(\"最低评分: %d\" % min_rating)\n",
596 | "print(\"最高评分: %d\" % max_rating)\n",
597 | "print(\"平均评分: %2.2f\" % mean_rating)\n",
598 | "print(\"中位评分: %d\" % median_rating)\n",
599 | "print(\"平均每个用户打分(次数): %2.2f\" % ratings_per_user)\n",
600 | "print(\"平均每部电影评分(次数): %2.2f\" % ratings_per_movie)"
601 | ]
602 | },
603 | {
604 | "cell_type": "code",
605 | "execution_count": 77,
606 | "metadata": {},
607 | "outputs": [
608 | {
609 | "data": {
610 | "text/plain": [
611 | "(count: 100000, mean: 3.5298600000000024, stdev: 1.125667970762251, max: 5.0, min: 1.0)"
612 | ]
613 | },
614 | "execution_count": 77,
615 | "metadata": {},
616 | "output_type": "execute_result"
617 | }
618 | ],
619 | "source": [
620 | "ratings.stats()"
621 | ]
622 | },
623 | {
624 | "cell_type": "code",
625 | "execution_count": 78,
626 | "metadata": {},
627 | "outputs": [],
628 | "source": [
629 | "# 生成评分统计RDD,并落地\n",
630 | "count_by_rating = ratings.countByValue()"
631 | ]
632 | },
633 | {
634 | "cell_type": "code",
635 | "execution_count": 79,
636 | "metadata": {},
637 | "outputs": [],
638 | "source": [
639 | "# 生成x/y坐标轴\n",
640 | "x_axis = np.array(count_by_rating.keys())\n",
641 | "y_axis = np.array([float(c) for c in count_by_rating.values()])"
642 | ]
643 | },
644 | {
645 | "cell_type": "code",
646 | "execution_count": 80,
647 | "metadata": {},
648 | "outputs": [],
649 | "source": [
650 | "# 对人数做标准化\n",
651 | "y_axis_normed = y_axis / y_axis.sum()"
652 | ]
653 | },
654 | {
655 | "cell_type": "code",
656 | "execution_count": 81,
657 | "metadata": {},
658 | "outputs": [
659 | {
660 | "data": {
661 | "text/plain": [
662 | "(array([0.5, 1.5, 2.5, 3.5, 4.5]), )"
663 | ]
664 | },
665 | "execution_count": 81,
666 | "metadata": {},
667 | "output_type": "execute_result"
668 | },
669 | {
670 | "data": {
671 | "image/png": "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\n",
672 | "text/plain": [
673 | ""
674 | ]
675 | },
676 | "metadata": {
677 | "needs_background": "light"
678 | },
679 | "output_type": "display_data"
680 | }
681 | ],
682 | "source": [
683 | "# 生成评分统计RDD,并落地\n",
684 | "count_by_rating = ratings.countByValue()\n",
685 | "# 生成x/y坐标轴\n",
686 | "x_axis = np.array(count_by_rating.keys())\n",
687 | "y_axis = np.array([float(c) for c in count_by_rating.values()])\n",
688 | "# 对人数做标准化\n",
689 | "y_axis_normed = y_axis / y_axis.sum()\n",
690 | " \n",
691 | "# 生成x轴标签\n",
692 | "pos = np.arange(len(x_axis.sum()))\n",
693 | "width = 1.0\n",
694 | "ax = plt.axes()\n",
695 | "ax.set_xticks(pos + (width / 2))\n",
696 | "ax.set_xticklabels(x_axis.sum())\n",
697 | " \n",
698 | "# 绘制评分分布柱状图\n",
699 | "plt.bar(pos, y_axis_normed, width, color='lightblue')\n",
700 | "plt.xticks(rotation=30)"
701 | ]
702 | },
703 | {
704 | "cell_type": "code",
705 | "execution_count": 82,
706 | "metadata": {},
707 | "outputs": [],
708 | "source": [
709 | "# 首先将数据以用户id为Key分发到各个节点\n",
710 | "user_ratings_grouped = ratings_rdd.map(lambda fields: (int(fields[0]), int(fields[2]))).groupByKey() \n"
711 | ]
712 | },
713 | {
714 | "cell_type": "code",
715 | "execution_count": 88,
716 | "metadata": {},
717 | "outputs": [
718 | {
719 | "data": {
720 | "text/plain": [
721 | "[(196, ),\n",
722 | " (186, ),\n",
723 | " (22, ),\n",
724 | " (244, ),\n",
725 | " (166, )]"
726 | ]
727 | },
728 | "execution_count": 88,
729 | "metadata": {},
730 | "output_type": "execute_result"
731 | }
732 | ],
733 | "source": [
734 | "# 输出前5条记录.take(5)\n",
735 | "user_ratings_grouped.take(5)"
736 | ]
737 | },
738 | {
739 | "cell_type": "code",
740 | "execution_count": 84,
741 | "metadata": {},
742 | "outputs": [
743 | {
744 | "data": {
745 | "text/html": [
746 | "\n",
747 | "\n",
760 | "
\n",
761 | " \n",
762 | " \n",
763 | " | \n",
764 | " UserID | \n",
765 | " MovieID | \n",
766 | " Rating | \n",
767 | " Timestamp | \n",
768 | "
\n",
769 | " \n",
770 | " \n",
771 | " \n",
772 | " | 0 | \n",
773 | " 196 | \n",
774 | " 242 | \n",
775 | " 3 | \n",
776 | " 881250949 | \n",
777 | "
\n",
778 | " \n",
779 | " | 1 | \n",
780 | " 186 | \n",
781 | " 302 | \n",
782 | " 3 | \n",
783 | " 891717742 | \n",
784 | "
\n",
785 | " \n",
786 | " | 2 | \n",
787 | " 22 | \n",
788 | " 377 | \n",
789 | " 1 | \n",
790 | " 878887116 | \n",
791 | "
\n",
792 | " \n",
793 | "
\n",
794 | "
"
795 | ],
796 | "text/plain": [
797 | " UserID MovieID Rating Timestamp\n",
798 | "0 196 242 3 881250949\n",
799 | "1 186 302 3 891717742\n",
800 | "2 22 377 1 878887116"
801 | ]
802 | },
803 | "execution_count": 84,
804 | "metadata": {},
805 | "output_type": "execute_result"
806 | }
807 | ],
808 | "source": [
809 | "ratings_df[:3]"
810 | ]
811 | },
812 | {
813 | "cell_type": "code",
814 | "execution_count": 85,
815 | "metadata": {},
816 | "outputs": [],
817 | "source": [
818 | "# 函数: 将时间戳格式转换为datetime格式\n",
819 | "def extract_datetime(ts):\n",
820 | " import datetime\n",
821 | " return datetime.datetime.fromtimestamp(ts)"
822 | ]
823 | },
824 | {
825 | "cell_type": "code",
826 | "execution_count": 86,
827 | "metadata": {},
828 | "outputs": [],
829 | "source": [
830 | "# 获取小时RDD\n",
831 | "timestamps = ratings_rdd.map(lambda fields: int(fields[3]))\n",
832 | "hour_of_day = timestamps.map(lambda ts: extract_datetime(ts).hour)"
833 | ]
834 | },
835 | {
836 | "cell_type": "code",
837 | "execution_count": 87,
838 | "metadata": {},
839 | "outputs": [
840 | {
841 | "data": {
842 | "text/plain": [
843 | "[23, 3, 15]"
844 | ]
845 | },
846 | "execution_count": 87,
847 | "metadata": {},
848 | "output_type": "execute_result"
849 | }
850 | ],
851 | "source": [
852 | "hour_of_day.take(3)"
853 | ]
854 | },
855 | {
856 | "cell_type": "markdown",
857 | "metadata": {},
858 | "source": [
859 | "## 使用Spark对MovieLens的特征进行提取"
860 | ]
861 | },
862 | {
863 | "cell_type": "code",
864 | "execution_count": 90,
865 | "metadata": {},
866 | "outputs": [],
867 | "source": [
868 | "# 获取职业RDD并落地\n",
869 | "all_occupations = user_rdd.map(lambda fields: fields[3]).distinct().collect()\n",
870 | "# 对各职业进行排序\n",
871 | "all_occupations.sort()\n",
872 | " "
873 | ]
874 | },
875 | {
876 | "cell_type": "code",
877 | "execution_count": 92,
878 | "metadata": {},
879 | "outputs": [
880 | {
881 | "name": "stdout",
882 | "output_type": "stream",
883 | "text": [
884 | "职业编号为“1”的1 of k编码为: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n"
885 | ]
886 | }
887 | ],
888 | "source": [
889 | "# 构建字典\n",
890 | "idx = 0\n",
891 | "all_occupations_dict = {}\n",
892 | "for o in all_occupations:\n",
893 | " all_occupations_dict[o] = idx\n",
894 | " idx +=1\n",
895 | " \n",
896 | "# 生成并打印职业为程序员(programmer)的1 of k编码\n",
897 | "K = len(all_occupations_dict)\n",
898 | "binary_x = np.zeros(K)\n",
899 | "k_programmer = all_occupations_dict['programmer']\n",
900 | "binary_x[k_programmer] = 1\n",
901 | "print(\"职业编号为“1”的1 of k编码为: %s\" % binary_x)"
902 | ]
903 | },
904 | {
905 | "cell_type": "markdown",
906 | "metadata": {},
907 | "source": [
908 | "### 派生特征提取"
909 | ]
910 | },
911 | {
912 | "cell_type": "code",
913 | "execution_count": 46,
914 | "metadata": {},
915 | "outputs": [],
916 | "source": [
917 | "# 获取评分RDD\n",
918 | "\n",
919 | "ratings = ratings_rdd.map(lambda fields: int(fields[2]))\n",
920 | " "
921 | ]
922 | },
923 | {
924 | "cell_type": "code",
925 | "execution_count": 94,
926 | "metadata": {},
927 | "outputs": [],
928 | "source": [
929 | "# 函数: 将时间戳格式转换为datetime格式\n",
930 | "def extract_datetime(ts):\n",
931 | " import datetime\n",
932 | " return datetime.datetime.fromtimestamp(ts)"
933 | ]
934 | },
935 | {
936 | "cell_type": "code",
937 | "execution_count": 95,
938 | "metadata": {},
939 | "outputs": [],
940 | "source": [
941 | "# 获取小时RDD\n",
942 | "timestamps = ratings_rdd.map(lambda fields: int(fields[3]))\n",
943 | "hour_of_day = timestamps.map(lambda ts: extract_datetime(ts).hour)"
944 | ]
945 | },
946 | {
947 | "cell_type": "code",
948 | "execution_count": 96,
949 | "metadata": {},
950 | "outputs": [],
951 | "source": [
952 | "# 函数: 将小时映射为分类变量并展示\n",
953 | "def assign_tod(hr):\n",
954 | "\n",
955 | " if hr >7 and hr < 12 :\n",
956 | " return 'morning'\n",
957 | " elif hr >11 and hr < 14 :\n",
958 | " return 'lunch'\n",
959 | " elif hr >13 and hr < 18 :\n",
960 | " return 'afternoon'\n",
961 | " elif hr >17 and hr < 22 :\n",
962 | " return 'evening'\n",
963 | " else:\n",
964 | " return 'night'\n",
965 | " "
966 | ]
967 | },
968 | {
969 | "cell_type": "code",
970 | "execution_count": 97,
971 | "metadata": {},
972 | "outputs": [
973 | {
974 | "data": {
975 | "text/plain": [
976 | "['night', 'night', 'afternoon', 'lunch', 'lunch']"
977 | ]
978 | },
979 | "execution_count": 97,
980 | "metadata": {},
981 | "output_type": "execute_result"
982 | }
983 | ],
984 | "source": [
985 | "# 获取新的分类变量RDD\n",
986 | "time_of_day = hour_of_day.map(lambda hr: assign_tod(hr))\n",
987 | "time_of_day.take(5)"
988 | ]
989 | },
990 | {
991 | "cell_type": "markdown",
992 | "metadata": {},
993 | "source": [
994 | "### 文本特征提取"
995 | ]
996 | },
997 | {
998 | "cell_type": "code",
999 | "execution_count": 99,
1000 | "metadata": {},
1001 | "outputs": [],
1002 | "source": [
1003 | "# 函数: 剔除掉标题中的(年份)部分\n",
1004 | "def extract_title(raw):\n",
1005 | " import re\n",
1006 | " grps = re.search(\"\\((\\w+)\\)\", raw)\n",
1007 | " if grps:\n",
1008 | " return raw[:grps.start()].strip()\n",
1009 | " else:\n",
1010 | " return raw"
1011 | ]
1012 | },
1013 | {
1014 | "cell_type": "code",
1015 | "execution_count": 100,
1016 | "metadata": {},
1017 | "outputs": [],
1018 | "source": [
1019 | "# 获取影片名RDD\n",
1020 | "raw_titles = movie_fields.map(lambda fields: fields[1])\n",
1021 | " \n",
1022 | "# 剔除影片名中的(年份)\n",
1023 | "movie_titles = raw_titles.map(lambda m: extract_title(m))\n",
1024 | " \n",
1025 | "# 由于仅仅是个展示的例子,简简单单用空格分割\n",
1026 | "title_terms = movie_titles.map(lambda t: t.split(\" \"))"
1027 | ]
1028 | },
1029 | {
1030 | "cell_type": "code",
1031 | "execution_count": 101,
1032 | "metadata": {},
1033 | "outputs": [
1034 | {
1035 | "data": {
1036 | "text/plain": [
1037 | "[<1x2645 sparse matrix of type ''\n",
1038 | " \twith 2 stored elements in Compressed Sparse Column format>,\n",
1039 | " <1x2645 sparse matrix of type ''\n",
1040 | " \twith 1 stored elements in Compressed Sparse Column format>,\n",
1041 | " <1x2645 sparse matrix of type ''\n",
1042 | " \twith 2 stored elements in Compressed Sparse Column format>,\n",
1043 | " <1x2645 sparse matrix of type ''\n",
1044 | " \twith 2 stored elements in Compressed Sparse Column format>,\n",
1045 | " <1x2645 sparse matrix of type ''\n",
1046 | " \twith 1 stored elements in Compressed Sparse Column format>]"
1047 | ]
1048 | },
1049 | "execution_count": 101,
1050 | "metadata": {},
1051 | "output_type": "execute_result"
1052 | }
1053 | ],
1054 | "source": [
1055 | "\n",
1056 | "# 搜集所有的词\n",
1057 | "all_terms = title_terms.flatMap(lambda x: x).distinct().collect()\n",
1058 | "# 创建字典\n",
1059 | "idx = 0\n",
1060 | "all_terms_dict = {}\n",
1061 | "for term in all_terms:\n",
1062 | " all_terms_dict[term] = idx\n",
1063 | " idx +=1\n",
1064 | "num_terms = len(all_terms_dict)\n",
1065 | " \n",
1066 | "# 函数: 采用稀疏向量格式保存编码后的特征并返回\n",
1067 | "def create_vector(terms, term_dict):\n",
1068 | " from scipy import sparse as sp\n",
1069 | " x = sp.csc_matrix((1, num_terms))\n",
1070 | " for t in terms:\n",
1071 | " if t in term_dict:\n",
1072 | " idx = term_dict[t]\n",
1073 | " x[0, idx] = 1\n",
1074 | " return x\n",
1075 | " \n",
1076 | "# 将字典保存为广播数据格式类型。因为各个worker都要用\n",
1077 | "all_terms_bcast = sc.broadcast(all_terms_dict)\n",
1078 | "# 采用稀疏矩阵格式保存影片名特征\n",
1079 | "term_vectors = title_terms.map(lambda terms: create_vector(terms, all_terms_bcast.value))\n",
1080 | "# 展示提取结果\n",
1081 | "term_vectors.take(5)"
1082 | ]
1083 | },
1084 | {
1085 | "cell_type": "code",
1086 | "execution_count": 102,
1087 | "metadata": {},
1088 | "outputs": [],
1089 | "source": [
1090 | "all_terms_dict2 = title_terms.flatMap(lambda x: x).distinct().zipWithIndex().collectAsMap()"
1091 | ]
1092 | },
1093 | {
1094 | "cell_type": "markdown",
1095 | "metadata": {},
1096 | "source": [
1097 | "### 归一化特征"
1098 | ]
1099 | },
1100 | {
1101 | "cell_type": "code",
1102 | "execution_count": 103,
1103 | "metadata": {},
1104 | "outputs": [
1105 | {
1106 | "name": "stdout",
1107 | "output_type": "stream",
1108 | "text": [
1109 | "向量x:\n",
1110 | "[ 0.49671415 -0.1382643 0.64768854 1.52302986 -0.23415337 -0.23413696\n",
1111 | " 1.57921282 0.76743473 -0.46947439 0.54256004]\n",
1112 | "向量x的2阶范数: 2.5908\n",
1113 | "归一化后的向量x:\n",
1114 | "[ 0.19172213 -0.05336737 0.24999534 0.58786029 -0.09037871 -0.09037237\n",
1115 | " 0.60954584 0.29621508 -0.1812081 0.20941776]\n",
1116 | "归一化后向量x的2阶范数:\n",
1117 | "1.0000\n"
1118 | ]
1119 | }
1120 | ],
1121 | "source": [
1122 | "# 设置随机数种子\n",
1123 | "np.random.seed(42)\n",
1124 | "# 生成随机向量\n",
1125 | "x = np.random.randn(10)\n",
1126 | "# 产生二阶范数\n",
1127 | "norm_x_2 = np.linalg.norm(x)\n",
1128 | "# 归一化\n",
1129 | "normalized_x = x / norm_x_2\n",
1130 | " \n",
1131 | "# 结果展示\n",
1132 | "print(\"向量x:\\n%s\" % x)\n",
1133 | "print(\"向量x的2阶范数: %2.4f\" % norm_x_2)\n",
1134 | "print( \"归一化后的向量x:\\n%s\" % normalized_x)\n",
1135 | "print(\"归一化后向量x的2阶范数:\\n%2.4f\" % np.linalg.norm(normalized_x))"
1136 | ]
1137 | },
1138 | {
1139 | "cell_type": "code",
1140 | "execution_count": 104,
1141 | "metadata": {},
1142 | "outputs": [
1143 | {
1144 | "name": "stdout",
1145 | "output_type": "stream",
1146 | "text": [
1147 | "向量x:\n",
1148 | "[ 0.49671415 -0.1382643 0.64768854 1.52302986 -0.23415337 -0.23413696\n",
1149 | " 1.57921282 0.76743473 -0.46947439 0.54256004]\n",
1150 | "向量x的二阶范数: 2.5908\n",
1151 | "被MLlib归一化后的向量x:\n",
1152 | "[ 0.19172213 -0.05336737 0.24999534 0.58786029 -0.09037871 -0.09037237\n",
1153 | " 0.60954584 0.29621508 -0.1812081 0.20941776]\n",
1154 | "被MLlib归一化后的向量x的二阶范数: 1.0000\n"
1155 | ]
1156 | }
1157 | ],
1158 | "source": [
1159 | "# 导入Spark库中的正则化类\n",
1160 | "from pyspark.mllib.feature import Normalizer\n",
1161 | "# 初始化正则化对象\n",
1162 | "normalizer = Normalizer()\n",
1163 | "# 创建测试向量(RDD)\n",
1164 | "vector = sc.parallelize([x])\n",
1165 | "# 对向量进行归一化并返回结果\n",
1166 | "normalized_x_mllib = normalizer.transform(vector).first().toArray()\n",
1167 | " \n",
1168 | "# 结果展示\n",
1169 | "print(\"向量x:\\n%s\" % x)\n",
1170 | "print(\"向量x的二阶范数: %2.4f\" % norm_x_2)\n",
1171 | "print(\"被MLlib归一化后的向量x:\\n%s\" % normalized_x_mllib)\n",
1172 | "print(\"被MLlib归一化后的向量x的二阶范数: %2.4f\" % np.linalg.norm(normalized_x_mllib)) "
1173 | ]
1174 | },
1175 | {
1176 | "cell_type": "code",
1177 | "execution_count": null,
1178 | "metadata": {},
1179 | "outputs": [],
1180 | "source": []
1181 | }
1182 | ],
1183 | "metadata": {
1184 | "kernelspec": {
1185 | "display_name": "Python 3",
1186 | "language": "python",
1187 | "name": "python3"
1188 | },
1189 | "language_info": {
1190 | "codemirror_mode": {
1191 | "name": "ipython",
1192 | "version": 3
1193 | },
1194 | "file_extension": ".py",
1195 | "mimetype": "text/x-python",
1196 | "name": "python",
1197 | "nbconvert_exporter": "python",
1198 | "pygments_lexer": "ipython3",
1199 | "version": "3.7.1"
1200 | }
1201 | },
1202 | "nbformat": 4,
1203 | "nbformat_minor": 2
1204 | }
1205 |
--------------------------------------------------------------------------------