人工智能&机器学习&深度学习【了解】
人工智能实现的途径之一——机器学习
机器学习的方法之一——深度学习
人工智能主要分支【了解】
计算机视觉(CV)
语音识别
文本挖掘/分类
机器翻译
机器人
人工智能必备三要素【了解】
数据
算法
计算力
cpu与gpu【了解】
cpu – IO密集型
gpu – 计算密集型,以千为单位。
从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
数据:
在数据集中一般:
一行--------->一个样本(数据库中叫记录。)
一列---------->一个特征 (数据库中叫属性)
目标值(标签值)——要干的事情就是目标值。分类结果或回归值。
数据类型构成:
数据类型一:特征值+目标值(目标值是连续的和离散的)
数据类型二:有特征值,无目标值
数据分割:
机器学习一般的数据集会划分为两个部分:
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
训练集:70% 80% 75%
测试集:30% 20% 25%
使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果。
内容:
算法分类的依据:训练模型数据集类型。
根据数据集不同:
定义:
输入数据右特征值和目标值(标签)组成
输出结果:
连续——回归
离散——分类
In:有标签,Out:有反馈
目的:预测结果
案例:猫狗分类,房价预测
分类 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
回归 线性回归、岭回归
1.1 回归问题
1.2 分类问题
定义:
输入数据只有特征值,无标记。
样本数据类别未知,需要根据样本间的相似性对样本集进行分类(聚类,clustering)试图使类内差距最小化,类间差距最大化。
In:无标签,Out:无反馈
目的:发现潜在结构
案例:“物以类聚,人以群分”
聚类 k-means,降维
定义:
训练集中同时包含标记样本和未标记样本。
没有训练数据,建立模型时通过人为设定好模型可以操作的规则,根据规则不断的进行自我尝试——比如:下棋。
根据动态数据
主要关注四个元素:agent,environment, action, reward
按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。
目的:看模型的表现是否达到预期,衡量模型质量。
1. 分类模型评估
混淆矩阵(二分类模型):
A:正例 ,B:假例
预测值, 真实值
指标:
** 2. 回归模型评估**
预测值和真实值平均接近程度。
过拟合、欠拟合发生的情况
Ipython网页加强版
优:
一边写代码,一边调试。按块运行代码 cell
支持makdown 文档。
文件格式:.jpynb
可连接远程服务器(可处理大型数据集) 在本地写代码,远程执行。
和pycharm相比在绘图和数据处理方面更有优势。
命令模式:按ESC进入
Y,cell切换到Code模式
M,cell切换到Markdown模式
A,在当前cell的上面添加cell
B,在当前cell的下面添加cell
双击D:删除当前cell
Z,回退
L,为当前cell加上行号
编辑模式:按Enter进入
多光标操作:Ctrl键点击鼠标(Mac:CMD+点击鼠标)
回退:Ctrl+Z(Mac:CMD+Z)
重做:Ctrl+Y(Mac:CMD+Y)
补全代码:变量、方法后跟Tab键
为一行或多行代码添加/取消注释:Ctrl+/(Mac:CMD+/)
屏蔽自动输出信息:可在最后一条语句之后加一个分号
容器层
Canvas – 画板
是底层实现,不需要关注
Figure – 画布
在使用之前,每次都需要进行实例化
axes – 坐标系(绘图区域)
数据的绘图区域
辅助显示层
主要作用添加坐标轴描述,标题等内容。
主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
图像层
设定要画一个什么样的图像:plot,scatter…
机器学习数据:文件csv
mysql:性能瓶颈(数据量增大时读取速度受限)格式不符合机器学习要求的格式。
notes:
文件路径要加双引号
figsize 不是函数,figsize=(x,y)
合并多个cell: 选中需要合并的cell —>shift+m
绘图三部曲:
range(60) #
random.unform(15,18)
列表生成式:y = []
y = [random.uniform(15,18) for i in x] —》不写成列表形式肯定会错!!!
辅助显示:
一. 添加描述信息
二. 添加坐标轴刻度
三. 添加网格线
四.每种线和label都可以设置颜色——c=
绘制多条折线图
一个画布,一个绘图区域。
调几次plot就在画布上画几根线,最好指定颜色和名字。
图列显示位置:
best : 右上角
upper left
upper right
lower right
lower left
right
center left
**多个坐标系显示 **
plt.subplots(nrows=, ncols=,第几个)
???
fig ,ax = plt,subplots(nrow,ncol,figsize=(x,y)) # 返回值有两个
折线图(plot): 观察数据的变化趋势
散点图(scatter):研究数据分布规律,离群点的观察
柱状图(bar):
plt.bar(x,y,width,align,)
直方图(hist):
饼图:
## numpy
适用于科学计算
pandas :读取工具, numpy:快!
python:动态语言,GIL(全局解释性锁)——慢。
静态语言:
静态语言是在编译时,变量的数据类型即可确定 的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。
例如:C++、Java、Delphi、C#等。
动态语言:
动态语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。
例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。
动静、强弱是两个概念!!!
强类型语言:
一旦变量的类型被确定,就不能转化的语言。实际上所谓的貌似转化,都是通过中间变量来达到,原本的变量的类型肯定是没有变化的。
弱类型语言:
变量的类型是由其应用上下文确定的。比如语言直接支持字符串和整数可以直接用 + 号搞定。当然,在支持运算符重载的强类型语言中也能通过外部实现的方式在形式上做到这一点,不过这个是完全不一样的内涵
通常的说,java/python都算是强类型的,而VB/Perl/C都是弱类型的.
不过相比于动态/静态语言的分类,强类型/弱类型更多的是一个相对的概念。
numpy : 释放 GIL,真正并行。
python:为了数据的安全——加GIL锁。一开始问题并未暴露。到很多框架都成熟后才发现问题。(历史遗留问题)
简介
ndarray
numpy提供的n维数组类型,描述相同类型元素集合。
生成numpy对象:np.array()
nadrray的属性
ndarray.shape # 返回值类型为一个元组(元素个数)、(行,列)、(层、行、列)
ndarray.ndim # 返回值类型为一个整数
ndarray.size #
ndarray.itemsize
ndarray.dtype
nadrray的形状
nadrray的类型
ndarray基本操作
1.1 生成全0或全1的数组
np.ones([2,3]) # 2行3列1
np.zeros([2,3])
np.ones_like(a) # 生成和a相同type的,全1数组。
np.zeros_like(a)
1.2从现有数组生成
np.array([
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]],
[[7,8,9],[4,5,6]]
])
a1 = np.array(a)
a2 = np.asarray(a)
array&asarray
asarray:会随a的改变而改变
array不会。
1.3 生成固定范围的数组
得到的都是一维数组:
np.linspace(start,stop,num,endpoint) # num:取元素个数。
numpy.arange(start,stop, step, dtype) # step:步长 ,后一个数减去前一个数=step。 最后一个不取
numpy.logspace(start,stop, num,base=2) # 生成等比数列。base=2: base:指定等比数列比列。
np.logspace(1,10,10,base=2)
从1得2次方,取到10的2次方。
np.logspace(1,10,20,base=2)
array([ 2. , 2.77730229, 3.85670399, 5.3556164 ,
7.43708284, 10.32751358, 14.34131354, 19.91508143,
27.65510059, 38.40328703, 53.32876841, 74.05505519,
102.836637 , 142.80421347, 198.30523421, 275.37679007,
382.40229418, 531.02338276, 737.40622722, 1024. ])
1.4 生成随机数组
np.random
(1) 均匀分布 —— 在一个范围内随机抽数,抽到该范围的每个数的概率都是相等的。
均匀分布直方图:
x = np.random.uniform(1,100,1000000)
plt.figure(figsize=(20,8))
plt.hist(x,bins=10000) # 把1-100分程10000个区间,统计落到每个区间的数个数
plt.show()
(2) 正态分布——在期望附近概率越大。
直方图——一分一档。
标准差、方差 衡量数据离散程度。
x = np.random.standard_normal((1000000))
plt.figure(figsize=(20,8))
plt.hist(x,bins=10000) # 把1-100分程10000个区间,统计落到每个区间的数个数
plt.show()
一维:
[起始:结束:步长]
二维:
[行 , 列 ]---------》[起始:结束:步长 ,起始:结束:步长] note:步长为1就是连着取,步长为2就是隔一个取一个。
[0 , : ]
[2:8:2, :]
三维:
[层,行,列]
note: 在panda中不能这样(仅一维不会报错)
…
b’\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00\x1c@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00"@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00&@\x00\x00\x00\x00\x00\x00(@’
s = temp.tostring()
用一变量去保存。在网络中传输等等…
转换回来:
np.frombuffer(s)
[] : 切片 。前闭后开。
data[逻辑判断结果矩阵]------->取出结果为True的元素---->组成一个列表
2. np.all()
3. np.any()
4. np.where() : 用于数据替换
5. 复合逻辑:
1. np.logical_and(多个条件运算)
2. np.logical_or(多个条件运算)
eg:
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
np.where(np.logical_or(temp > 0.5, temp < -0.5), 1, 0)
1. 统计指标
求每一行的最大值:
np.max(temp,axis=1) # temp 一个ndarray , axis = 0按列
求每一行(例)中位数。
m x n ✖ n x w
性质:
1. 数组与标量---------->每个元素与对应标量加减乘除
arr + 1 ----->每个元素都加1
arr_2 = np.linspace(1,12,12).reshape((2,6))
2. 同型数组相加减乘除------->对应元素相加减乘除
3. 不同型数组相加减乘除------->广播机制转化成两个同型数组加减乘除
当操作两个数组时,numpy会逐个比较他们的shape,只有满足以下两个条件之一才能进行运算。
如:
(2,3,1)
& (1,3)
可以进行计算!
API
举证惩罚
适用于数据集的处理
简介
Panda优势:
numpy中定义一个数组-------->用一个个中括号来表示[[1,2,3],[3,4,5]]
缺点:
让数据更有意义的显示:
pd.DataFrame(数据) ------->将数组转换成DataFrame类型之后会增加行索引(index)和列索引(columns)
行索引和列索引默认为从0开始递增的整数。
0 1 2 3 4
0 0.456165 0.412092 -0.423105 0.975382 -0.979893
1 -0.908583 2.169640 -0.215136 -0.588375 -1.010057
创建DateFrame
生成一个dataframe:
notes:
# 添加列索引(按天递增,除去周末)
# 创建列索引序列
col = pd.data_range('2019-01-01','2019-06-06', period = data.shape[1],freq = 'B')
data = pd.DateFrame(old_data,index= ,columns = col)
#
date_range(start=None,end=None, periods=None, freq='B')
start:开始时间
end:结束时间
periods:时间天数
freq:递进单位,默认1天,'B'默认略过周末
DataFrame结构:
DataFrame结构:
DataFrame索引设置:1. 修改行列索引值——构造新索引序列,重新赋值。
index = ['第'+ i + ‘行’ for i in range(data.shape[0]) ]
data.index = index
note: 绝不能直接修改某行或某列索引值。
但是能直接得到某行某列索引。
data.index[3] = ‘第四行’ (×)
*2. 重置行索引:data.reset_index()
3. 以某列值设置为新的行索引:set_index(keys, drop=True)
df.set_index(‘month’,drop=“Flase”) 把month作为索引,并保留month
若要重置例索引可结合转置
mlt = data.set_index( [‘month’,‘year’] )
mlt .index
levels:[ [索引1对应的所有可能取值], [索引2对应的所有可能取值] ] 从小到大排列后,剔除所有重复的值。
codes:[ [],[] ]
names: [‘索引1’ , ‘索引2’]
# 把某些列设置为新索引
res = df.set_index(['month', 'year']) # 两个索引放在一个列表中
res.index
MultiIndex(levels=[[1, 4, 7, 10], [2012, 2013, 2014]],
codes=[[0, 1, 2, 3], [0, 2, 1, 2]], # 第一行的月份,在levels中的下标为0.....,第一行的年份,在levels的第零个位置...第三行2013年,在levels中年份的下标为1处。
names=['month', 'year'])
DataFrame:二维数据容器
Panel:三维数据容器
新版本已弃用!
DataFrame:二维数据容器
Seriese:一维数据容器
一般对应DataFrame中一列。
无列索引。
构成:
创建series
获取series值
loc – 先行后列,是需要通过索引的字符串进行获取
data.[‘行’,‘列1:‘列2’] ------ >一个中括号,用 ‘逗号 ’隔开,支持切片,也可以传数组
data['2019-01-01'] # 列索引直接取一列
data['第0行'] # 拿不到第0行,还会报错。
# data.loc[ 行, 列 ], 支持切片。
data.loc[:'第2行',:'2019-01-03 ']
# data.iloc[]
data.iloc[:3,2:4]
# 2019-01-03 00:00:00 2019-01-04 00:00:00
# 第0行 1.735143 -2.720271
# 第1行 -0.063767 -0.495603
# 第2行 -0.932807 0.887615
# data.ix[]
data.ix[:1,:'2019-01-03 ']
data['age'].add(1)
逻辑运算返回的结果为逻辑结果:True\False
逻辑运算符:
/><|&
data[(data[‘p_change’] > 2) & (data[‘open’] > 15)] (使用了布尔索引取值)
逻辑运算函数:
data.describe() # 返回data每一列对应的所有常用统计运算。------在每一列上把所有的常用统计运算都做一遍。
describe:
min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差),mode(众数),prod(累乘),idmax(最大值下标),idmin(最小值下标)
对于单个函数去进行统计的时候,坐标轴还是按照这些默认为“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)
np.max(索引(0,1,2,3,…),axis = 1) # axis = 1 : 按行运算
函数 作用
cumsum 计算前1/2/3/…/n个数的和
cummax 计算前1/2/3/…/n个数的最大值
cummin 计算前1/2/3/…/n个数的最小值
cumprod 计算前1/2/3/…/n个数的积
notes:
# 按照索引(时间)排序
temp = data.sort_index()
res = temp['price_change'].cumsum()
# 绘制折线图
res.plot()
plt.title('股票价格变化图')
plt.show()
我们的数据大部分存在于文件中,所以pandas会支持复杂的I/O操作。
1.1 read_csv
1.2 to_csv
无./data/test.csv时会新建,已有文件./data/test.csv时,默认会覆盖掉原来的数据。
数据集群中要使用的文件,二进制 、表格…
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
1. read_hdf5
eg: day_eps_ttm = pd.read_hdf("./data/stock_data/day/day_eps_ttm.h5")
2. to_hdf5,需要指定关键字
eg :day_eps_ttm.to_hdf("./data/test.h5", key=“day_eps_ttm”)
3. 再次读取,需要指定关键字名字
eg : new_eps = pd.read_hdf("./data/test.h5", key=“day_eps_ttm”)
拓展:
优先选择使用HDF5文件存储
json : 文本文件