CS231n

2 K-Nearest Neighbors note ---by Orangestar

1. codes:

import numpy as np
class NearestNeighbor:
def __init__(self):
pass def train(self, X, y):
"""X is N × D where each row is an example.
Y is l-dimension of size N """
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y def predict(self, X):
"""X is N × D where each row is an example we wish to predict label for"""
num_test = X.shape[0]
# lets make sure that the output type matches the input type
Tpred = np.zeros(num.test, dtype = self.ytr.dtype) # loop over all test rows
for i in xrange(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances)
# get the index with smallest distance
Ypred[i] = self.ytr[min_index]
# predict the label of the nearest example return Ypred

2.

缺点:训练的时间复杂度是O(1),而预测的时间复杂度是O(N)

当然,这个算法还可以选择选取K个最近的点,然后加权投票

http://vision.stanford.edu/teaching/cs231n-demos/knn/

这个网站给出了一个直观的K与图形的关系

这也是其中一个decision boundary

当然,除了用L1(Manhattan)distance

$d_1(I_1,I_2) = \sum_p|I_1^p - I_2^p| $

还可以用L2(Euclidean)distance

\(d_2(I_1,I_2) = \sqrt{\sum_p(I_1^p - I_2^p)^2}\)

--曼哈顿距离和欧氏距离

注意:Manhattan distance 容易受到坐标轴的影响

总而言之,这些要人为决定的参数叫做超参数Hyperparameters

还有就是,如何选择L1还是L2呢?

这很难回答。但是如果与坐标轴有关的话,可能是L2更好,因为L1有坐标依赖。

但是没有坐标依赖的话可能是L1更加好一点。

当然,最佳方法是两个都尝试一下。看一下哪个更好。

下面总结一下如何选择超参数:

  1. 不要盲目选择在训练集中表现最佳的超参数。因为这样可能会过拟合。导致低方差高偏差。

  2. 可以将训练集划分。像机器学习上的一样。但是不要划分仅仅2个,训练集和测试集。这样看起来合理,其实很容易对测试集产生依赖性。

  3. 更好的方法是,把测试集(training),测试集(test),验证集(validation)

总结一下,我们通常的做法是:

训练集上用不同超参数来训练算法,然后在验证集上进行评估,然后选择表现最好的超参数。最后的最后,我们在测试集上跑一下,当然,这也是我们要写到报告的数据,这样可以保证你的数据并没有造假。

当然。我们还可以用交叉验证集。cross-validation: split data into folds

这一般在小数据集上用的多,在深度学习不是很常用。

它的基本理念是:我们取出测试集数据,我们将整个数据和往常一样,保留部分数据作为最后使用的测试集,对于剩余的数据集,我们不是把它们分成一个训练集和一个验证集,而是分成很多(folds)份。在这种情况下,我们轮流将每一份都当做一个验证集,然后对每一份进行循环。这样你就会更有信心知道那组超参数的表现更加稳定。

但事实上,我们在深度学习的时候,因为计算量十分大,所以一般不采用!

经过交叉验证方法。会得到这样一组图:

我们可以观察不同的情况下的方差来判别哪一种情况对我们更好。

(一般情况下机器学习都要这样做,画出一个超参数和误差的图)

但是!!KNN基本上不会用到上面提到的问题。

原因是

  1. 它测试时的运算时间很长!
  2. 用欧几里得距离或者L1这样的衡量标准在用在比较图像上很不合适!

如图:

never used!太惨了

KNN算法还有一个问题:

称之为 :---维度灾难

因为可能样本之间相距很远,所以可能需要用大量的数据和高维度。

