- 2025-01-22
-
回复了主题帖:
《Hello算法》3、独到的在线学习方法
向量运算
在代码中,向量被表示为数字的集合,每个数字可以视作某一坐标的取值。在这里,我们定义几个专用于向量的运算符。
1、模长
在几何上,我们可以把向量看作含有方向和大小的量。向量的大小又称为向量的模长,对于n元向量x来说模长的计算公式为:
以上公式中,向量x两边的双竖杠表示向量的模长。向量的模长有时也用单竖杠来表示,但由于单竖杠也可以表示绝对值,因此我们通常需要结合上下文来解读单竖杠的含义。
那么上面公式是如何来的?考虑向量x=(x,y)。如果x和y是二维向量x沿轴,y轴方向的长度,那么x和y便构成了一个直角三角形的两条直角边,这个直角三形的斜边长度就是向量的长度。因此毕达哥拉斯或古巴比化人的理论,这一长度为 。将上述形扩广到n元向量,于是就有了上面的公式。
-
回复了主题帖:
《Hello算法》3、独到的在线学习方法
用张量进行代数运算
作者详细阐述如何用张量进行代数运算。重点关注一阶张量(向量)和二阶张量(矩阵)。
将从数组运算讲起,这里的数组运算指的是在NumPy这类组件中,按元素对数组的每一维进行操作的运算。接下来,我会专门介绍针对向量的运算类型,这些内容用于为关键的矩阵运算搭建舞台。
5.2.1 数组运算
先定义几个数组
>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([[7,8,9],[10,11,12]])
>>> c = np.array([10,100,1000])
>>> d = np.array([10,11])
>>> print(a)
[[1 2 3]
[4 5 6]]
>>> print(c)
[ 10 100 1000]
>>> print(d)
[10 11]
>>>
当数组的大小完全匹配是,按元素进行代数运算是很简单的::
>>> print(a+b)
[[ 8 10 12]
[14 16 18]]
>>> print(a-b)
[[-6 -6 -6]
[-6 -6 -6]]
>>> print(a*b)
[[ 7 16 27]
[40 55 72]]
>>> print(a/b)
[[0.14285714 0.25 0.33333333]
[0.4 0.45454545 0.5 ]]
>>> print(b**a)
[[ 7 64 729]
[ 10000 161051 2985984]]
>>>
上面的试验,可以看到NumPy会在对应位置的元素之间完成指定的代数运算。两个矩阵按元素相乘称为阿达马积(深度学习中会经常看到这个术语)。
NumPy对按元素运算的思想进行了扩展,这就是广播的时候,NumPy会基于一些规则,让一个数组遍历另一个数组以得到有意义的结果。
当我们使用标量与数组运算时,实际上就是将标量广播给数组中的每一个值。
在下面的一个代码中,虽然a是一个2*3的矩阵,但是NumPy可以用它与三元向量C进行运算,这里就用到了广播。
>>> print(a+c)
[[ 11 102 1003]
[ 14 105 1006]]
>>> print(c*a)
[[ 10 200 3000]
[ 40 500 6000]]
>>> print(a/c)
[[0.1 0.02 0.003]
[0.4 0.05 0.006]]
>>>
三元向量c被广播给2*3的矩阵a中的第一行。当NumPy发现三元向量C和矩阵a的最后几维相同时,就会用三元向量c遍历整个矩阵a。当你阅读深度学习领域的一些Python源码时,你会经常看到这类的操作。有时候,你需要思考一下自己在做什么。当无法达人定时,你可以利用Python命令行做一些实验。
那么能否用二元向量d对2*3的矩阵a进行广播呢?如果直接按照上面使用的三元向量对矩阵a进行广播的方式,系统就会报错:
>>> print(a+d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
好在NumPy提供了适用于一维输入广播机制的方案,虽然d是一个二元向量,但如果我们把d转换成一个2*1的二维数组,NumPy就可以用它进行广播了。
>>> d = d.reshape((2,1))
>>> d.shape
(2, 1)
>>> print(a+d)
[[11 12 13]
[15 16 17]]
现在,NumPy把d加到了矩阵a的每一个列上。
-
回复了主题帖:
《Hello算法》3、独到的在线学习方法
秦天qintian0303 发表于 2025-1-22 09:30
一边学一边练,效果还是不错的
跟着书自己录了一篇,收获挺大,就是有点慢,学起来也有点困难。
-
回复了主题帖:
新年积分兑换专场兑换的零食礼包到了,有图片。
这个可以哦,挺好的,恭喜大佬,喜提新年礼物。
-
回复了主题帖:
汉芯源CW32L021小评
标题少了一点字,有空补一下谢谢,是武汉芯源!
-
回复了主题帖:
祝福2025!回帖即有奖!选取最有心的送5块国产开发板!
汉芯源CW32L021小评 - 国产芯片交流 - 电子工程世界-论坛
@rtyu789已经有文章产出了!
-
回复了主题帖:
汉芯源CW32L021小评
期待大佬的精彩作品继续!如果有什么问题,我们可以一起探讨解决!
- 2025-01-21
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
freebsder 发表于 2025-1-21 18:48
化现在不太行了,数理还是可以。现在据说很多大学都在关停化相关专业。
基础的东西还需要有人来做的,人类的进步,都是无数科学家的付出。
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
qzgiky 发表于 2025-1-21 11:40
一开始不理解AI,以为AI是电子,实际AI是数学。真的是学好数理化,走遍天下都不怕
对的,数学是基础东西,没有数学,行不通呀。
-
回复了主题帖:
《Hello算法》2、前言
秦天qintian0303 发表于 2025-1-21 09:49
现在都喜欢用python来模拟运行,这个库是真方便啊
是呀,在线体验,代码也给出来了,作者不愧是大佬呀,在线版可以免费阅读。
-
发表了主题帖:
《Hello算法》3、独到的在线学习方法
《Hello算法》提供了跟纸质书不一样的阅读体验,那就是可以在线阅读,不需要携带纸质书,还有就可以一个非常好的功能,就是能在线用动画片进行在线观看程序中实际的运行效果。代码可以实时看到Python、C++等多种语的源代码:
而下面还有可视化运行:
【小结】
阅读网页版,相比纸质书要方便很多。
如果您没有拿到纸质书,在线学习也是一种美好的体验。https://www.hello-algo.com/chapter_computational_complexity/iteration_and_recursion/#3
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
张量:
标量是零给的,向量是一维的,矩阵是二维的。高于二维的对象称为张量。
张量的维数又称为阶数,注意不要与矩阵的阶数弄混淆。三维张量的阶数为3.矩阵是二阶张量(阶数为2),向量是一阶张量(阶数为1),标量是零阶张量(阶数为0)。在以后学习神经网络中的数据流时,会看很多组件使用了四阶张量(甚至更高阶的张量)
【小结】张量可以用阶数来统一标量、矩阵、向量等等。
在Python中,可以使用三维或者更高维的NumPy数组来实现张量。
如下为一个三维张量:
>>> t = np.arange(36).reshape((3,3,4))
>>> print(t)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[24 25 26 27]
[28 29 30 31]
[32 33 34 35]]]
这段代码中首先用np.arange定义了一个由数字0-35组成的向量,其中包含36个元素。接下来通过调用reshape函数,将这个数组转换成3*3*4的张量。理解这个3*3*4的张量的一种方式,就是将其想象一个由3张3*4的矩阵图片叠在一起的阵列。
>>> print(t[0])
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
>>> print(t[0,1])
[4 5 6 7]
>>> print(t[0,1,2])
6
>>>
书中使用以上代码对张量中的元素进行了访问。
下面这个表让我明白了张量与上面说的标量、向量、矩阵、张量等关系
- 2025-01-20
-
回复了主题帖:
2025新年花灯节,来场花式点灯秀吧!
大家可以偿试用N种方式点灯:
比如,普通IO点灯,pwm点灯,spi点灯,看门狗点灯,IIC点灯,定时器点灯。
可以用C点灯,用C++点灯,用Python点灯,用lua点灯,用js点灯。
不知道点灯的方式多,可不可以拿大奖。
-
发表了主题帖:
《Hello算法》2、前言
作者在前言中简介了《Hello算法》的内容,读者对象,内容结构。
致谢了为此书做出贡献的许多的大佬们。
本书的算法的语言为python实现,但是又给出了C、C++等10多种语言的代码。
同时作者给出了【如何使用本书】
给出了行文风格约定。
还提出了【在动画图解中高效学习】
书中给出了一个二维码,扫描后可以看到动画,当然也可以下载工程也可以看到动画,比如:
这是我第一次阅读到有动画的书籍。
作者提出了,在阅读书中,最好把代码自己录一篇,这样学习效果才好,”动手学,才是真的学“
书中提到了运行代码前置工作分为三步:
1、安装本地编程环境。
2、克隆或下载代码仓库。
3、运行代码。
书中还说到【在提问和讨论中共同成长】
作者提到,如果你在阅读此书时,如果有不明白的地方可以在线上评论区提出来,作者会在第时间加复。真是太好了。
【算法学习路线】
作者讲到了,学习算法的三个阶段:
1、算法入门
2、刷算法题
3、搭建知识体系。
【小结】
最后作者对前言进行了小结。
在这里提示一下,有在线阅读:序 - Hello 算法
-
发表了主题帖:
《Hello算法》1、开卷
感谢eeworld,给予了我这次《Hello算法》的试读机会,收到了书,非常精美:
这本书是前华为高级算法工程师靳宇栋老师的大作。2024年2月第1版,到2024年4月就印刷了3次,说明这本书非常的热销。
在序中,作者讲述了如何要写这本书的初衷,能通过这本书可以减少“两眼抹黑的刷晚上再”,作者可以让读者可以掌握各种“排雷方法”。
本书的代码托管于GitHub - krahets/hello-algo: 《Hello 算法》:动画图解、一键运行的数据结构与算法教程。支持 Python, Java, C++, C, C#, JS, Go, Swift, Rust, Ruby, Kotlin, TS, Dart 代码。简体版和繁体版同步更新,English version ongoing仓库。
同时也有电子书下载,如果有对算法有进一步学习的可以移步仓库进行学习。
附创库代码:
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
hellokitty_bean 发表于 2025-1-20 12:00
numpy就一个数据结构:ndarray ,但变化多端。。。
根本学不完呀,学不完!以前做报表时用过,还没有想到可以做向量、张量。
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
矩阵:
矩阵是由数字构成的二维数组。
A=
在矩阵A中,各元素所处的行数和列数为下标。矩阵A包含2行3列,因而它被称为2*3的矩阵。其中,2*3就是矩阵A的阶数。注意,数组的下标是从0开始的。矩阵在代码中是二维数组表示的:
>>> a = np.array([[1,2,3],[4,5,6]])
>>> print(a)
[[1 2 3]
[4 5 6]]
>>>
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
向量:
向量是由数字构的一维数组。在数学上,向量有水平和垂直两种列式方法。如果是水列式,那么就一个行向量。
x=[x0,x1,x2]
其中x是由3个元素构成的行向量。
在数学上,我们通常将向量表示为列向量y=
y,为二维向量。
在代码中,我们通常使用一维数组来表示向量
>>> import numpy as np
>>> x = np.array([1,2,3])
>>> print(x)
[1 2 3]
>>> print(x.reshape((3,1)))
[[1]
[2]
[3]]
>>>
上述代码中通过调用reshape函数,将一个三元行向量转换成了列向量。
向量中的成员通常表示向量在一组坐标系中沿各个坐标轴的长度。例如,一个三元向量可以表示三维空间中的一个点。在这个三元向量中,x是沿X轴的长度,y是沿y轴的长度,z是沿z轴的长度,这就是笛卡儿坐标系用于唯一地表示整个三维空间中所有的点,比如:
x=(x,y,z)
然后,在深度学习和机器学习领域,向量的各个成同之间通常没有严格的几何位置关系。它们用来表示特征,也就是描述样本特性的某些量。模型需要通过这些量来得到有用的输出,如分类标签或回归值。尽管如此,用来表特征向量(特征的集合)的特征有时也是有几何含义的。例如,一些机器学习算法(如k近邻算法)会把特征解读为几何空间中的坐标。
在深度学习中,问题的特征空间是指由所有可能的输入构成的集合。提供给模型的训练样本需要能够有效地表示模型在使用阶段的特征空间。从这个角度讲,特征向量就是n维空间的一个点,n等于特征向量中特征的数量。
-
回复了主题帖:
《深度学习的数学——使用Python语言》线性代数
标量:
这个名词理解,标量就是一个数字,比如7、42或PI。在表达式中,x表示标量,也就是不带任何样式的变量记号。对于计算机来说,标量就是一个简单的数值变量:
>>> s = 66
>>> s
66
>>>
-
发表了主题帖:
《深度学习的数学——使用Python语言》线性代数
线性代数关注的是线性方程组的问题。在线性方程组中,各变量的最高次幂为1 。然而,就我们的学习目的而言,我们关注的线性代数是多维数学对象(如向量和矩阵)的计算问题。这是线性代数在深度学习中的典型用途,也是在深度学习的算法实现中对数据进行运算的核心。由于关注点不同作者会抛开大量酷炫的数学内容。
在这章中作者介绍深度学习中不同类型的对,具体包括标量,向量,矩阵和张量。这些对象其实都是不同阶数的张量。本章将从数学和符号的角度讨论张量,然后使用NumPy对它们进行实验。NumPy明显是为了给Python添加多维数组而设计的。NumPy虽然不完美,但它可以很好的模拟本章需要使用的数学对象。