目录
聚类:无监督学习中对一组训练数据按照不同的特征进行分类,不给予相关的y,只有x,可以出现多个映射y
前言
以完成iris的数据集的可视化分析及聚类分析和knn算法为例,简单介绍基本的分析方法
一、常用的数据分析库以及基本函数和相关概念的介绍
No1:matplotatplot是一款python的一个绘图库。在机器学习过程中,我们可以用它绘制损失函数图,可以使用它将数据可视化,包括折线,函数,散点,柱状,直方,等高线,3D立体图。
import matplotlib.pyplot as plt
import numpy as np
聚类:无监督学习中对一组训练数据按照不同的特征进行分类,不给予相关的y,只有x,可以出现多个映射y
权重向量:带着权值的向量,可以把向量理解为一个实际问题,而权值更像是不同影响实际问题的因素的占比重,权值越大则该因素越重要就越要重视
欧氏距离变换,是指对于一张二值图像(在此我们假定白色为前景色,黑色为背景色),将前景中的像素的值转化为该点到达最近的背景点的距离。
曼哈顿距离,取x,y轴之间的距离,类似于行车导航最短路径的问题
(欧式距离并不太适用于相似图片的对比,由于其在不同坐标轴为基准下它的距离不变不同于曼哈顿相对于不同坐标轴距离会改变,欧式距离作为k=2,曼哈顿距离k=1判别标准)
numpy库是Python的数值计算扩展。这种工具可用来存储和处理大型矩阵。
np.flatnonzero(array),返回非零元素的下标
np.array(object,dtype=np.数据类型)创建数组,理解为一维矩阵也可以,创建多维数组则用
eg:a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])这种形式
np.random.choice(object,size=None,replace=False,p=None)在给的数组矩阵或者元组列表中的数据抽取随机元素按照size的数目返回列表,replace默认值为True会产生重复值改为False作为数据集处理避免产生上述问题
np.reshape(object,(object.shape[0],-1))将object数据集转化为n维,-1是自动计算列数的矩阵,.shape是计算一维数组或者矩阵的元素个数,多维返回行数
np.sum(object,axis=xx)0是最外层相加,1是第二外层相加,以此类推返回相加后的矩阵
np.sum(l==t[i])是只要相同加1,不同加0
np.linalg.norm(x, ord=None, axis=None, keepdims=False)求矩阵范数
ord=1:表示求列和的最大值
ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根
ord=∞:表示求行和的最大值
ord=None:表示求整体的矩阵元素平方和,再开根号.axis参数 含义
0 表示按列向量来进行处理,求多个列向量的范数
1 表示按行向量来进行处理,求多个行向量的范数
None 表示整个矩阵的范数keepdims:表示是否保持矩阵的二维特性,True表示保持,False表示不保持,默认为False
np.array_split(列表数组,n)把列表数组强制拆分n组,返回array,偏向于均匀分布,split()必须均匀分布
np.vstack(array,array,...)纵向拼接叠加array,shape一定要同列可以不同行,hstack要求是行数相同
numpy.reshape(a, newshape, order='C')
np.reshape(a, (a.shape[1], a.shape[0])):转置等同于np.transpose(a)
当数据的形状不确定时,如果想转换为1行,列数不确定的话,newshape可以传入(1, -1);
如果想转换为1列,行数不确定的话,newshape可以传入(-1, 1);
同理如果是2列或者2行的话,就是(-1, 2)或者(2,-1)。 -1代表不确定
二、Knn步骤
1.导入数据集和相应的库函数
(第一张图利用plt绘图准备画布大小背景颜色并且利用jupytor的魔术工具在每次运行前自动的导入数据,第二张图是将下载好的cs231n的图片数据集导入,建立训练测试集,显示相匹配的数目即大小,比如说训练集是50000张图片按照32*32*3大小构建的array,利用的shape函数)
2.可视化数据集,每一类随机选取7张图片
(创建classes的集合,列入10种类别,每种类别随机选取对应特征的7张图片然后利用enumerate枚举函数将列表的元素和索引循环出,利用flatnonzero函数将找到训练集中对应的y的序列,函数如果括号里面条件成立则为1,否为0,因此plt_idx=(1/0)*10一行10个,
这个代码是用于绘制多个子图的,plt_idx是每个子图的位置。plt.subplot()函数需要三个参数,分别是行数、列数和位置。例如,plt.subplot(2,3,4)表示在一个2行3列的画布上绘制第4个子图。
plt_idx = i * num_classes + y + 1是一种计算每个子图位置的公式,其中i是样本编号,y是类别编号,num_classes是类别总数。+1是因为Python中的索引从0开始,而plt.subplot()函数中的位置从1开始。所以要加上1来对齐。
得到7张随机元素组成的列表,再来一层循环从而实现用plt.subplot(行,列,图片位置)利用imshow显示二值函数的同时将其格式利用astype转化为uint8的格式便于之后文件夹图片的导出,关闭轴线和标签,当i=0时候首先显示名称,最后在同一show出处理的图片)
3.随机采样数据集
(训练集采样5000张,测试集采样500张,利用shape函数转化为1行)
4.导入k近邻分类器模块
5.求解测试集和训练集欧式距离
利用2层循环求解:
可视化距离矩阵:
一行亮说明数据集的图片与训练的图片不是很像,一列亮说明测试的图片和训练的图片不是很像
knn直接预测设为1:
(取k=1时的得到的预测集与测试集利用sum求得正确匹配的数目再除以全部的测试集的数目从而得到准确率)
(创建一个以传入测试集相同维度元素为0的array,将dists格式化为0,用于循环,创建新的y列表用于放标签排序后的前k个,由于有10个标签,创建新的投票用的列表,循环closest中的元素,实际上是对应的序列号,在投票列表中+1,最后在排序求取最大的投票,从而返回预测的结果)
用k=5进行预测:
比较发现精度要大于k=1的时候
计算2层和1层循环下的结果以及用时:
(将无循环和1层循环结果作比较,利用linalg.norm函数计算矩阵的差值后的值发现两者的结果没有区别,下面同理)
发现用矢量化处理比多层循环以及广播机制要效率更高
6.交叉验证
适用于在数据很有限的时候交叉作为测试训练集进行对比,耗费太多资源且计算慢,因此在现实不经常使用
将训练集分成5等分,同时观察不同的k下的分类精度
取平均精度,绘制精度图来选取最适合精度的k值
最后最佳取k=10
个人心得:
计算机视觉核心是在于用计算机来模拟人的认知,包括图形处理,定点跟踪之类,人的大脑摄取现实生活中的信息自动处理达成交互,计算机则通过建立数据集,通过训练,即,输入大量的测试数据让计算机习得或者是更贴近于适应现实生活中的应用环境,(人多年的认知神经网络的习得完善转化为计算机10二项分布慢慢建立而来的类似于神经网络的逻辑程序相当奇特)从而实现解放部分生产力或者在高精细危险工作实现替代,急代探索的即为智能的实现,人在应对突发情况时候可以根据以往经验学识做出应急的反应,而计算机是否能理解突发的未定义概念以及做出及时的策略的算法依然提出了诸多思想,不同于人,如果要应用于社会,大众对其的容错率是相当低,传统的计算机视觉通过特征筛选数据集,以图像修理为例,修改部分数据点来实现对应特征替换对象的完全覆盖,例如边缘角点检测,以及相对误差范围的选择,而深度学习更在于基础上有更深一步的分析,考虑的因素更加多样化,数据集的特征向量筛选出子集,不仅仅是单纯线性或者概率的大小,诸如风险性多个抽象甚至于看似无太大关系的因素以数据的形式加入计算,考虑方面的多少对于确定准确度也出现了一定的限度,我个人是这样理解神经网络的层数
二:非监督学习
现实生活大多为非线性问题,区别于监督学习,探索合适算法让机器在未给予标签数据集的前提自主处理大量无标签的数据分类以及探索线性相关属性来做出预测的的决策或行为,表现出自主性创新性。
三:强化学习
其实基本的原理就像高中生物学的巴甫洛夫的狗的那个实验原理,形成条件反射。