cs231n__2. K-nearest Neighbors的更多相关文章

  1. [机器学习系列] k-近邻算法(K–nearest neighbors)

    C++ with Machine Learning -K–nearest neighbors 我本想写C++与人工智能,但是转念一想,人工智能范围太大了,我根本介绍不完也没能力介绍完,所以还是取了他的 ...

  2. K Nearest Neighbor 算法

    文章出处:http://coolshell.cn/articles/8052.html K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KN ...

  3. 快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors

    What is FLANN? FLANN is a library for performing fast approximate nearest neighbor searches in high ...

  4. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  5. Approximate Nearest Neighbors.接近最近邻搜索

    (一):次优最近邻:http://en.wikipedia.org/wiki/Nearest_neighbor_search 有少量修改:如有疑问,请看链接原文.....1.Survey:Neares ...

  6. K nearest neighbor cs229

    vectorized code 带来的好处. import numpy as np from sklearn.datasets import fetch_mldata import time impo ...

  7. K近邻(K Nearest Neighbor-KNN)原理讲解及实现

    算法原理 K最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本 ...

  8. K-Means和K Nearest Neighbor

    来自酷壳: http://coolshell.cn/articles/7779.html http://coolshell.cn/articles/8052.html

  9. sklearn:最近邻搜索sklearn.neighbors

    http://blog.csdn.net/pipisorry/article/details/53156836 ball tree k-d tree也有问题[最近邻查找算法kd-tree].矩形并不是 ...

  10. K临近算法

    K临近算法原理 K临近算法(K-Nearest Neighbor, KNN)是最简单的监督学习分类算法之一.(有之一吗?) 对于一个应用样本点,K临近算法寻找距它最近的k个训练样本点即K个Neares ...

随机推荐

  1. 学习记录-Python的局部变量和全局变量

    目录 1 定义 2 作用域的重要性 2.1 全局作用域中的代码不能使用任何局部变量 2.2 局部作用域中的代码可以访问全局变量 2.3 不同局部作用域中的变量不能相互调用 2.4 在不同的作用域中,可 ...

  2. Podman容器基础(二)

    Podman容器技术基础(二) 目录 Podman容器技术基础(二) 容器的使用 用户操作 用户配置文件 容器卷 容器的使用 运行一个容器 [root@cent1 ~]# podman pull ht ...

  3. RMarkdown进阶操作

    技术背景 Markdown大家都比较熟悉了,特别是在写程序文档和写数学公式时,拥有着无与伦比的便利性.同时在前面的一篇博客中我们介绍了使用RMarkdown去写Latex Beamer演示文档的方法, ...

  4. Double数据运算过程中精度调整

    Double数据进行运算时,容易出现多位小数的精度问题 ①问题现象 ②解决方案 使用BigDecimal类型来进行Double类型数据运算 创建BigDecimal类型对象时将Double类型的数据转 ...

  5. Vue学习之--------计算属性(2022/7/9)

    文章目录 1.计算属性 1.1 计算属性实现 1.1.1 基础知识 1.1.2 代码实例 1.1.3 测试效果 1.2 计算属性简写 1.2.1 简写代码 1.3 使用插值语法实现 1.3.1 代码实 ...

  6. Vue学习之---浏览器本地存储(8/17)

    博客园(纯干货):https://www.cnblogs.com/zheng-yuzhu/ 文章目录 1.基础知识 2.代码实例(localStorage.html) 3.测试效果 4.代码实例(se ...

  7. 同一台电脑安装两个不同版本的mysql。简单暴力有效

    1.先找到mysql的安装地址.找到my.ini 2.修改端口号(mysql默认端口是3306)我这里修改为3307 3.打开服务.找到刚刚修改的mysql版本 4.重新启动该服务(我已经安装了mys ...

  8. 9_Vue事件修饰符

    概述 首先需要理解下什么是事件修饰符 常用事件修饰符 案例1_阻止默认行为发生 我这里有一个a标签 这个标签呢我会给它配置一个点击事件 点击事件输出一句话,那么效果是这样的 代码 <body&g ...

  9. SpringBoot3.x原生镜像-Native Image尝鲜

    前提 Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了.在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framewor ...

  10. python中while循环

    # 1. print('1.我在学python 输出5遍') print('我在学python'*5) print('我在学python\n'*5) # 只能做单一重复 不能做线性 # 2.while ...