老齐教室

用Python实现各类数学符号运算

翻译:老齐

与本文相关图书推荐:《跟老齐学Python:数据分析》


在机器学习项目中,你肯定要在代码中实现各种运算,其中必然要用到各种数学符号,因此,必须了解并熟知如何实现。

本文列出常用的数学符号及其Python实现方法,一旦用到,就可以直接拷贝。

$$\frac{1}{N}\sum_{i=1}^N(y_i-\hat{y_i})^2$$

索引

$$x_i$$

这个符号用于表示向量中第几个值。

1
2
3
x = [10, 20, 30]
i = 0
print(x[i]) # 10

还可以拓展到2维向量,乃至更多维度。

$$X_{ij}$$

1
2
3
4
x = [ [10, 20, 30], [40, 50, 60] ]
i = 0
j = 1
print(x[i][j]) # 20

求和

$$\sum_{i=1}^Nx_i$$

这个符号的意思是对某一范围内的向量中的元素求和,上下标为范围。它等同于Python中对向量的索引从0到N-1进行循环,注意,如何用前面的$x_i$符号得到每个值得索引。

1
2
3
4
5
6
x = [1, 2, 3, 4, 5]
result = 0
N = len(x)
for i in range(N):
result = result + x[i]
print(result)

上面的代码可以用内置函数简化:

1
2
x = [1, 2, 3, 4, 5]
result = sum(x)

PI

$$\prod_{i=1}^Nx_i$$

这个符号的意思是将向量中指定范围的元素求乘积(读作:pi,即字母π的大写形式),Python中的实现方法就是循环得到元素,然后计算乘积。

1
2
3
4
5
6
x = [1, 2, 3, 4, 5]
result = 1
N = len(x)
for i in range(N):
result = result * x[i]
print(result)

管道符

管道符(键盘上的竖线)有多种不同的含义,要具体看它的应用方式。

绝对值

$$|X|$$

作为绝对值符号,返回该数值的绝对值。

1
2
3
4
x = 10
y = -20
abs(x) # 10
abs(y) # 20

范数

$$||X||$$

范数,也称为向量的模(长),即向量的大小。Python中通过计算数组中每个值的平方和再开方得到。

1
2
x = [1, 2, 3]
math.sqrt(x[0]**2 + x[1]**2 + x[2]**2)

Epsilon

$$3\in X$$

这是一个希腊字母(读如:[ˈepsɪlɑːn]),它用于检验某个元素是不是集合的一员,在Python中,用下面的方式实现:

1
2
X = {1, 2, 3}
3 in X

函数

$$f:X \to Y$$

这个符号表示函数中的X与Y的对应关系,Python中就是编写一个函数,X为参数,输出Y。

1
2
3
def f(X):
Y = ...
return Y

有时候你也会遇到下面的表述方式,用R替代X、Y:

$$f:R \to R$$

R意味着输入输出都是实数,比如整数、浮点数、无理数、有理数等。Python中当然可以表示:

1
2
3
x = 1
y = 2.5
z = math.pi

还有可能遇到下面的形式:

$$f:R^d \to R$$

$R^d$意味着实数组成的d维度向量(译者注:实数域的d维子空间)。

假设d=2,Python中可以用Numpy提供的函数,例如下面代码中的求和函数,返回的是一个数值,它实现了$R^d$ 到 $R$的映射

1
2
3
X = [1, 2]
f = np.sum
Y = f(X)

译者注: 严格来讲,本文上面的示例不很准确。[[1], [2]],这样的才是严格的2维。

张量

转置

$$X^T$$

这个符号表示的是行列转换,Python中用下面方法实现:

1
2
3
X = [[1, 2, 3], 
[4, 5, 6]]
np.transpose(X)

输出结果显示行列交换了位置。

1
2
3
[[1, 4], 
[2, 5],
[3, 6]]

乘法

$$X \bullet Y$$

张量间的乘法,在Python中用np.multiply实现:

1
2
3
4
5
x = [[1, 2], 
[3, 4]]
y = [[2, 2],
[2, 2]]
z = np.multiply(x, y)

输出是:

1
2
[[2, 4]],
[[6, 8]]

点积

$$XY$$
$$X.Y$$

点积的结果是每个序列中对应数字积的和。

1
2
3
4
5
X = [1, 2, 3]
Y = [4, 5, 6]
dot = sum([i*j for i, j in zip(X, Y)])
# 1*4 + 2*5 + 3*6
# 32

有帽子的符号

$$\hat{x}$$

向量上有一个小帽子的符号,表示的是向量中的每个分量除以向量的长度。

1
2
3
x = [1, 2, 3]
length = math.sqrt(sum([e**2 for e in x]))
x_hat = [e/length for e in x]

如此所得向量的大小就是1,并且方向不变。

1
2
math.sqrt(sum([e**2 for e in x_hat]))
# 1.0

感叹号

$$x!$$

用感叹号表示阶乘,即从1开始,一直到该数字的所有整数的乘积,在Python中,这样计算:

1
2
3
4
5
x = 5
fact = 1
for i in range(x, 0, -1):
fact = fact * i
print(fact)

也可以用内置模块中的函数实现:

1
2
import math
math.factorial(x)

输出是:

1
2
# 5*4*3*2*1
120

原文链接:https://amitness.com/2019/08/math-for-programmers/

搜索技术问答的公众号:老齐教室

在公众号中回复:老齐,可查看所有文章、书籍、课程。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能