三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算
本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑。具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布。同时课程通过腾讯课堂(百纳公开课)进行视频直播.欢迎参与学习.
在CS231N的第二课,k-nearest neighbor这部分中,核心就是计算训练集与测试集之元素之间的欧氏距离。课后作业要求从训练集取5000个图像,测试集取了500个图像,计 算这5000个用于训练的图像与500个用于测试的图像之间的欧氏距离,其结果就是一个5000*500的距离矩阵。
课后作业总共留了三道关于距离矩阵的计算题,分别是由易到难,从使用二重循环到不使用循环。特别是不使用循环的方法,需要一点数学基础,不是特别直观。经过研究《Numpy/Scipy Recipes for Data Science: Computing Nearest Neighbors》之后,决定把其中的方法写出来。
任务定义
给定
计算方法
这里提供4种方法,需要使用到以下Python库:
import numpy as np
import numpy.linalg as la
第一种方法:使用两重循环
def compute_squared_EDM_method(X):# determin dimensions of data matrixm,n = X.shape# initialize squared EDM DD = np.zeros([n, n])# iterate over upper triangle of Dfor i in range(n):for j in range(i+1, n):D[i,j] = la.norm(X[:, i] - X[:, j])**2D[j,i] = D[i,j] #*1
return D
由于是计算矩阵自身行向量之间的距离,所以结果是一个对称的三角矩阵。注意*1行代码处所做的优化。
在上述方法中我们使用了两层循环,因此代码虽不简洁,但十分易懂。
第二种方法
在第一种方法中,我们使用了numpy的norm这个方法,这个方法从数学上讲,其计算公式是:
然后我们又将这个计算结果平方后赋给
因此,我们实际上是在计算:
上述运算可以使用点积(即矩阵内积)来计算:
D[i,j] = np.dot(X[:,i]-X[:,j],(X[:,i]-X[:,j]).T)
现在代码变化为:
def compute_squared_EDM_method2(X):# determin dimensions of data matrixm,n = X.shape# initialize squared EDM DD = np.zeros([n, n])# iterate over upper triangle of Dfor i in range(n):for j in range(i+1, n):d = X[:,i] - X[:,j]D[i,j] = np.dot(d, d)D[j,i] = D[i,j]return D
第三种方法:避免循环内的点积运算
注意在上面的方法中,dot运算被调用了
这里
格拉姆矩阵的求法很简单,只需要:
现在代码变为:
def compute_squared_EDM_method3(X):# determin dimensions of data matrixm,n = X.shape# compute Gram matrixG = np.dot(X.T, X)# initialize squared EDM DD = np.zeros([n, n])# iterate over upper triangle of Dfor i in range(n):for j in range(i+1, n):d = X[:,i] - X[:,j]D[i,j] = G[i,i] - 2 * G[i,j] + G[j,j]D[j,i] = D[i,j]return D
第四种方法:避免循环
假设距离矩阵可以表示为
这里H中第i行的每一个元素,取值都为
H = np.tile(np.diag(G), (n,1))
此外,由于
现在,代码不再需要循环了:
def compute_squared_EDM_method4(x):m,n = X.shapeG = np.dot(X.T, X)H = np.tile(np.diag(G), (n,1))return H + H.T - 2*G
扩展:任意行(列)同秩矩阵间的距离矩阵计算
上述方法解决了矩阵自身(列)向量之间的距离矩阵运算问题。对CS231N第二讲的课程作业来说,需要求解的问题是:
给定训练矩阵A为
更一般地,这个问题可以描述如下:
给定矩阵A为
为方便讨论,我们将上述各项分别记为H, M, N, K,即:
显然上述公式是无法进行运算的,因为除了M与D外,其它矩阵的秩各不相同。所以我们要回到前一个数学表达式上。
- H对D的贡献是对于D的每一行,都加上
- K对于D的贡献是对于D的每一列,都加上
- M和N互为转置矩阵。即对
,要减去矩阵元素,而这个元素就是
因此,可以在numpy中运用broadcasting机制,通过矩阵与行向量、列向量的运算传播机制(broadcasting)来完成计算
def compute_distances_no_loops(A, B):m = np.shape(A)[0]n = np.shape(B)[0]dists = np.zeros((m, n)) # 求得矩阵M为 m*n维M = np.dot(A, B.T)# 对于H,我们只需要A.A^T的对角线元素,下面的方法高效求解(只计算对角线元素)# 结果H为m维行向量H = np.square(A).sum(axis = 1)#结果K为n维行向量.要将其元素运用到矩阵M的每一列,需要将其转置为行向量K = np.square(B).sum(axis = 1)#H对M在y轴方向上传播,即H加和到M上的第一行,K对M在x轴方向上传播,即K加和到M上的每一列D = np.sqrt(-2*M+H+np.matrix(K).T)return D
谈谈Numpy的broadcasting
在numpy中,当一个数与矩阵相加时,实际上是将矩阵中的每一个元素都加上这个数。注意在矩阵代数里,这种相加是不允许的。但实际应用中又很常见,所以Numpy就扩展了这个定义,允许一个实数矩阵相加,这就是broadcasting。
broadcasting在工程中是非常实用的。在第四种方法中,没有使用 broadcasting机制,它是先取格拉姆矩阵的对角线元素(是n维列向量),再通过np.tile运算将其扩展为一个
下面是broadcasting的规则:
- 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
- 输出数组的shape是输入数组shape的各个轴上的最大值
- 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
- 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。
这里看一个例子:
C = np.arange(0,3)
D = np.arange(0, 40, 10).reshape(-1,1)
这样生成的C和D分别是3维行向量和4*1阶矩阵。
>>> C
array([0, 1, 2])
>>> D
array([[ 0],[10],[20],[30]])
如果计算C+D,结果如何?
- 让输入数组向shape最长(维度最高)的数组看齐,shape中不足的部分都通过在前面加1补齐。这里D是二维数组,所以C被reshape为 array([[0,1,2]])。
- 根据规则2,确定运算的输出数组维度为4*3。
- C与D都有一个轴同秩,所以可以计算。
- 将D沿 axis = 0的方向(即列方向)从上到下,逐一加上C的元素。依次得到 [0,1,2],[10,11,12]...[30,31,32]
课程导航
上一课:斯坦福CS231N课程学习笔记(二).理解CIFAR-10图像数据库
下一课
三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算相关推荐
- 学习笔记——Kaggle_Digit Recognizer (KNN算法 Python实现)
本文是个人学习笔记,该篇主要学习KNN算法理论和应用范围,并应用KNN算法解决Kaggle入门级Digit Recognizer,也是个人入坑ML和Kaggle的开端,希望能够有始有终. KNN算法 ...
- 图像坐标:我想和世界坐标谈谈(A) 【计算机视觉学习笔记--双目视觉几何框架系列】
玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记>双目视觉数学架构系列博客.这个系列博客旨在捋顺一下已标定的双 ...
- python矩阵左除_matlab学习笔记
Matlab学习笔记 运算: 1. 算术运算(在矩阵意义下进行) +:要求矩阵同型,对应元素相加减,如果用标量和矩阵相加减,不同型就凉凉提示错误,那就将矩阵每个元素和数字相加减 -:同上 *: ...
- 使用Excel分析数据学习笔记之 二分类与混淆矩阵
使用Excel分析数据学习笔记之 二分类与混淆矩阵 混淆矩阵的构成: e.g.1:Bombers and seagulls 案例背景 混淆矩阵 如何根据混淆矩阵得到ROC曲线? 如何设定最佳阈值(op ...
- Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践
文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...
- 【学习笔记】多项式相关算法
[学习笔记]多项式相关算法 手动博客搬家: 本文发表于20181125 13:19:28, 原地址https://blog.csdn.net/suncongbo/article/details/844 ...
- Boost库学习笔记(二)算法模块-C++11标准
Boost库学习笔记(二)算法模块-C++11标准 一.综述 Boost.Algorithm是一系列人通用推荐算法的集合,虽然有用的通用算法很多,但是为了保证质量和体积,并不会将太多通用算法通过审查测 ...
- 【学习笔记】目标检测算法总结
[学习笔记]目标检测算法总结 说明 MacOS操作系统. MindNote思维导图软件. B站学习视频+原论文学习. 初学者 笔记 如有问题请多多指教 记录 Overfeat模型.R-CNN.Fast ...
- C++ Primer 学习笔记 第十章 泛型算法
C++ Primer 学习笔记 第十章 泛型算法 336 find函数 #include <iostream> #include <vector> #include <s ...
最新文章
- fftw_plan_dft_2d优化
- 他奶奶的,我要再不写技术文章,找工作都没有说服力!
- ubuntu下载软件安装包
- MyBatis 实际使用案例-plugins
- html dot标签,html – CSS Dot符号命名约定
- Behave用户自定义数据类型
- 【待完善】MongoDB - 数据模型
- sqlite简单笔记
- 防护IOS APP安全的几种方式(详解)
- 2013年下半年 系统分析师 案例分析真题
- 08Spring Boot自定定义配置
- 实战案例:抽屉自动点赞与爬取汽车之家新闻
- android横竖屏切换布局闪退,Android 横竖屏切换以及横屏启动闪退问题
- 四电极体脂称解决方案——测量原理
- 登陆163邮箱 验证邮箱帐号密码是否正确
- 百度云 不限速 | 2019 最好用下载工具
- Android Studio连接使用第三方模拟器
- python中标点符号大全及名字_标点符号大全及名字0919.史上最全标点符号英语读法...
- yxc_第一章 基础算法(三)_离散化
- 计算机培训班价格多少钱?