人工智能作为当前最火的一个热词,我也想紧抓一把潮流,不过人工智能设计知识面极广,很多知识点参差不齐,其实更多自学者面临的是不知道怎么入门,不知道开始学什么,嘴上说着人工智能,机器学习,深度学习,可又不太清楚自己到底搜索哪个词,从哪个技术贴开始看。
我也是一直在门外观望,期待能找到一个可以好好入门的方式。
在这里先记录这一星期学到的一些基础知识
这一概念自上世纪中期被提出之后历经不断发展到今天。机器学习是人工智能实现的一个途径,深度学习是机器学习的一个方法(神经网络)发展而来的。
1.计算机视觉,主要用于人脸识别,图像检测
注:yolo算法目标检测
自然语言处理(NLP),
1.语音识别(声纹识别,鸡尾酒效应)
2.文本挖掘
3.机器翻译MIT
1.工业机器人(几自由度机械臂)
2.家庭机器人,更具交流性
机器学习的必备要素就是足够多的数据,合适的算法,准确快速的计算力(GPU加速)。基本工作流程就是 从数据分析得到模型,用训练模型进行预测。
数据集:
一行数据称为一个样本
一列数据称为一个特征
数据类型:
- 特征值+目标值(标签)
2.只有特征值(属性)
目标值分为离散或连续
数据划分:训练集(构建模型,所以占比大),测试集(测试模型,占比小)
对数据进行缺失值、去除异常值的处理
提取出数据的特征,将图片,声音等数据转化为机器容易识别的数字特征。
“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。”
巧妇难为无米之炊。
特征提取
特征预处理
特征降维:3d---->2d
选择合适的算法对模型进行训练。
算法分类
监督学习,无监督学习,半监督学习,强化学习
定义:输入数据是由输入特征和目标值组成
In | 有标签 |
---|---|
Out | 有反馈 |
目的 | 预测结果 |
案例 | 房价预测 |
算法 | 分类:K-近邻算法,贝叶斯分类,决策树与随进森林,逻辑回归,神经网络 |
回归:线性回归,岭回归 |
定义:输入数据由输入特征值组成
In | 无标签 |
---|---|
Out | 无反馈 |
目的 | 发现潜在结构 |
案例 | “物以类聚,人以群分” |
算法 | 聚类K-means,降维 |
已知 | 训练样本data和待分类的类别 |
---|---|
未知 | 训练样本有无标签均可 |
应用 | 训练数据量过多时,监督学习效果不能满足需求,因此用来增强效果 |
根据动态学习,有点类似自平衡小车在不断保持平衡的过程。
In | 决策流程和激励系统 |
---|---|
Out | 一系列行动 |
目的 | 长期利益最大化,回报函数(只会提示你是否在朝着目标方向前进的延迟反馈) |
案例 | 阿尔法狗下棋 |
算法 | 马尔科夫决策,动态规划 |
对训练好的模型进行评估。
大多是对监督学习的模型进行评估,模型分为分类模型和回归模型。
评估结果有 过拟合和欠拟合两种。
评估标准:
我使用的是在vscode里面使用jupyter notebook,方便可以写笔记,也可以直接看到数据运行结果,在这里将使用到matplotlib/numpy/pandas这三个模块对数据进行分析。其实前期的学习感觉和爬虫类似,爬虫,数据挖掘和分析。
配置方法参考博客:
VS Code 玩转 Jupyter Notebook
matplotlib.pyplot包含了一系列类似于matlab的画图函数,它的函数作用于当前图形(figure)的当前坐标系(axes)。大概分为3个步骤:创建画布,创建图像,显示图像。
# 导入包
import matplotlib.pyplot as plt
# 创建画布(容器层)
plt.figure (figsize=(10,10))
# 创建折线图(图像层)
x=[1,2,3,4,5]
y=[17,18,44,21,34]
plt.plot(x,y)
#也可直接写成这样plt.plot([1,2,3,4,5],[17,18,44,21,34])
# 保存图像
plt.savefig("1.png")
# 显示图像
plt.show()
- 保存:plt.savefig() //图像保存要放到show前面
#某个城市13点到14点1小时内每分钟的温度变化折线图,温度范围在30~35
import random,matplotlib.pyplot as plt
# 数据准备
x = range(60)
y = [random.uniform(30,35) for i in x]#列表生成式
# 创建画布
plt.figure(figsize=(10,4),dpi=200)#figsize:画布大小,dpi:像素大小,清晰度
# 绘制图像
plt.plot(x,y)
#保存图像
plt.savefig("2.png")
# 展示图像
plt.show()
#添加自定义x,y刻度,plt.xticks(x,**kwargs),plt.yticks(y,**kwargs)
import random,matplotlib.pyplot as plt
# 数据准备
x = range(60)
y = [random.uniform(30,35) for i in x]
# 创建画布
plt.figure(figsize=(10,4),dpi=200)#figsize:画布大小,dpi:像素大小,清晰度
# 绘制图像
plt.plot(x,y)
#X,Y轴坐标
x_ticks_lable = ['13点{}分'.format(i) for i in x]
y_ticks_lable = x
plt.xticks(x[::5],x_ticks_lable[::5])
# 坐标的刻度不可以通过字符串刻度进行修改,注意先修改成数字,再用字符串进行替换
plt.yticks(y_ticks_lable[::5])
# 网格显示
plt.grid(True,linestyle = '--',alpha = 0.5)
#保存图像
plt.savefig("2.png")
# 展示图像
plt.show()
1.添加网格:
plt.grid(True,linestyle,alpha),True表示显示(可不写),第2个参数是绘制网格的方式,如虚线,第3个参数是透明度
2.加上这三行,保证中文可以正常输出
#coding:utf-8
plt.rcParams[‘font.sans-serif’]=[‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’]=False #用来正常显示负号
3.添加X,Y轴的刻度:
plt.xticks(x,**kwargs),plt.yticks(y,**kwargs),第一个参数必须是数字,如果不是,必须进行值替换
描述:
plt.xlabel(“时间”)
plt.ylabel(“温度”)
plt.title(“一小时温度变化图”,fontsize=20)
添加对象:多次plot,直接进行绘制
显示图例:plt.legend(),在显示之前,声明plot里面的具体值。
# 导入模块
import random
import matplotlib.pyplot as plt
# 数据准备
x = range(50)
y_beijing = [random.uniform(30,40) for i in x]
y_shanghai = [random.uniform(25,35) for i in x]# 再增加一条上海的温度的数据
# 创建画布
plt.figure(figsize=(8,4),dpi=100)
# 绘图两个城市的折线图,以及做好label标签表示不同的图例
plt.plot(x,y_beijing,label="北京")
plt.plot(x,y_shanghai,label="上海") # r表示红色,linestyle如果是空字符串,不会显示图像
# 添加x,y轴刻度
x_ticks_lable = ['13点{}分'.format(i) for i in x]# 构造x轴刻度标签
y_ticks_lable = x# 构造y轴刻度标签
plt.xticks(x[::5],x_ticks_lable[::5]) # 坐标的刻度不可以通过字符串刻度进行修改
plt.yticks(y_ticks_lable[::5])
#添加网格
plt.grid(True,linestyle = '--',alpha = 0.5)
# 添加描述
plt.xlabel('时间',fontsize=8) # x轴和字体大小
plt.ylabel('温度',fontsize=8) # y轴和字体大小
plt.title('上海市和北京市中午13点到14点之间的温度变化',fontsize=8) # 标题和字体大小
# 显示做好标签的图例,红蓝颜色表示区别
plt.legend(loc="best")
# 保存图像
plt.savefig('3.png') # 保存到指定目录
# 图像显示
plt.show()
注意:操作的最后一步是显示图像,倒数第二步是保存图像。
上图所示程序,如果把显示图例放在保存图像之后,再进行显示图像,是可以正常显示出图像也有左下角的北京上海的小图例的,但是保存的图像是没有左下角的那个北京、上海图例的,一定要注意这一点。
matplotlib.ptplot.subplots(nrows=1,ncols=1,**fig_kw)创建一个带有多个axes(坐标系/绘图区)的图
plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法,一个axes就是一个坐标系一个对象。
如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系中:
图示源码把之前的plt.方法()都先注释掉,以显示二者的区别。
# 4、面对对象的画图方法
import random
import matplotlib.pyplot as plt
# 数据准备
x = range(60)
y_beijing = [random.uniform(30,40) for i in x]
y_shanghai = [random.uniform(25,35) for i in x]
# 创建画布
#plt.figure(figsize=(10,4),dpi=100)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)# 一行两列
# 绘图两个城市的折线图,以及做好label标签表示不同的图例
#plt.plot(x,y_beijing,label="北京")
#plt.plot(x,y_shanghai,label="上海")
axes[0].plot(x,y_beijing,label="北京")# 坐标系1
axes[1].plot(x,y_shanghai,label="上海") #坐标系2
# 添加x,y轴刻度
x_ticks_lables = ['13点{}分'.format(i) for i in x]# 构造x轴刻度标签
y_ticks = x# 构造y轴刻度标签
#plt.xticks(x[::5],x_ticks_lable[::5])
#plt.yticks(y_ticks_lable[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_lables[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_lables[::5])
#添加网格
#plt.grid(True,linestyle = '--',alpha = 0.5)
axes[0].grid(True,linestyle = '--',alpha = 0.5)
axes[1].grid(True,linestyle = '--',alpha = 0.5)
# 添加描述
#plt.xlabel('时间',fontsize=8) # x轴和字体大小
#plt.ylabel('温度',fontsize=8) # y轴和字体大小
#plt.title('上海市和北京市中午13点到14点之间的温度变化',fontsize=8)
axes[0].set_xlabel('时间',fontsize=8)
axes[0].set_ylabel('温度',fontsize=8) # y轴和字体大小
axes[0].set_title('北京市中午13点到14点之间的温度变化',fontsize=8)
axes[1].set_xlabel('时间',fontsize=8)
axes[1].set_ylabel('温度',fontsize=8) # y轴和字体大小
axes[1].set_title('上海市中午13点到14点之间的温度变化',fontsize=8)
# 显示图像
#plt.legend(loc="best")
axes[0].legend(loc="best")
axes[1].legend(loc="best")
# 保存图像
plt.savefig('5.png') # 保存到指定目录
# 图像显示
plt.show()
能够显示数据的变化趋势、反映事物的变化情况
在4.1.1中主要讲述的就是折线图,在此不赘述。
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种数据关联或总结坐标点的分布模式
api: plt.scatter(x,y)
排列在工作列表的列或行中的数据可以绘制到柱状图中
统计/对比
api: plt.bar(x,width,allgn=‘center’,**kwargs)
width:柱状图的宽度
allgn:{‘center’,‘edge’}每个柱状图的位置对齐方式
**kwargs :color,选择柱状图的颜色
由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况。
统计,展示分布情况
api : matplotlib.pyplot.hist(x,bins=None)
bins,组距
表示不同分类的占比情况
api: plt.pie(x,labels=,autopct=,colors)
x:数据
labels:每部分名称
autopct:占比显示指定%1.2f%
color:每部分颜色
# 1.散点图
# # 数据准备
x= [1,24,5,2,5,3,54,65,7,5,74,2,22,4,5,4,65,65,5,7,5,6,45,3,]
y=[33,35,6,5,56,32,24,2,42,74,6,34,2,1,4,3,54,65,75,33,1,22,55,66]
# 创建画布
plt.figure(figsize=(20,8),dpi=100)
# 图像绘制散点图
plt.scatter(x,y)
# 图像保存
plt.savefig('6.png')
# 图像显示
plt.show
# 2.柱状图
# 准备数据
# 电影名字
movies_name={'阿甘正传','寻梦环游记','奇迹男孩','正义联盟'}
# 横坐标
x =range(len(movies_name))
# 票房数据,数据是自己乱写的。
y={43253,54364,53553,65655}
# 创建画布
plt.figure(figsize=(20,8),dpi=100)
# 绘制柱状图
plt.bar(x,y,width=0.5,color=['b','r','g','y'])
# 修改x轴的刻度显示
plt.xticks(x,movies_name,fontsize=20)
# 添加网格显示
plt.grid()
# 添加标题
plt.title("电影票房收入对比",fontsize=20)
#保存图像
plt.savefig('7.png')
# 显示图像
plt.show()
1.numpy(numerical python)是一个开源的python科学计算库,
用于快速处理任意维度的数组。
2.Numpy 支持常见的数组和矩阵操作。 对于同样的数值计算任务,使用Numpy 比直接使用python要简洁得多。
3 Numpy使用ndarray 对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
4.优势:
内存块风格–一体式存储 //支持并行化运算// 效率高于纯python代码 //
底层使用了C,内部释放了GIL
#初步显示
import numpy as np
score =np.array([[1,23,3,4,5],[2,4,3,5,6,8],[44,11,33,21,24]])
属性 | 说明 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarraay.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
#初步显示
import numpy as np
score = np.array([
[80,89,86,67,79],
[78,97,89,67,81],
[90,94,90,67,69],
[91,91,90,67,69],
[76,87,75,67,86],
[70,79,84,67,84],
[94,92,93,67,64],
[86,85,83,67,80]
])
# 属性演示
score.shape # 数组的行列
(8, 5)
score.ndim # 数组的维数
2
score.size # 数组的元素个数
40
score.itemsize # 数组中每个元素所占的字节数4
4
score.dtype # 数组的类型
dtype('int32')
1.生成数组的方法
生成0和1 的数组
·np.ones()
·np.ones_likes()
·np.zeros()
·np.zeros_like()
>>>import numpy as np
>>>zero=np.zeros([3,4])
>>>zero
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
2.从现有数组生成
np.array()深拷贝
np.asarray()浅拷贝
>>>import numpy as np
>>>a= np.zeros([3,4])
# 从现有的数组当中创建
>>>a1=np.array(a)
# 相当于索引的形式,并没有真正的创建一个新的
>>>a2=np.asarray(a)
>>>a1,a2
(array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]),
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]))
>>>a[0]=78
>>>a1
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>>>a2
array([[78., 78., 78., 78.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
3.生成固定范围数组
(1)np.linspace(start,stop,num,endpoint):生成等间隔的多少个
start, 序列的起始值
stop,序列的终止值
num,要生成的等间隔样例数量,默认为50
endpoint, 序列中是否包含stop值,默认为true
(2)numpy.arrange(start,stop,step,dtype):每间隔多少生成数据
(3)numpy.logspace(start,stop,num):生成以10的N次幂的数据
>>>import numpy as np
# 1.
>>>np.linspace(0,100,21)
array([ 0., 5., 10., 15., 20., 25., 30., 35., 40., 45., 50.,
55., 60., 65., 70., 75., 80., 85., 90., 95., 100.])
#2.
>>>np.arange(10,50,2)
array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
44, 46, 48])
#3.
>>>np.logspace(0,2,3)
array([ 1., 10., 100.])
4.生成随机数组
np.random模块
(1).均匀分布
np.random.uniform()
low ,high,size
np.random.rand()
np.random.randint()
import random
import numpy as np
import matplotlib.pyplot as plt
# 生成均匀分布的随机数
x1=np.random.uniform(0,1,100000000)
# 画图看分布状况
# 创建画布
plt.figure(figsize=(20,8),dpi=100)
# 绘制直方图
plt.hist(x=x1,bins=1000)# x代表要使用的数据,bins表示要划分区间数
#保存图像
plt.savefig('7.png')
# 显示图像
plt.show()
(2).正态分布
一个服从正态分布的随机变量的均值,决定图形的左右位置;一个是这个随机变量的方差
np.random.randn()
np.random.normal(loc=0.0,scale=1.0,size=None)
loc:float,此概率分布的均值
scale: float ,此概率分布的标准差,对应于分布的宽度
size: int or tuple of ints. 输出的shape,默认为None,只输出一个值。
np.random.standard_normal()
# 生成正态分布数据
import random
import numpy as np
import matplotlib.pyplot as plt
x1=np.random.normal(1.75,1,100000000)
# 画图看分布状况
# 创建画布
plt.figure(figsize=(20,8),dpi=100)
# 绘制直方图
plt.hist(x=x1,bins=1000)# x代表要使用的数据,bins表示要划分区间数
#保存图像
plt.savefig('7.png')
# 显示图像
plt.show()
1.eg.随机生成8只股票两周的交易日涨幅数据
两周的交易日数量为10天
随机生成涨跌幅在某个正态分布内,比如 均值0,方差 1
# 股票涨跌幅,数组索引,切片
# 直接索引
# 先对行进行索引,再进行列索引
# 高维数组索引,从宏观到微观
>>>import random
>>>import numpy as np
>>>stock_change =np.random.normal(0,1,(8,10))
>>>stock_change
array([[-1.36594426e+00, 1.46200093e+00, 9.13215542e-01,
1.14692714e+00, 1.09884372e+00, 3.16765232e-02,
6.08335502e-01, 5.38290755e-01, -1.90379441e+00,
-1.94725017e-01],
[ 2.44947204e-03, 2.81483998e-02, -1.62279486e+00,
-1.51070292e+00, 7.54557047e-01, -5.86838996e-01,
5.19210315e-01, -3.95683397e-01, 1.25462182e+00,
-6.25952974e-01],
[ 7.90748799e-04, 6.79753324e-01, -6.37851032e-01,
-2.12284676e+00, 4.24193911e-02, 1.96020430e+00,
1.32790054e+00, -1.20717718e-01, -4.18715572e-01,
-1.33086237e+00],
[ 9.64285006e-01, 1.21460410e+00, 7.41830787e-01,
-2.77707197e-01, 8.88210848e-01, -1.31238734e+00,
-3.37759344e-02, -2.31105458e-01, 1.50448499e+00,
8.99345024e-01],
[ 2.22052593e-01, -1.23050565e+00, -5.18642183e-01,
7.92137339e-01, 1.75913999e+00, -8.57013149e-01,
-7.61342247e-01, -5.43356336e-01, 1.17559103e+00,
4.45639951e-02],
[ 7.21212520e-01, 2.04394286e-01, -3.96069879e-01,
-1.50668077e-01, 2.85052065e-01, -1.97526492e-01,
-1.72041543e+00, -1.63498939e-01, 4.65590579e-01,
-6.55741840e-01],
[-1.55974000e-01, 7.05740416e-01, 8.68340637e-01,
1.63919081e-01, -9.26949387e-01, -2.38599750e+00,
-2.23651939e-01, -1.70950974e+00, 1.95574527e+00,
-5.47184974e-01],
[ 3.33567247e-01, -1.03334777e+00, -6.36157866e-01,
7.54950892e-01, 4.80523866e-01, -3.12486834e-01,
-2.70482513e-01, 1.12658193e+00, -7.70224357e-03,
-6.75504856e-01]])
# 二维数组索引
>>>stock_change[0:2,0:3] #前两行前3列
array([[-1.36594426, 1.46200093, 0.91321554],
[ 0.00244947, 0.0281484 , -1.62279486]])
# 三维数组索引
import numpy as np
a=np.array([[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81]],
[[90, 94, 90, 67, 69],
[91, 91, 90, 67, 69]],
[[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84]],
[[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]]])
>>>a[0,0,0]
80
>>>a[2,0,1]
87
2.形状修改,即数组的行列修改
(1)ndarray.reshape() :return an array containing the same data with a new shape.产生新变量,不进行行列互换。
(2)ndarray.resize():change shape and size of array in-place.对原来的值进行更改,进行行列互换。
nparray.astype(type)
ndarray.unique()
# 数组去重
>>>arr =np.array([[[1,2,13],[4,5,6]],[[12,13,140],[4,5,88]]])
>>>np.unique(arr)
array([ 1, 2, 4, 5, 6, 12, 13, 88, 140])
1.数组和数运算
2.矩阵之间的运算
np.matmul,支持矩阵之间相乘,不支持矩阵与数字相乘。
np.dot(点乘),两者都支持。
专门用于数据挖掘的开源python库,以Numpy为基础,借助numpy在计算方面性能高的又是,基于matplotlib,可以简便画图,以及本身独特的数据结构。
特点:数据处理能力高,读取文件方便,封装了matplotlib,numpy的画图和计算。
创建DataFrame:
pd.DataFrame(ndarray)
DataFrame 结构:(类比于numpy 的二维数组)
行索引:index,0轴,axis-0
列索引:columns,1轴,axis=1
start: 开始 end:结束 period: 时间跨度 freq:统计时间方式
DataFrame 属性:
shape 获取是几行几列的数组
index 行索引列表
columns 列索引列表
values 直接获取其中array的值
T 转置
head()默认看前5行
tail()默认看后5行