白话向量点积

简介: 点积(Dot Product)是机器学习中最常见的向量操作。本文将通过简洁易懂的语言配合大量图形为大家介绍点积运算及其背后的数学意义。

白话向量点积

点积(Dot Product)是机器学习中最常见的向量操作。本文将通过简洁易懂的语言配合大量图形为大家介绍点积运算及其背后的数学意义。

dot_product.jpg

背景知识

对于长度为 $n$ 的两个向量 $a$ 和 $b$,
$$ \begin{aligned} a &= [a_1, a_2, a_3,\dots,a_n]\\ b &= [b_1, b_2, b_3,\dots,b_n] \end{aligned} $$
点积可以用来表示它们之间的关系。 例如,它们指向同一个方向还是相反的方向? 它们彼此垂直吗?

两个向量进行点积运算的结果是标量,因此点积有时也称为标量积。

为了让大家建立对点积工作原理的直觉,我们从其几何定义开始。

几何视角

dot_product_01.png

点积的几何形式如下:
$$ a ⋅ b = \Vert a \Vert \: \Vert b \Vert \cos\theta $$
上面公式包含3个部分:

  • $\Vert a \Vert$: 向量 $a$ 的大小
  • $\Vert b \Vert$: 向量 $b$ 的大小
  • $\enspace\theta\enspace$: 向量 $a,b$ 之间的夹角

向量的大小

dot_product_02.png

向量长度直观看上去就是一个用勾股定理计算斜边长度。对于二维向量来说就是 $\sqrt{x^2+y^2}$,对于三维向量来说就是 $\sqrt{x^2+y^2+x^2}$ 。推而广之,$n$ 维向量的长度为
$$ \Vert v \Vert = \sqrt{v_1^2 + v_2^2 + \dots + v_n^2} $$

Cosine

dot_product_03.png

$\cos\theta$ 将向量 $a$ 投影到向量 $b$ 。上图中,向量 $a$ 和向量 $b$ 指向不同方向,所以 $\Vert a \Vert \cos\theta$ 将向量 $a$ 的一部分投影到向量 $b$ 的方向上。反过来视为将向量 $b$ 投影到向量 $a$ 也可以,

举例

dot_product_04.png

当向量之间的角度和大小已知时,几何视角很有用,如上例所示。 在这个例子中,计算点积很容易。
$$ \begin{aligned} \Vert a \Vert &= \sqrt{(-6)^2+8^2} = 10\\ \Vert b \Vert &= \sqrt{5^2+12^2} = 13\\ \theta &= 59.5°\\\\ \therefore a ⋅ b &= \Vert a \Vert \Vert b \Vert \cos\theta\\ &=10 \times 13 \times \cos(59.5) \\ &=65.9799871849 \end{aligned} $$

几何意义

上面的结果有什么意义呢?

我们都知道当两个向量指向相同方向时,它们之间的角度为 $\theta = 0°$ 或 $0$ 弧度。 这意味着 $\cos(\theta)$ 的结果为 1,此时点积最大。如果两个向量指向相反方向时,它们之间的角度为 $\theta = 180°$ 或 $\pi$ 弧度。 这意味着 $\cos(\theta)$ 的结果为 -1,此时点积最小。当 $\theta = 90°$ 或 $\pi/2$ 弧度时,$\cos(\theta)$ 的结果为 0,此时点积为0。当点积为 0 时,意味着两个向量彼此垂直或正交。

方向关系 计算结果
完全同向 $+AB$
基本同向 $\lt +AB$
垂直 $0$
基本反向 $\gt -AB$
完全反向 $-AB$

坐标视角

在坐标视角下,我们只知道向量的坐标,不知道向量间的夹角,此时点积的代数形式可以不需要角度来计算点积。在坐标视角下,只需每个向量的对应分量相乘,相加后最终结果等同于几何视角的结果。下面是点积的代数形式:
$$ a ⋅ b = [a_0b_0+a_1b_1+\dots+a_nb_n] = \sum_{i=1}^na_ib_i $$
还是用上面的例子,用坐标视角计算向量 $a, b$ 的点积
$$ a ⋅ b = (-6)\times5+8\times12 = -30+96 = 66 $$
可见结果与几何视角的计算结果非常接近,误差可以忽略不记。

两种视角的等价性

要解释两种视角的等价性,需要引入标准基(Standard basis,也叫自然基或规范基)的概念。数学上,坐标向量空间的标准基是指向量分量只有一个1,其余都为0的向量的向量。举个例子很容易理解,在平面坐标系中,标准基有 2 个向量
$$ e_x=(1,0), \quad e_y=(0,1) $$
同理三维空间中,标准基有 3 个向量
$$ e_x=(1,0,0), \quad e_y=(0,1,0), \quad e_z=(0,0,1) $$
这里 $e_x$ 与 $x$ 轴同向,且长度为1;$e_y$ 与 $y$ 轴同向;$e_z$ 与 $z$ 轴同向。

标准基可以将任意向量分解为各分量与标准基的线性组合,比如三维空间中的向量 $v$ 可以表示为:
$$ v_xe_x+v_ye_y+v_ze_z $$
其中 $v_x, v_y, v_z$ 是向量 $v$ 的分量。

