配套视频课程:www.bilibili.com/video/BV1Rx…
一、数组与几何维度
1、数组维度
在计算机中,我们可以定义一维数组,二维数组,三维数组,N维数组,比如可以使用Python定义如下数组:
# 定义一维数组,即Python的列表,为6个元素
array_1d = [1,2,3,4,5,6]
# 定义二维数组,一共3行5列,共15个元素
array_2d = [
[11,12,13,14,15],
[21,22,23,24,25],
[31,32,33,34,35]
]
# 定义三维数组,一共4个3行5列,共60个元素
array_3d = [
[[111, 112, 113, 114, 114], [121, 122, 123, 124, 125], [131, 132, 133, 134, 135]],
[[211, 212, 213, 214, 214], [221, 222, 223, 224, 225], [231, 232, 233, 234, 235]],
[[311, 312, 313, 314, 314], [321, 322, 323, 324, 325], [331, 332, 333, 334, 335]],
[[411, 412, 413, 414, 414], [421, 422, 423, 424, 425], [431, 432, 433, 434, 435]],
]
# 通常情况下,三维数组最好由二维数组来定义比较直观
也就是说,数组的维度,主要取决于有几个列表层级,与层级中的元素个数无关,比如虽然是4个3行5列共60个元素,但是还是三维。
2、几何维度
考察几何维度,我们需要至少三个坐标系来绘制以下坐标点:
推而广之,在N维平面上,那么就需要N个坐标点才能唯一确定一个点。但是无论维度是多少,在Python中,均可以使用一维数组来表示,比如在一维线条上,一个标量数字就可以确定一个点,在二维平面上,则可以使用 [x, y] 来表示,在三维立体上,则使用 [x, y , z] 来表示该点的坐标,那么在 N维空间中,则通过 [x1, x2, x3, … xN] 就可以表达某个点。
从坐标原点绘制一点线到某个点,则该线条称为向量(N维空间则叫N维向量),如下图所示:
二、向量与距离计算
1、向量值计算
我们都清楚在二维坐标系中,一个坐标点的向量计算遵循勾股定理,也就是说,任意给定一个坐标点(x, y),计算该向量值为:
那么,在三维坐标系统中,任意一个坐标点的坐标必然为:(x ,y , z),那么该坐标点的向量值为:
三维中的点,可以用以下方式来直观表达:
向量:OB’ 的值的计算,可以看成是 OB’ 与 (X,Y) 这个平面上的投影 OB ,而OB为 , 则OB’的值为:
推而广之,任意维度的几何向量的值,均为:
2、向量距离计算
现在假设坐标系上有两个点:A(x1, y1),和B(x2, y2),那么这两个点的距离是如何计算的呢?公式为:
比如有点:A=(3, 4),B=(2,6),则A和B的距离为:,这个坐标可以画出以下图案,看看是否正确:
同样的,在三维坐标系统中,两个点之间的距离计算公式为:
在N维坐标系统中,两个点之间的距离计算公式为:
3、向量和运算
在二维坐标平面中,直角坐标系遵循勾股定理,也就是说针对某一个点,比如(3, 4),其向量长度为5。
既然向量是存在几何意义的,那么向量和与向量积也同样存在几何意义。比如两个点的向量和,可以这样进行运算,并展示在二维平面上,假设平面上有两个点:a = (ax, ay) ,b = (bx, by) ,则 a + b = (ax + bx, ay + by),也就意味着,平面上的两个点求和,其实计算的是其向量和,并且向量和为一个新的点:
我们可以假设两个点的坐标为:a=(3, 5),向量为v,b=(7,2),向量为u,则a+b=(10, 7),根据勾股定理可以计算出:
当然,我们也可以分别计算向量v和u的长度,进而得到 u+v 的值:
上述结果说明,向量之和并非单纯的两个向量的数值相加,那还有什么?从上图中可以看出,向量之和虚拟出来了一个平行四边形,什么情况下,u+v=a+b呢?当u和v两个向量的夹角为0时的极限值时,两者相等。所以这里提出了一个夹角的概念。
2、向量积
我们再来看看向量的点积运算,在二维平面上,存在a和b两个向量,a=(ax, ay),b=(bx, by),那么,也就是说向量之积为一个标量,两条向量之间的夹角为 ,这又有什么意义呢?
我们现在假设有两个点为:A=[3,4],B=[2,6],则A*B=6+24=30,并可计算出 A向量的线条为5,B向量的线条为。我们来进行一下验证。可以使用Matplotlib将这两个点绘制出来:
fig, ax = plt.subplots()
# 绘制原点到指定点的线条
ax.plot([0, 3], [0, 4], color='blue')
ax.plot([0, 2], [0, 6], color='red')
# 设置坐标轴的范围
ax.set_xlim(0, 5)
ax.set_ylim(0, 7)
plt.show()
先说结论:向量 a x b 即可以由两个点的坐标相乘再相加计算出来,即 ,同时还可以由 计算得出,这就使夹角的余弦值有了意义,什么意义呢?继续往下来验证:
仍然以 A=[3,4],B=[2,6] 两个点为原型,通过坐标点相加再相乘的方式,可以计算出 A * B = 30,那么现在来计算一下,为什么还可以由向量a和b以及夹角的余弦值求出:
上图中,向量A在向量B上的映射,可以理解为 ,根据直角坐标系统的三角函数的定义: = 邻边 / 斜边 ,我们开始计算为什么:,对于坐标A来说,其向量值为:5,坐标B的向量值为:,那么有:
,可以计算出:
也就是说,向量A和向量B的夹角的余弦值为:0.9486,而0度的余弦值为最大值1,所以0.9486可以看做是一个空间向量上的两个点之间的夹角的余弦值,设想一下极限情况下,如果为1,则说明两个向量没有夹角,是否意味着两个向量是完全一致的呢?所以在向量空间中,评估两个向量是否相似,也可以使用余弦相似度来进行评估。
补充一下三角函数知识:
基本函数 | 英文 | 缩写 | 表达式 | 语言描述 |
---|---|---|---|---|
正弦函数 | sine | sin | a/c | ∠A**的对边比斜边 |
余弦函数 | cosine | cos | b/c | ∠A**的邻边比斜边 |
正切函数 | tangent | tan | a/b | ∠A**的对边比邻边 |
余切函数 | cotangent | cot | b/a | ∠A**的邻边比对边 |
正割函数 | secant | sec | c/b | ∠A**的斜边比邻边 |
余割函数 | cosecant | csc | c/a | ∠A**的斜边比对边 |
三、导数与梯度下降
1、什么是导数
导数的几何意义是切线的斜率。在平面坐标系中,函数图像上某一点的切线斜率等于该点的导数值。因此,通过求导可以确定曲线在某一点的切线斜率,进一步分析曲线的形状和变化趋势。
某个点的导数计算公式可以写为: 也可以写作为:,即计算切线的斜率。但是由于在一条曲线上,导数都是在动态变化的,所以通常导数也使用一个函数来表示。比如 y’ = 2x + 1 之类的。
导数还有以下作用:
(1) 判断单调性:通过求函数的导数,可以判断函数的单调性。如果函数在某个区间内的导数大于零,则函数在该区间内单调递增;如果导数小于零,则函数单调递减。
(2)判断极值和拐点:导数为零的点可能是函数的极值点或拐点。在极值点处,函数值从递增变为递减或从递减变为递增,因此极值点是函数值变化趋势的转折点。通过求导并令导数为零,我们可以找到可能的极值点或拐点,进一步分析这些点的性质。
(3)优化问题:在实际问题中,我们经常遇到需要找到函数的最值问题,如成本最低、利润最大等。通过求导找到函数的极值点,结合实际情况进行分析,可以找到最优解。
2、梯度下降
梯度下降可以说是机器学习的精髓,各种机器学习所产生的奇迹,都必须建立在梯度下降的机制之下才有了让人感觉智能的结果。
比如针对方程:f(x) = x^2 + 2x + 3,根据上述导数计算规则,其导函数 f(x)’ = 2x+2,基于导函数可以获取x取值时导函数y的取值。比如x为0时,y’=2,此时原函数单调递增,x=-1时,y’=0,此时原函数获得最小值2,x=-3时,y’=-4,此时,原函数单调递减。
梯度下降就是根据导函数来计算,如果导函数的值为正,则说明成上升趋势,这样就不可能找到最小值,如果导函数为负数,则说明成下降趋势,就有可能找到最小值。
那么每次调整的幅度就不能过大,过大的话就可能刚好跳过了最小值,也不能过小,否则运算量就会变大。在AI领域,我们将这个幅度称为学习速率。具体的调整需要根据具体情况来测试,没有标准答案。
画图工具:Windows自带画图,Matplotlib画图,在线画图:www.geogebra.org/graphing