干掉公式 —— numpy 就该这么学(一)

简介: 机器学习和数据分析变得越来越重要,但在学习和实践过程中,常常因为不知道怎么用程序实现各种数学公式而感到苦恼,今天我们从数学公式的角度上了解下,用 python 实现的方式方法。

友情提示:不要被公式吓到,它们都是纸老虎

关于 Numpy

NumPy 是使用 Python 进行科学计算的基础软件包。除其他外,它包括:

  • 功能强大的N维数组对象
  • 精密广播功能函数
  • 集成 C/C+和Fortran 代码的工具
  • 强大的线性代数、傅立叶变换和随机数功能

机器学习和数据分析,numpy 是最常用的科学计算库,可以用极简的、符合思维习惯的方式完成代码实现,为学习和实践提供了很大的便利

环境准备

创建虚拟环境(可省略),安装 numpy 包:

pip install numpy

测试安装:

>>> import numpy
>>>

在下面实践中,默认将 numpy 引用为 np:

import numpy as np
...

基础运算

编程语言大多数运算都是针对简单数值的,复杂运算是通过相应的数据结构结合程序逻辑计算的。numpy 虽然是针对复杂数据结构(例如矩阵)构造的,但它提供了和简单数值计算一样方便的操作。

幂运算

幂运算的运算符为 ** ,即两个星号(一个星号表示乘),例如计算 x 的平方:x**2,x 的立方:x**3,等等

开方,相当于计算 1/2 次方,即 x**(1/2) 或者 x**0.5,因为常用 numpy 提供了便捷函数,sqrt,例如对数字 x 开平方,就是 np.sqrt(x).

实际上平方运算也有便捷方法:np.square

绝对值

绝对值表示一个数轴上的值距原点的距离,表示为 |x|,numpy 提供便捷方法abs 来计算,例如 np.abs(x),就为 x 的绝对值

理解向量和矩阵

线性代数是机器学习和数据分析的基础数学之一,而向量和矩阵式又是线性代数的基础概念,所以理解向量和矩阵非常重要。

向量

一般数据被分为标量和向量,标量比较容易理解,即数轴上的一个数值

向量直观的认识是一组数值,可以理解为一维数组,但是为啥常见定义表示:具有方向的数值,方向指的是啥?这个问题困扰了我很多年(苦笑)。实际是因为在开始学习线性代数时,直接从公式定理开始,而没有了解它的原理和来源。

向量的方向指是,向量所在坐标系的原点指向该向量在坐标系中表示的点的方向,例如在平面直角坐标系中,向量 [1,2] 表示 x 轴为 1,y 轴为 2 的一个点,从原点,即 [0,0] 点指向这个点的方向,就是这个向量的方向,扩展的三维坐标系,再到 n 为坐标系(当然超过三位人类就比较难以理解了),向量元素的个数表示向量属于几维坐标系,但无论多少维,都可以画出原点指向向量点的方向。

因为线性代数研究的是向量及向量组(矩阵)的纯数学计算,所以丢弃了坐标系的概念,只保留了向量的样子,所以造成了向量难以理解的现象。

简单说,向量就是一个数值的数组。

矩阵

理解了向量,矩阵理解起来就容易了,相当于一组向量,即坐标系中的多个点的集合,矩阵运算,就相当于多个向量的运算或变换。

可能这里比较绕或冗余,先解释到这里,后面的文章中会进一步解释向量和矩阵的实际意义

初始化

numpy 中,提供了多种产生向量和矩阵的方法,例如用 array 可以将 python 数组初始化为 numpy 矩阵:

m = np.array([(1,2,3),(2,3,4),(3,4,5)])

就可以创建一个 向量维度为 3,个数为 3 的矩阵

基本运算

numpy 特别擅长处理向量和矩阵的运算,例如乘法,即给向量中的每个数值乘以乘数,之间写代码的话,可以遍历向量,为每个值乘以乘数。

用 numpy 就简单很多:x * 2,就像做标量运算一样,感觉向量同一个数值一样。

  • 加法 x+2
  • 减法 x-2
  • 处罚 x/2

矩阵幂运算

向量、矩阵既然可以看成一个数,幂运算就很容易理解了,例如矩阵

1.jpg


矩阵 m

m 平方就可以写成 m**2, 结果为:

2.jpg


矩阵平方

矩阵点积

不同维度的矩阵可以做乘法操作,但不是一般的乘法操作,操作被称为点积,为了用 numpy 表示,需要用 dot 函数,例如矩阵 m 和 n

3.jpg


矩阵 m、n

代码为 m.dot(n),就会得到如下结果:

4.jpg


矩阵点积


目录
相关文章
|
5月前
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
7月前
|
C++ Python Java
Python每日一练(20230424) 滑动窗口最大值、栈实现队列、直线上最多的点数
Python每日一练(20230424) 滑动窗口最大值、栈实现队列、直线上最多的点数
588 0
Python每日一练(20230424) 滑动窗口最大值、栈实现队列、直线上最多的点数
|
7月前
|
算法 Python Java
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
81 0
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
|
Python
Python实现求取素数
Python实现求取素数
240 0
|
数据可视化 数据挖掘 Python
R语言ComplexHeatmap包做热图:热图每隔三行分开一小段
R语言ComplexHeatmap包做热图:热图每隔三行分开一小段
torch中对一个行向量使用sigmoid函数转换成概率,如果这个行向量包含的元素有几千上万个,这可能会导致转换成的概率再抽样效果不好,应该怎么解决这个问题
可以尝试使用softmax函数进行转换,它可以处理具有多个值的行向量,并将其转换为概率分布。另外,可以考虑使用截断技术(如Top-K),减少概率中过小的部分,以提高采样效果。
151 0
python去除sst季节性空间分布图中,0°经线处出现的白线
近日,在处理sst月均数据时,绘制出季节性的空间分布图时,发现:绘出的图像在0°出现一条白线,经过查询将问题已经解决。
python去除sst季节性空间分布图中,0°经线处出现的白线
如何用牛顿法求一个数的平方根
(一)导数与导函数 导数 设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,(x0+Δx)也在该邻域内时,相应地函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx→0时极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)在点x0处的导数记作①f'(x0) ;②y'│x=x0 ;③ │x=x0, 即 导函数 如果函数y=f(x)在开区间内每一点都可导,就称函数f(x)在区间内可导。
3983 1
|
Web App开发 存储 机器学习/深度学习
「Python」sklearn第二弹-归一化和离散值编码
本文主要讲解sklearn里面的归一化,其中包括-L1范式和L2范式。 还讲解了关于离散值编码,主要涉及到的编码方式有LabelEncoder和OneHotEncoder。
365 0
「Python」sklearn第二弹-归一化和离散值编码
|
Python
numpy:矩阵的元素选取
numpy:矩阵的元素选取
83 0