标准基中的向量都是正交的且长度为单位长度1,因此正交基具有如下性质:
$$ e_i ⋅ e_i = 1\\ e_i ⋅ e_j = 0 \quad(i \ne j)\\ $$
这两个性质很好证明,大家可以自行运用上面讲过几何视角和坐标视角去证明。

有了标准基的概念后,我们可以将向量表示成分量与标准基的线性组合:
$$ a = [a_1, a_2, \dots, a_n] = \sum_{i=1}^na_ie_i\\ b = [b_1, b_2, \dots, b_n] = \sum_{i=1}^nb_ie_i\\ $$
由于标准基向量的长度都为1,即 $\Vert e_i \Vert = 1$,当向量与标准基点乘时,得到的是向量的各分量:
$$ a ⋅ e_i = \Vert a \Vert \Vert e_i \Vert \cos\theta_i = \Vert a \Vert \cos\theta_i = a_i $$
这里 $a_i$ 就是向量 $a$ 在 $e_i$ 方向上的分量。

运用分配律带入点积的几何形式,就得到
$$ a ⋅ b = a ⋅ \sum_{i=1}^nb_ie_i = \sum_{i=1}^nb_i(a ⋅ e_i) = \sum_{i=1}^nb_ia_i = \sum_{i=1}^na_ib_i $$
上面式子的结果正是点积的代数定义。 所以点积的几何形式与代数形式是等价的。

点积的作用

  1. 物理中很多量都是矢量(既有大小也有方向),这些矢量可以通过点积连接。比如:
    $$ \text{功} = (\vec{力}) ⋅ (\vec{距离}) $$

  2. 可以计算两个向量的夹角,比如:
    $$ \vec{u} = (81, -15)\\ \vec{v} = (22, 37) \\ \text{无需作图,通过代数形式可以计算得:}\\ \vec{u}⋅\vec{v} = 81 \times 22+(-15)\times37 =1227\\ \text{再根据几何形式有:}\\ \Vert u\Vert = \sqrt{81^2+(-15)^2} = 81.09\\ \Vert v\Vert = \sqrt{22^2+37^2} = 43.05\\ \Vert u\Vert \Vert v\Vert = 3491 \\ \cos\theta = \frac{\vec{u}⋅\vec{v}}{\Vert u\Vert \Vert v\Vert} = \frac{1227}{3491} = 0.351475222 \\ \theta = \cos^{-1}(0.351475222) = 69.42° $$

总结

点积是机器学习中最常见的向量操作。上面内容为了简单易懂可能在数学上有失严谨,全面严谨的讲解建议大家系统性地学习一下线性代数,这里推荐 Gilbert Strang 老爷子的 Introduction to Linear Algebra,这本书是我读过对初学者最友好的线性代数书。

目录
相关文章
|
9月前
|
安全 数据安全/隐私保护 开发者
AxureRP-Setup安装教程简单步骤Mac版(附安装包)
Axure RP是专业原型设计工具,助产品经理在编码前快速构建网页/App界面与交互流程,直观呈现产品形态。本文详解Mac端安装步骤:下载dmg、拖入应用程序、绕过macOS安全限制完成安装。(239字)
1268 3
|
10月前
|
SQL Oracle 关系型数据库
Oracle 数据塑形:行列转换与集合运算
报表要求的数据格式总是千奇百怪?其实用SQL就能让数据轻松“变形”。想把多行内容(比如各科成绩)合并成一行里的多列,可以用经典的CASE WHEN,或者在11g以上版本里用更简洁的PIVOT。反过来,把宽表拆成多行,也有UNION ALL和更方便的UNPIVOT。学会这些,再配合UNION、INTERSECT等集合运算,数据就能随心所欲地展示了。
902 14
|
Windows
windows 安装mpv player
windows 安装mpv player
531 2
|
自然语言处理 前端开发 开发者
使用 modelscope-studio 构建你的 Gradio 应用
modelscope-studio是一个基于 Gradio 的三方组件库,它可以为开发者提供更定制化的界面搭建能力和更丰富的组件使用形式。
1477 26
|
存储 关系型数据库 MySQL
Spring Boot 2.x基础教程:使用PostgreSQL数据库
Spring Boot 2.x基础教程:使用PostgreSQL数据库
3018 0
Spring Boot 2.x基础教程:使用PostgreSQL数据库
|
前端开发 JavaScript 开发者
超实用开源前端商城模板,助力电商项目飞速启航!免费直接可用!
分享一款精心设计的开源前端商城模板,涵盖商品展示、购物车、订单处理、用户登录注册等核心功能,使用HTML、CSS、JS和jQuery构建,结构清晰,适合新手和资深开发者,助力电商项目快速启动。
1438 0
超实用开源前端商城模板,助力电商项目飞速启航!免费直接可用!
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
1962 4
|
存储 监控 Java
使用Elasticsearch实现全文搜索的最佳实践
使用Elasticsearch实现全文搜索的最佳实践
|
Java
Java实例详解
Java实例是通过类创建的对象,其核心在于将抽象的类定义转化为具体的实体。类作为对象的模板定义了属性和行为,而实例则是这些定义的具体实现。通过`new`关键字可以创建实例,并利用点运算符访问其属性和方法。实例拥有自己的生命周期,从创建到使用直至被垃圾回收机制自动清理。此外,实例变量和静态变量的区别在于前者属于单个实例,后者则为所有实例共享。理解Java实例的概念及其管理对编程至关重要。
902 15