Python AI从入门到放弃
1. 概述
1.1. 人工智能起源
- 图灵测试
- 达特茅斯会议
1.2. 人工智能三个阶段
- 1980年代是正式成形期
- 1990-2010年代是蓬勃发展期
- 2012年之后是深度学习期
1.3. 人工智能、机器学习和深度学习
- 机器学习是人工智能的一个实现途径
- 深度学习是机器学习的一个方法发展而来
1.4. 主要分支
- 计算机视觉 CV
- 人脸识别
- 自然语言处理 NLP
- 语音识别
- 语义识别
- 机器人
1.5. 人工智能必备三要素
- 数据
- 算法
- 计算力
1.6. GPU、CPU
- GPU – 计算密集型
- CPU – IO密集型
2. 机器学习
2.1. 工作流程
- 数据获取
数据类型构成
- 特征值 + 目标值(目标值分为离散还是连续)
- 仅有特征值,无目标值
数据划分
- 训练集 0.7~0.8
- 测试集 0.2~0.3
- 数据基本处理
对数据进行缺失值、去除异常值等处理
- 特征工程
把数据转换为机器更容易识别的数据
数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限而已
- 特征提取
- 特征预处理
- 特征降维
- 机器学习(模型训练)
选择合适的算法对模型进行训练
- 模型评估
对训练好的模型进行评估
2.2. 机器学习算法分类
- 监督学习:有特征值,有目标值
- 目标值连续:回归
- 目标值离散:分类
- 无监督学习:仅有特征值
- 半监督学习:有特征值,但一部分数据有目标值 ,一部分没有
- 强化学习:即自动进行决策,并可以做连续决策
- 动态过程,上一步的输出是下一步的输入
- 四要素:agent, action, environment, reward
2.3. 模型评估
分类模型评估
- 准确率:预测正确的数占样本总数的比例
- 精确率:预测为正的数占全部预测为正的比例
- 召回率: 预测为正占全部正样本的比例
- F1-score:主要用于评估模型的稳健性
- AUC指标:主要用于评估样本不均衡的情况
回归模型评估
p = predicted target
a = actual target
- 均方根误差(Root Mean Squared Error, RMSE)
- 相对平方误差(Relative Squared Error, RSE)
- 平均绝对误差(Mean Absolute Error, MAE)
- 相对绝对误差(Relative Absolute Error, RAE)
- 决定系数(Coefficient of Determination)
拟合度(评估结果)
- 欠拟合:学习到的特征太少(有两个眼睛的就是人)
- 过拟合:学习到的特征太多(仅黄皮肤的才是人)
3. 机器学习环境配置
3.1. 环境安装
- 创建虚拟环境:
conda create --name=ai0 python=3.10 - 安装相关包:
- matplotlib==2.2.2
- numpy==1.14.2
- pandas==0.20.3
- tables==3.4.2
- jupyter=1.0.0
- 先从cmd进入指定目录后执行
jupyter notebook
3.2. jupyter基操
类似vim, 分不同的输入模式,命令也和vim基本相同
- 两种模式通用快捷键
Shift + Enter执行本单元代码,跳转到下一单元Ctrl + Enter执行本单元代码,留在本单元
- 命令模式:按
ESC进入Y, cell 切换到Code模式M, cell 切换到Markdown模式A, 在当前cell上面添加cellB, 在当前cell下面添加cellDD, 删除当前cellZ, 回退L, 为当前cell加上行号<!–Ctrl+Shift+P, 对话框输入命令直接运行Ctrl+Home, 跳转到首个cellCtrl+End, 跳转到末个cellShift + M合并下面的cell
- 编辑模式: 按
Enter进入Ctrl + 点击, 多光标操作Ctrl + Z, 回退Ctrl + Y, 重做TAB, 代码补全Ctrl + /注释/取消注释代码后 + ;屏蔽输出
4. Matplotlib
用于开发2D、3D图表
使用简单,以渐进、交互式实现数据可视化
4.1. 三层结构
- 容器层
- Canvas: 最底层的系统层,充当画板角色,即放置画布(Figure)的工具
- Figure:
Canvas上第一层,充当画布角色 - Axes:应用层的第二层,在绘图过程中相当于画布上的绘图区的角色
- Axes: 坐标系,数据的绘图区域
- Axis: 坐标轴
- 辅助显示层:为Axes内除了根据数据绘制出的图像以外的内容,主要包括
facecolor(Axes外观)、spines(边框线)、axis(坐标轴)、axix lable(坐标轴名称)、tick(坐标轴刻度)、tick lable(坐标轴刻度标签)、gird(网格线)、legend(图例)、title(标题)等 - 图像层:指
Axes内通过plot,scatter,histogram,pie等函数根据数据绘制出的图像。
4.2. 折线图与基操
help(plt.figure)查看命令帮助负号报错 plt.rcParams[“axes.unicode_minus”]=False 加这句
中文乱码,需要把系统使用的中文字体对应的英文名称添加到matplotlib配置中 matplotlib.matplotlib_fname() 可查到是 matplotlib/mpl-data/matplotlibrc 此文件,查 #font.sans-serif 解注释并把英文字体名加到第一个位置
报错
missing from current font,加以下代码
from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei']
Hello World
1 | import matplotlib.pyplot as plt |
基操
1 | import random |
多个坐标系图像显示
1 | import random |
5. Numpy
5.1. 基础
定义:
- Numpy(Numerical Python) 是一个开源的Python科学计算库,用于快速处理任意维度的数组
- Numpy支持觉的数组和矩阵操作,对于同样数值计算任务,使用Numpy比直接使用Python简洁的多
- Numpy使用
ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器
优势:
内存块风格:
ndarray在存储数据时,数据和数据的地址是连续的,这样使得批量操作数组元素时速度更快- 原因:
ndarray中所有的元素类型是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而原生列表只能通过寻址方式找到下一个元素
- 原因:
并行化运算:向量化运算
Numpy底层使用C语言编写,内部解除了GIL,其对数组的操作速度不受Python解释器的限制,所以效率远高于纯Python代码
1 | import time |
常用属性:
1 | score |
5.1.1. 生成数组
1 | # 0/1数组 |
生成随机数组
生成均匀分布:
np.random.uniform(low, high, size)正态分布
- 均值:平均值
- 标准差:方差开根号
- 生成标准正态分布:
np.random.normal(low, high, size)
1 | import matplotlib.pyplot as plt |
5.1.2. 数组索引、切片
- 直接索引,先对行进行索引,再对列进行索引
- 高维度索引,从宏观到微观
1 | a = np.random.normal(0, 1, (8, 10)) # 8rows, 10cols |
5.1.3. 形状修改
.reshape([rows, cols])不进行行列互换,产生新变量.resize([rows, cols])进行行列互换,对原值 进行更改.T行列互换
5.1.4. 类型修改
.astype(np.int32).tobytes()np.unique(nparray)去重1
2
3arr = np.array([[1, 2, 3, 3, 3], [2, 3, 4,4 , 5]])
np.unique(arr)
# array([1, 2, 3, 4, 5])
5.1.5 运算
1 | import numpy as np |
5.2. 矩阵
- 矩阵:二维数组
- 向量:一维数组
- 加法:对应位置相加
- 标量乘法:标量和每个位置元素相乘
- 矩阵乘法:[M行,N列] * [N行,L列] = [M行,L列]
- 满足结合律,不满足交换律
- 单位矩阵:对角线为1,其他位置为0的矩阵
- 逆:A * B = 单位矩阵,A和B互为逆矩阵
- 转置T:行列互换
5.3. 数组间运算
数组和数字:可以直接运算
数组和数组:广播机制
- 维度相同
- shape对应位置为1
1 | import numpy as np |
6. Pandas
- 封装了Numpy 和 matplotlib
- 便捷的数据处理,展示能力
1 | import pandas as pd |
7. K-近邻算法
根据邻居判断自己的类别,是一种分类算法,K Nearst Neighbor(KNN)
-
7.1. Scikit-learn
Classification 分类
Regression 回归
Clustering 聚类
Dimensionality reduction 维度缩小
Model selection 模型选择
Preprocessing 特征预处理
1 | from sklearn.neighbors import KNeighborsClassifier |
7.2. 距离度量
欧式距离:差平方开根号
曼哈顿距离(Manhattan Distance): 又称为城市街区距离(City Block distance)
- d = |x1 - x2| + |y1 - y2|
切比雪夫距离(Chebyshev Distance): max(|x1-x2|, |y1-y2|)
闵可夫斯基距离(Minkowski Distance):
$$
d_{12} = p\sqrt{\sum_{k=1}^n|x_{1k} - x_{2k}|^p}
$$
- 当p=1, 为曼哈顿距离
- 当p=2,为欧氏距离
- 当p$\to\infty$, 为切比雪夫距离
标准化欧氏距离(Standardized EuclideanDistance): 对欧氏距离的一种改进, 如果将方差的倒数看成一个权重,也可称为加权欧氏距离(Weighted Euclidean distance)
- 既然数据各维分量的分布不同,将各个分量都标准化到均值、方差相等,假设样本均值为m(mean), 标准差(standard deviation)为s, 则公式为:
$$
d_{12} = \sqrt{\sum_{k=1}^n(\frac{x_{1k}-x_{2k}}{s_k})^2}
$$
余弦距离(Cosine Distance): 夹角余弦取值范围为[-1, 1], 余弦越大表示两个向量夹角越小,当两个向量的方向重合时值为1, 相反为-1,用来衡量样本间的差异
汉明距离(Hamming Distance): 一个字符串到另一个字符串需要变换几个字母,进行统计
杰卡德距离(Jaccard Distance): 通过交并集进行统计
马氏距离(Mahalanobis Distance): 通过样本分布进行计算
7.3. K值选择
过小:容易受到异常点的影响,容易过拟合
过大:受到样本均衡的问题,容易欠拟合