学习:

知识点:

KNN算法:

  1. 距离度量:
    根据给定的度量,在训练集合中找出与x距离最近的k个点(k=1时即近邻算法)
  2. 分类决策规则(k>1时为KNN)
    根据分类决策规则(如多数表决,加权方法等)决定x的类别y
    总结:KNN算法三要素:K值的选择,距离度量,分类决策规则

复杂度:
训练复杂度: KNN算法只是将训练数据及训练数据及标签预先保存,并不涉及某些计算,复杂度为o(1)
测试复杂度: 对于某个样本x,需要与标签数据逐一进行对比,计算量与数据大小有关,复杂度为o(N)

线性分类器

线性分类器是最简单的一种参数模型

f(x,W)是最简单的单纯的权重矩阵W(eight)与数据x相乘,并且加上一个偏置向量b(ias),得到的结果根据大小说明分别于那一类而言的可能性

这里的线性分类器中的Bias不与训练数据交互,只是一开始人为的添加基于先验信息的偏好设置,比如训练集中某一类的数据较多,那么会是这一类的概率较大,可以设置对应的b值较大

线性分类器中的权重矩阵W就是找到一种使得对于各个训练数据与权重得到的结果中样本对应的类的值较大的一个方法,这就好像寻找并匹配数据中存在的分布,使得模板与数据相乘后符合这样的分布。

作业:

f(x, w)线性分类器与knn的区别

线性分类器是训练过程中的复杂度较高而预测过程的复杂度很低,而KNN的复杂度则反过来,这使得线性分类器可以在低耗的设备上运行

KNN的计算基本只基于距离度量,而线性分类器的计算主要基于W矩阵的匹配

线性分类器为什么可以看成一种模板匹配方法

线性分类器中的权重矩阵W就是找到一种使得对于各个训练数据与权重得到的结果中样本对应的类的值较大的一个方法,这就好像寻找并匹配数据中存在的分布,使得模板与数据相乘后符合这样的分布。

线性分类器的缺点也就是存在的问题

  1. 异或问题/奇偶问题
  2. 多分类问题
  3. L2距离范围固定的分类问题

分析代码实现的任务是什么,每个函数模块实现的功能是什么,代码运行的逻辑

编程作业

遇到的问题:

  1. 第一个cell运行就报错了,data_utils.py中的from scipy.misc import imread这句话中找不到imread,因为在新版本的scipy中,imread已经被移除了,取而代之的使用from imageio import imread

  2. 紧接着下一个cell又遇见了问题,找不到数据集,这个通过运行datasets文件夹中的”get_datasets.sh”,如果无效,则复制其中的网址手动下载放入该文件夹下后,将网址那行代码加井号注释掉再运行,就会将tar.gz压缩文件解压好,此时再运行第二cell就没问题了

  3. 第五个cell,即加载KNN分类器时又报错了,因为没有past模块,这个模块需要自己安装,令人啼笑皆非的是需要装的竟然叫future

  4. 算法基础不好的缺点显现了,找出数组中出现次数最多的一种元素,网上借鉴的有两种方法:

    1. np.argmax(np.bincount(closest_y))

    2. from collections import Counter

      Counter.most_common(1)[0][0]

  5. two_loops的代码总是非常的慢,后来发现用np.sum代替sum会节省大量的时间,果然矩阵运算还是厉害的不行

  6. 最后一个问题就在我的能力之外了,我调试了很多次,哪怕把别人的代码贴过来都没整成功,我的准确率总是不随k值改变的,令人头秃的问题

模块

  1. 加载需要的包,设置画布的属性,并添加一些需要的函数
  2. 加载数据集并打印其训练和测试集的形状
  3. 将数据集的部分数据可视化呈现出来
  4. 随机抽取一定数量的数据做成新的训练测试集,并压缩成数量上堆叠起来的一维向量
  5. 导入KNN分类器并用随机抽取的训练样本进行训练
  6. 使用两层循环的计算距离的代码进行测试
  7. 对测试结果进行可视化(亮的地方代表距离较大,暗的地方距离较小)
  8. 运行预测标签程序,使k=1并计算准确率以测试你的L2距离的函数写的是否正确
  9. 测试k=5时的准确率是否较高
  10. 分别测试你的单层循环和无循环的距离度量函数代码结果是否准确
  11. 分别计算两层循环,单层循环和无循环函数花费的时间,体现无循环对计算的优化
  12. 交叉验证过程的函数
  13. 交叉验证准确率的可视化
  14. 测试最佳k时预测的准确率