深度学习之算法
1 人工智能 人工智能具体可以做哪些事情呢?该领域的研究包括机器人、语言识别、图像识别、自然语言处理、风险预测和专家系统等 1.1 内容 什么是人工智能 人工智能与数学的关系 人工智能主要分类及常用算法 1.2 人工智能 人工智能由人工和智能两个词组成,智能是他的主要特征,而人工是这种智能的修饰词.地球上具备智慧可以思考的动物,人类首屈一指. 引用网上一个很恰当的词来形容人工智能 – 拟人. AI是人工的让机器像人类一样思考.
1.3 人工智能和数学的关系 一个初级的司机熟悉车的基本操作,可以驾驶车到自己想去的地方,人工智能的初级是可以调用人工智能框架内由他人写好的算法来做基本的事情,事实上这也将是从事AI之后占比重最大的部分. 中级的司机可以熟练驾驶车辆,理解汽车的主要工作原理同时可以应付车辆常见的故障,当车辆抛锚时可以自己先尝试修理车辆.这对应着人工智能的中级工程师,他们熟练掌握常用算法的推导过程,理解这些算法的思想并知道哪些算法适合做哪些事情,为什么. 一个高级的司机,应该是一名汽车爱好者.他擅长车辆的改装,了解每种型号的发动机,必要的时候对各种不同的组件进行改装,组合,以便实现自己对动力 稳定性等不同需求.AI的高级工程师也一样,他善于抽取出算法的核心引擎并同其他算法组装,提高算法和业务的契合度. 例子列举的并不恰当,高手见谅.但这利于我们刚开始接触AI时候的理解.看到这里有些朋友会问,那数学呢,数学同AI的关系又是什么样子?同样是开车这个例子.数学在里边起到的作用就是:整个汽车开动起来,各个档需要多少动力,发动机需要用什么材料才能在产生动力的同时保证寿命.汽车各个材料间组装的公差等是什么要求. 可以看出,一名汽车生产厂的设计师需要学习数学,因为这是汽车制造的灵魂,但如果你是一个司机,那我们只需要会调用部分已有的数学公式即可.我们不需要去验证这些已有的公式是正确的,我们工作的灵魂,是算法思想!只要你具备一些简单的数学基础并且在学习AI的过程中补习自己遇到不会的知识点,学习AI是完全没有问题的.
1.4 人工智能与常用算法
1.5 硬盘分区 fdisk /dev/sdb
键入m,可看到帮助信息 键入n表示新分区
键入p选择基本分区 键入1表示建一个分区 w:保存操作。q:退出。d:删除一个分区 1.6 格式化磁盘分区 用ext4格式对/dev/sdb1进入格式化 命令:mkfs.ext4 /dev/sdb1 1.7 挂载分区 创建新的挂载点 mkdir /work 将新磁盘分区挂载到/work目录下 mount -t ext4 /dev/sdb1 /work 查看挂载 df -h 1.8 设置开机时自动挂载: 1.8.1 查看磁盘UUID信息 命令:blkid
1.8.2 编辑/etc/fstab文件 命令:vim /etc/fstab
重启查看是否已挂载reboot df –h /dev/sdb1: UUID=“8d7738aa-8060-4606-8749-17cdbbfb084e” TYPE=“ext4” PARTUUID=“634b6d55-01”
2 多元线性回归 我们知道y=ax+b是一元一次方程,y=ax1+bx2+c(1和2是角标,原谅我的懒)是二元一次方程.其中,"次"指的是未知数的最大幂数,"元"指的是表达式中未知数的个数(这里就是x的个数).那么"多元"的意思可想而知,就是表达式中x(或者叫自变量,也叫属性)有很多个.
2.1 Anaconda Python目前有2和3两个版本,因此Anaconda也在Python2和Python3的基础上推出了两个发行版,即Anaconda2和Anaconda3。有时候我们会在同时使用python2.7和python3.5两个版本,因此有必要考虑它们的共存问题。
2.1.1 安装 下载地址:https://repo.continuum.io/archive/index.html (1) 上传文件 Anaconda3-2.0.1-Linux-x86_64.sh (2) 将该文件设置为可执行 (3) 同意协议,输入yes (4) 更改默认安装目录(不能提前建好),输入路径即可 (5) 之后yes(当前用户有效) 若选择no(设置所有用户有效) 编辑/etc/profile文件,添加环境变量: export ANACONDA_HOME=安装路径 export PATH=
A
N
A
C
O
N
D
A
H
O
M
E
/
b
i
n
:
ANACONDA_HOME/bin:
ANACONDAH?OME/bin:PATH 最后生效profile文件(source /etc/profile)
(6) 验证,重新开启一个终端,输入python3、python Python 3.4.1 |Anaconda 2.0.1 (64-bit)| (default, May 19 2014, 13:02:41)
2.1.2 使用 因为Anaconda.org的服务器在国外,所以需要安装packages时,你会发现conda下载的速度经常很慢,所幸清华TUNA镜像源有Anaconda仓库的镜像,我们将其加入conda的配置即可。
添加Anaconda的TUNA镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
设置搜索时显示通道地址
conda config --set show_channel_urls yes
常用命令
更新包:conda update –all 列出已安装包:conda list 安装包:conda install (-n 环境名称) package(=version) 删除包:conda remove package 搜索包名:conda search xxx 2.1.3 创建虚拟环境 查看创建好的环境 conda info --envs 创建虚拟环境 conda create -n your_env_name python=X.X(2.7、3.6等) 激活虚拟环境 source activate your_env_name 退出 source deactivate 删除 conda remove -n your_env_name --all 安装 conda install -n your_env_name [package] conda remove --name your_env_name package_name 使用命令jupyter kernelspec list可以查看当前的kernel conda install ipykernel
2.1.4 管理 Conda的环境管理功能允许我们同时安装若干不同版本的Python,并能自由切换。对于上述安装过程,假设我们采用的是Python 2.7对应的安装包,那么Python 2.7就是默认的环境(默认名字是root,注意这个root不是超级管理员的意思)。
2.2 安装jupyter notebook 2.2.1 升级pip 由于之前安装了anaconda3,这会自动安装好python的pip下载工具,不过这个pip版本可能过低,最好不要升级。 pip install --upgrade pip 升级问题: from pip import main if name == ‘main’: sys.exit(main._main())
conda update pip(使用这个!!!)
降级: python -m pip install pip==9.0.3 2.2.2 安装 conda install jupyter conda install jupyter notebook 2.2.3 配置 2.2.3.1 生成配置文件 jupyter notebook --generate-config Writing default config to: /root/.jupyter/jupyter_notebook_config.py sudo gedit /home/python/.jupyter/jupyter_notebook_config.py 如果出现: 如果输入 jupyter notebook --generate-config提示: Running as root is not recommended. Use –allow-root to bypass. 则在后边加上 --allow-root jupyter notebook --generate-config --allow-root 2.2.3.2 修改配置文件 vim /root/.jupyter/jupyter_notebook_config.py 将c.NotebookApp.allow_root = False前边的 ‘#‘去掉,在把False修改为True 2.2.3.3 生成登录密码 打开 ipython from notebook.auth import passwd passwd() Enter password: 输入一次密码 Verify password: 再次输入密码 sha1:ae9e423f48ae:a8… ‘sha1:de7628a47236:140a1b363544faca3c1ce39bcf036452b5051480’ 123456 2.2.3.4 再次修改配置文件 vi /root/.jupyter/jupyter_notebook_config.py c.NotebookApp.ip=’’ c.NotebookApp.password = u’sha1:ae9e423f48ae:a8 c.NotebookApp.open_browser = False c.NotebookApp.port =8888 #任意空闲端口,使用默认8888也可以 c.NotebookApp.allow_credentials = True c.NotebookApp.ip='’ c.NotebookApp.password=u’sha1:de7628a47236:140a1b363544faca3c1ce39bcf036452b5051480’ c.NotebookApp.open_browser=False c.NotebookApp.port=7788 c.NotebookApp.notebook_dir=‘/newdisk/jupyter_project’ 2.2.3.5 启动 jupyter notebook http://192.168.37.3:7788 输入密码进入
2.3 numpy 2.3.1 简介 支持矩阵操作和运算,非常高效,使用c语言编写 现在比较流行的机器学习框架(例如Tensorflow/PyTorch等等),语法都与Numpy比较接近 2.3.2 内容 调用numpy包 2.3.2.1 数组简介、构造ndarray 调用np.array初始化list a = np.array([1, 2, 3]) print(a.shape) (1,3) b = np.array([[1,2,3], [2,3,4]]) print(b.shape) (2,3) a = np.zeros((2,3)) b = np.ones((1,2)) c = np.full((2,2), 8) d = np.eye(3) e = np.random.random((3,2)) arr = np.random.randn(6,3) f = np.empty((2,3,4)) y = np.empty_like(x) g = np.arange(15) 数组可以有不同的数据类型 arr = np.array([1,2,3]) print(arr.dtype) int32 arr = np.array([1,2,3], dtype=np.float64) print(arr.dtype) 生成数组时可以指定数据类型,如果不指定numpy会自动匹配合适的类型 使用astype复制数组并转换数据类型 float_arr = int_arr.astype(np.float64) int_arr.astype(dtype=float_arr.dtype)
2.3.2.2 数组取值、赋值
a[0] a[1] 可以像list一样切片(多维数组可以从各个维度同时切片): b = a[0:2,2:4] row_r1 = a[1,:] row_r2 = a[1:2, :] a[[0,1,2], [0,1,0]] 等价于 np.array([a[0,0], a[1,1], a[2,0]]) 用下标生成一个向量 b = np.array([0, 2,0,1]) a[np.arange(4), b] a[np.arange(4), b] += 10 条件判断 bool_index = (a > 2) print(bool_index) a[bool_index] a[a>2]
2.3.2.3 数学运算 x = np.array([[1,2],[3,4]], dtype=np.float64) y = np.array([[5,6],[7,8]], dtype=np.float64) x+y np.add(x,y) x-y np.subtract(x,y) x*y np.multiply(x,y) x/y np.divide(x, y) np.sqrt(x) 向量内积 v.dot(w) np.dot(v,w) 矩阵的乘法 x.dot(v) np.dot(x, v) 转置 x.T 高维的tensor也可以做转置 三维矩阵以上叫tensor arr = np.arange(16).reshape(2,2,4) print(arr, arr.shape) [[[ 0 1 2 3] [ 4 5 6 7]]
[[ 8 9 10 11] [12 13 14 15]]] (2, 2, 4) print(arr.transpose((1,0,2))) 一维跟二维位置变化 arr.swapaxes(1,2) 多维数组相乘 np.matmul(x,y).shape 矩阵内元素的运算 求和 np.sum(x) x.sum() np.sum(x, axis=0) 列方向 np.sum(x, axis=1) 横方向 np.mean(x) np.mean(x, axis=0) x.cumsum(axis=0) 按列相加 x.cumprod(axis=0) 按列相乘 arr.sort() 升序排序
2.3.2.4 Broadcasting 如果要用小的矩阵去和大的矩阵做一些操作,但是希望小矩阵能循环和大矩阵的那些块做一样的操作,那急需要Broadcasting 给x的每一行都逐元素加上一个向量 x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) v = np.array([1, 0, 1]) x + v 当操作两个array时,numpy会逐个比较它们的shape,在下述情况下,两arrays会兼容和输出broadcasting结果:
- 相等
- 其中一个为1,(进而可进行拷贝拓展已至,shape匹配)
2.3.2.5 逻辑运算 x_arr = np.array([1.1, 1.2, 1.3, 1.4, 1.5]) y_arr = np.array([2.1, 2.2, 2.3, 2.4, 2.5]) cond = np.array([True, False, True, True, False]) np.where(cond, x_arr, y_arr) [ 1.1 2.2 1.3 1.4 2.5]
2.3.2.6 数组高级操作 使用reshape来改变tensor的形状 arr = np.arange(8) arr.reshape(2,4) arr.reshape(2,-1) 如果我们在某一个维度上写上-1,numpy会帮我们自动推导出正确的维度 高维数组可以用ravel来拉平 arr.ravel() np.concatenate([arr1, arr2], axis=0) 增加横,按列连接 np.vstack((arr1, arr2)) 堆叠 np.concatenate([arr1, arr2], axis=1) np.hstack((arr1, arr2)) 拆分数组:分成三部分 0 1 2 3- first, second, third = np.split(arr, [1,3], axis=0) 按行分 辅助堆叠 arr = np.arange(6) arr1 = arr.reshape((3, 2)) arr2 = np.random.randn(3, 2) np.r_[arr1, arr2] 按行堆叠 np.c_[np.r_[arr1, arr2], arr] c_用于按列堆叠 np.c_[1:6, -5:0] 切片直接转为数组 array([[ 1, -5], [ 2, -4], [ 3, -3], [ 4, -2], [ 5, -1]]) repeat重复 arr = np.arange(3) arr.repeat(3) [0 0 0 1 1 1 2 2 2] arr.repeat([2,3,5]) [0 0 1 1 1 2 2 2 2 2] arr.repeat(2, axis=0) # 每行重复两遍 arr.repeat(2, axis=1) # 每列重复两遍 整块重复 np.tile(arr, 2) np.tile(arr, (2,3)) #行重复两遍,列重复三遍
2.3.2.7 文件输入输出 读取csv文件作为数组 arr = np.loadtxt(‘array_ex.txt’, delimiter=‘,’) 保存 np.save(‘some_array’, arr) np.savetxt(‘a.txt’,arr) 多个数据保存 np.savez(“array_archive.npz”, arr=arr, b=arr2, c=arr3) arch = np.load(‘array_archive.npz’) print(arch[‘arr’])
2.4 pandas python数据分析library 基于numpy (对ndarray的操作) 处理ndarray 处理高维数据运算 有一种用python做Excel/SQL/R的感觉 2.4.1 目录 2.4.1.1 Series 数据结构series pandas.core.series.Series
可以用list或dict构造series Series是一个一维的数据结构 object Range对象创建 obj=pd.Series(range(3),index=[“0”,“1”,“2”]) List构建 s = pd.Series([7, ‘Beijing’, 2.17, -12344, ‘Happy Birthday!’]) 0 7 1 Beijing 2 2.17 3 -12344 4 Happy Birthday! dtype: object 自定义下标 s1=pd.Series(list1,index=[7, ‘Beijing’, 2.17, -1232, ‘Happy birthday!’]) Dict构建 dict1={‘Beijing’: 55000, ‘Shanghai’: 60000, ‘Shenzhen’: 50000, ‘Hangzhou’:20000, ‘Guangzhou’: 25000, ‘Suzhou’: None} s2=pd.Series(dict1) dtype: float64 选择数据 一个key s2[“Beijing”] 多个key s2[[“Beijing”,“Guangzhou”,“Hangzhou”]] 赋值 s2[“Beijing”]=55000 数学运算 s2/2 s2*2 np.square(s2) 数据缺失 ‘Hangzhou’ in s2 True、False s2.notnull() Beijing True Guangzhou True Hangzhou True Shanghai True Shenzhen True Suzhou False dtype: bool
s2.isnull()
切片 s2[::] s2[1:3] 2.4.1.2 DataFrame 一个Dataframe就是一张表格,Series表示的是一维数组,Dataframe则是一个二维数组,可以类比成一张excel的spreadsheet。也可以把Dataframe当做一组Series的集合。 pandas.core.frame.DataFrame
创建 由dict创建, 字典:列表 列名默认由key指定,行由0-n dict2={‘city’: [‘Beijing’, ‘Shanghai’, ‘Guangzhou’, ‘Shenzhen’, ‘Hangzhou’, ‘Chongqing’], ‘year’: [2016,2017,2016,2017,2016, 2016], ‘population’: [2100, 2300, 1000, 700, 500, 500]} dataframe1=pd.DataFrame(dict2) print(dataframe1) type(dataframe1) city population year 0 Beijing 2100 2016 1 Shanghai 2300 2017 2 Guangzhou 1000 2016 3 Shenzhen 700 2017 4 Hangzhou 500 2016 5 Chongqing 500 2016
字典:字典 列名:key 行名 字典中的key dict3={‘Beijing’: {2016: 2100, 2017:2200}, ‘Shanghai’: {2015:2400, 2016:2500, 2017:2600}} dataframe2=pd.DataFrame(dict3) print(dataframe2) Beijing Shanghai 2015 NaN 2400 2016 2100.0 2500 2017 2200.0 2600
列名和顺序可以指定,index也可以指定,默认0-n 列名不存在时数据为NaN 顺序是与key匹配的 dataframe3=pd.DataFrame(dict2,columns=[‘year’, ‘city’, ‘population’, ‘debt’],index=[‘one’, ‘two’, ‘three’, ‘four’, ‘five’, ‘six’]) 选取数据 根据列名选取,数据类型为series dataframe3[“city”] dataframe3.city 根据行选取,数据类型为series dataframe3.ix[“six”] dataframe3.ix[5] 赋值 某个元素赋值 dataframe3[“city”][“one”]=“shanxi” 某列、某行赋值 dataframe3.debt=10000 dataframe3.debt=np.arange(6) 用Series来指定需要修改的index以及相对应的value,没有指定的默认用NaN. val = pd.Series([200, 300, 500], index=[‘two’, ‘three’, ‘five’]) frame2[‘debt’] = val
frame2.ix[‘six’] = 0 逻辑赋值 frame2[‘western’] = (frame2.city == ‘Chongqing’)
dataframe3.columns
dataframe3.index 转置 dataframe3.T 指定index的顺序,使用切片初始化数据 dataframe3[“city”][1:3]
指定index、列名 dataframe3.index.name=“no” dataframe3.columns.name=“info” 获取数据 dataframe3.values type:numpy.ndarray
2.4.1.3 Index, reindex and hierarchical indexing 创建Index object pandas.indexes.base.Index 方法1: obj=pd.Series(range(3),index=[“0”,“1”,“2”]) index=obj.index type(index) Index([‘0’, ‘1’, ‘2’], dtype=‘object’) 切片 index[1:] Index值是不能更改的 方法2: index2=pd.Index(np.arange(5)) s4=pd.Series([2,5,7,5,6], index=index2) s4.index is index2
2.4.1.4 Merge, Join, Concatenate, Groupby and Aggregate
2.4.1.5 Read from csv
随堂案例:bikes routes counts
2.5 数据获取与处理 多种格式数据加载、处理与存储 文本数据 Csv txt
|