DeepLearing学习笔记-数据矢量化
来源:互联网 发布:java游戏编程入门 编辑:程序博客网 时间:2024/05/16 05:51
背景:
通过矢量化提高矩阵运算速度
准备知识:
dot/outer/elementwise product 的区别:
dot product 点乘:
向量点积:
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
定义:
点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影。
矩阵内积:
内积是一种降维运算,变成一个数。矩阵的内积是每行每列的点积所组成的矩阵。所以,点积是一维向量之间的操作,内积是多维向量,即矩阵的操作。两者本质是一样的。其实,内积就是我们一般常用的矩阵乘积,行列进行相互乘积,作为结果矩阵指定位置的元素结果值。所以,要求a矩阵的列数量等于b矩阵的行数量。
示例代码:
x = numpy.array([1, 2])y = numpy.array([10, 20])print("Array inner:")print(numpy.inner(x, y))''' Output:Array inner:50'''x = numpy.mat([[1, 2], [3, 4]])y = numpy.mat([10, 20])print("Matrix inner:")print(numpy.inner(x, y))
Output:Matrix inner:[[ 50] [110]]
outer product 外积:
两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量,是向量的升维运算。并且两个向量的外积与这两个向量组成的坐标平面垂直。m维向量和n维向量的外积是m*n维矩阵。
定义:
矩阵外积:
假设a的维度是(m,n),b的维度是(p,q)
向量外积:
其中:
叉乘几何意义:
在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积。
示例代码:
x = numpy.array([1, 3])y = numpy.array([10, 20])print("Array outer:")print(numpy.outer(x, y))''' Output:Array outer:[[10 20] [30 60]]'''x = numpy.mat([[1, 2], [3, 4]])y = numpy.mat([10, 20])print("Matrix outer:")print(numpy.outer(x, y))
Output:Matrix outer:[[10 20] [20 40] [30 60] [40 80]]
elementwise product 元素积:
定义:
有三种情况:
第三种情况,就是两个矩阵尺寸相同,则是对应位置的元素乘积。
示例代码:
x = numpy.array([1, 3])y = numpy.array([10, 20])print("Array element-wise product:")print(x * y)
输出:
Array element-wise product:
[10 60]
矢量化操作:
循环实现矩阵运算:
import timex1 = [9, 2, 5, 0, 0, 7, 5, 0, 0, 0, 9, 2, 5, 0, 0]x2 = [9, 2, 2, 9, 0, 9, 2, 5, 0, 0, 9, 2, 5, 0, 0]#用循环来实现dot product### CLASSIC DOT PRODUCT OF VECTORS IMPLEMENTATION ###tic = time.process_time()dot = 0for i in range(len(x1)): dot+= x1[i]*x2[i]toc = time.process_time()print ("dot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")#用循环来实现outer product### CLASSIC OUTER PRODUCT IMPLEMENTATION ###tic = time.process_time()outer = np.zeros((len(x1),len(x2))) # we create a len(x1)*len(x2) matrix with only zerosfor i in range(len(x1)): for j in range(len(x2)): outer[i,j] = x1[i]*x2[j]toc = time.process_time()print ("outer = " + str(outer) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")#用循环来实现 元素之间乘积### CLASSIC ELEMENTWISE IMPLEMENTATION ###tic = time.process_time()mul = np.zeros(len(x1))for i in range(len(x1)): mul[i] = x1[i]*x2[i]toc = time.process_time()print ("elementwise multiplication = " + str(mul) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")#用循环来实现泛化的点积,即内积。### CLASSIC GENERAL DOT PRODUCT IMPLEMENTATION ###W = np.random.rand(3,len(x1)) # Random 3*len(x1) numpy arraytic = time.process_time()gdot = np.zeros(W.shape[0])for i in range(W.shape[0]): for j in range(len(x1)): gdot[i] += W[i,j]*x1[j]toc = time.process_time()print ("gdot = " + str(gdot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
执行结果:
dot = 278 ----- Computation time = 0.0msouter = [[ 81. 18. 18. 81. 0. 81. 18. 45. 0. 0. 81. 18. 45. 0. 0.] [ 18. 4. 4. 18. 0. 18. 4. 10. 0. 0. 18. 4. 10. 0. 0.] [ 45. 10. 10. 45. 0. 45. 10. 25. 0. 0. 45. 10. 25. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 63. 14. 14. 63. 0. 63. 14. 35. 0. 0. 63. 14. 35. 0. 0.] [ 45. 10. 10. 45. 0. 45. 10. 25. 0. 0. 45. 10. 25. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 81. 18. 18. 81. 0. 81. 18. 45. 0. 0. 81. 18. 45. 0. 0.] [ 18. 4. 4. 18. 0. 18. 4. 10. 0. 0. 18. 4. 10. 0. 0.] [ 45. 10. 10. 45. 0. 45. 10. 25. 0. 0. 45. 10. 25. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] ----- Computation time = 0.0mselementwise multiplication = [ 81. 4. 10. 0. 0. 63. 10. 0. 0. 0. 81. 4. 25. 0. 0.] ----- Computation time = 0.0msgdot = [ 17.02350757 18.34972831 15.85377834] ----- Computation time = 0.0ms
上述的运行结果,并没有很直观表现循环操作的耗时,这是因为测试时候选用的数据量少的缘故。
基于numpy的矢量化矩阵运算
x1 = [9, 2, 5, 0, 0, 7, 5, 0, 0, 0, 9, 2, 5, 0, 0]x2 = [9, 2, 2, 9, 0, 9, 2, 5, 0, 0, 9, 2, 5, 0, 0]### VECTORIZED DOT PRODUCT OF VECTORS ###tic = time.process_time()dot = np.dot(x1,x2)toc = time.process_time()print ("dot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")### VECTORIZED OUTER PRODUCT ###tic = time.process_time()outer = np.outer(x1,x2)toc = time.process_time()print ("outer = " + str(outer) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")### VECTORIZED ELEMENTWISE MULTIPLICATION ###tic = time.process_time()mul = np.multiply(x1,x2)toc = time.process_time()print ("elementwise multiplication = " + str(mul) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")### VECTORIZED GENERAL DOT PRODUCT ###tic = time.process_time()dot = np.dot(W,x1)toc = time.process_time()print ("gdot = " + str(dot) + "\n ----- Computation time = " + str(1000*(toc - tic)) + "ms")
运行结果:
dot = 278 ----- Computation time = 0.0msouter = [[81 18 18 81 0 81 18 45 0 0 81 18 45 0 0] [18 4 4 18 0 18 4 10 0 0 18 4 10 0 0] [45 10 10 45 0 45 10 25 0 0 45 10 25 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [63 14 14 63 0 63 14 35 0 0 63 14 35 0 0] [45 10 10 45 0 45 10 25 0 0 45 10 25 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [81 18 18 81 0 81 18 45 0 0 81 18 45 0 0] [18 4 4 18 0 18 4 10 0 0 18 4 10 0 0] [45 10 10 45 0 45 10 25 0 0 45 10 25 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] ----- Computation time = 0.0mselementwise multiplication = [81 4 10 0 0 63 10 0 0 0 81 4 25 0 0] ----- Computation time = 0.0msgdot = [ 17.02350757 18.34972831 15.85377834] ----- Computation time = 0.0ms
采用矢量化的方式执行,结果更加简洁高效(数据量大时候,更加明显)。且对于np.dot
是可以适用于矩阵或者矩阵向量的。对应元素的乘积,可以用np.multiply()
或者*
操作符。
循环方式和矢量化速度对比:
import timeimport numpy as npa = np.random.rand(1000000)b = np.random.rand(1000000)tic = time.time()c = np.dot(a,b)print(c)toc = time.time()print("vectorized version:" + str(1000*(toc-tic)) + "ms")c = 0tic = time.time()for i in range(1000000): c+=a[i]*b[i]toc = time.time()print(c)print("loop version:" + str(1000*(toc-tic)) + "ms")
运行结果如下:
250375.165705vectorized version:24.0023136138916ms250375.165705loop version:543.0543422698975ms
- DeepLearing学习笔记-数据矢量化
- DeepLearing学习笔记-损失函数
- deeplearing.ai week3 学习笔记
- DeepLearing学习笔记-Sigmoid函数的梯度
- DeepLearing学习笔记-行归一化和broadcasting
- DeepLearing学习笔记-从逻辑回归出发
- DeepLearing学习笔记-改善深层神经网络(第一周作业-2-正则化)
- DeepLearing学习笔记-改善深层神经网络(第三周- 超参数调试、正则化)
- DeepLearing学习笔记-改善深层神经网络(第一周作业-1)
- GIS学习笔记之矢量化
- ArcGIS实现矢量数据的拼接(学习笔记)
- Data Analysis学习笔记 --- python数据清洗矢量处理字符串
- DeepLearing学习笔记-Planar data classification with one hidden layer(第三周作业)
- DeepLearing学习笔记-Building your Deep Neural Network: Step by Step(第四周作业)
- DeepLearing学习笔记-Deep Neural Network在图像分类上的应用(第四周-作业2)
- DeepLearing学习笔记-改善深层神经网络(第一周作业-3-梯度校验)
- DeepLearing学习笔记-改善深层神经网络(第二周作业-优化方法)
- DeepLearing学习笔记-改善深层神经网络(第三周- 将batch-norm拟合进神经网络)
- 云管理平台实践指南
- 6、C#的算术运算符和算术表达式
- 类加载-杂
- 前端开发者必须知道的项目资源网站
- 设计模式最佳实之工厂模式
- DeepLearing学习笔记-数据矢量化
- 递归算法应用-牺牲空间换取时间
- CDN安全
- Java Applet与Java Application的区别
- 【实时计算架构系列1】WePay如何基于谷歌云平台(GCP)和kafka实现实时流式欺诈检测
- 代码重用
- Signal ()函数详细介绍 Linux函数
- eclipse 鼠标变成十字选框
- 阿里云服务器安装数据库失败?