本章摘要:
线性代数是数学的分支,是研究向量空间。
什么是向量
向量就是指可以加运算,可以乘标量,从而生成新向量的对象。
具体就是有限维空间的点。即使你无意将你的数据看作向量,但是将数值数据表示为向量也是很好的处理方式。
比如人的身高,体重,年龄可以看作三维向量。
那么python中可以用列表表示一个向量:height_weight_age = [70,170,40]
那么向量的问题就是如何进行向量的运算了。向量运算原则是以分量的形式进行。
例如向量[1,2]加上向量[2.1] = [1+2,2+1]=[3,3]
那么有个函数zip就是将两个列表对应元素结合的很好的一个函数那么向量加法实现如下:“
>>> def vector_add(v,w):
return [v_i+w_i
for v_i,w_i in zip(v,w)]
>>> v1 = [3,4,5]
>>> v2 = [4,5,6]
>>> vx= vector_add(v1,v2)
>>> vx
[7, 9, 11]
同样对于向量的减法也可以同上
有些时候对于向量是一系列向量运算,从而生成一个新的向量。如何实现呢?
第一种思维方式每次递加一个向量
def vector_sum(vectors):
result = vectors[0]
for vector in vectors[1:]:
result = vector_add(result,vector)
return result
可以用reduce或者partial简化
def vector_sum(vectors):
return reduce(vector_add,vectors)
vector_sum = partial(reduce,vector_add)
对于向量乘以标量运算的时候
def scalar_multiply(c,v):
return [c*v_i for v_i in v]
对于点乘法
def dot(v,w):
return sum(v_i*w_i for v_i,w_i in zip(v,w))
点乘法是对应元素相乘法然后求和。
通过点乘法的函数可以实现 向量的平方和
def sum_of_squares(v):
return dot(v,v)
也可以计算向量的大小或者长度
def magnitude(v):
return math.sqrt(sum_of_squares(v))
def squared_distance(v,w):
return sum_of_squares(vector_subtract(v,w))
矩阵
矩阵式二维的数据集合,可以把矩阵表示为列表的列表,每个内部列表的大小都一样,表示矩阵一行。
>>> A = [[1,2,3],
[4,5,6]]
>>> B=[[1,2],
[3,4],
[5,6]]
矩阵A具有len(A)行和len(A[0])行我们称作为形状
>>> def shape(A):
num_rows = len(A)
num_cols = len(A[0])
return num_rows,num_cols
获取矩阵特定位置的元素
def get_row(A,i):
return A[i]
def get_column(A,j):
return [A_I[j] for A_I in A]
创建矩阵的方法:
def make_matrix(num_rows,num_cols,entry_fn):
"""whose(i,j)th entry is entry_fn"""
return [[entry_fn(i,j) for j in range(num_cols)]#如果(i,j)满足条件
for i in range(num_rows)]#为每个i创建一个列表
def is_diagonal(i,j):
return 1 if i==j else 0
identity_matrix = make_matrix(5,5,is_diagonal)
可以得到一个单位矩阵:
[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]
矩阵用处很广,大部分可以表示二维的关系,曾经用过的数据对(i,j)的集合。可以通过建立矩阵描述。如果有关系那么A[i][j]等于1
那么如果在矩阵中查找所有关系呢?
friends_of_five = [i for i,is_firend in enumerate(friendsships[5]) if is_friend]
不过成本较高