以下内容来自慕课网bobo老师的视频,线性代数还是那些东西,但是读书时学线代的时候,从没有思考为什么要那么写,bobo的视频里举了一些例子,可以帮组自己更深的理解线代,这里做下记录(不完整,只是帮助自己复习用)。
矩阵是向量的集合,在线性代数中,矩阵代表一组变换或空间。
矩阵是系统的描述
下面是矩阵的一些基本性质:
显而易见,比较简单,但作为矩阵的基石,还是列一下。
矩阵和向量的乘法也比较简单,线性代数里都有提到,但是下面这种思想,觉得蛮重要的,深度学习中的全连接网络,每一层其实就是一个矩阵,使用这个矩阵对向量进行了某种变换,生成了一个新的向量。由此,矩阵可以理解为 向量的函数!
根据矩阵和向量的乘法可以定义矩阵的乘法。
矩阵乘法的一些性质
基本上,除了 交换律,数值运算的性质,矩阵都有,需要注意的就是,矩阵的幂必须是方阵 。
矩阵的应用 —— 图形学
y轴平移的距离和x轴坐标成比例。
这里介绍的几种变换无法解决平移的问题,如果要解决平移的问题,需要引入 仿射变换。
单位矩阵和矩阵的逆
在这里插入图片描述
自定义矩阵类和numpy中矩阵的使用
其中向量使用的是之前博客所用的向量类。
from .Vector import Vector
class Matrix:
def __init__(self,list2d):
self._values = [row[:] for row in list2d]
@classmethod
def zero(cls,row,col):
return cls([[0]*col for _ in range(row)])
def size(self):
row_num,col_num = self.shape()
return row_num * col_num
def shape(self):
return len(self._values),len(self._values[0])
def row_num(self):
return len(self._values)
def col_num(self):
return len(self._values[0])
def row_vector(self,index):
return Vector(self._values[index])
def col_vector(self,index):
return Vector([row[index] for row in self._values])
def dot(self,other):
if isinstance(other,Vector):
assert self.col_num() == len(other),'矩阵的列数和向量的长度必须相等'
return Vector([self.row_vector(i).dot(other) for i in range(self.row_num())])
if isinstance(other,Matrix):
assert self.col_num() == other.row_num(), '前一个矩阵的列数必须等于后一个矩阵的行数'
return Matrix([[self.row_vector(i).dot(other.col_vector(j)) for j in range(other.col_num())] for i in range(self.row_num())])
def T(self):
return Matrix([[e for e in self.col_vector(i)] for i in range(self.col_num())])
def __add__(self, other):
assert self.shape() == other.shape(),'相加矩阵形状必须相同'
# 列表表达式,每次生成一个数组
return Matrix([[a+b for a,b in zip(self.row_vector(i), other.row_vector(i))] for i in range(self.row_num())])
def __sub__(self, other):
assert self.shape() == other.shape(), '相减矩阵形状必须相同'
return Matrix([[a-b for a,b in zip(self.row_vector(i), other.row_vector(i))] for i in range(self.row_num())])
def __mul__(self, k):
return Matrix([[k*e for e in self.row_vector(i)] for i in range(self.row_num())])
def __truediv__(self, k):
return self * (1/k)
def __pos__(self):
return self
def __neg__(self):
return self * -1
def __getitem__(self, pos):
row,col = pos
return Matrix(self._values[row][col])
def __repr__(self):
return "Matrix({})".format(self._values)
__len__ = row_num
__rmul__ = __mul__
__str__ = __repr__
numpy中矩阵的使用
A = np.array([[1,2],[3,4]])
B = np.array([[2,3],[4,5]])
print(A)
print(A.shape)
print(A.T)
print(A[1,1])
print(A[:,0])
print(A[1,:])
print(A[1])
print(A + B)
print(A - B)
print(10 * A)
print(A.dot(B))
# 下面几种运算,不属于矩阵运算,numpy中叫做广播(不符合数学理论,不建议使用)
p = np.array([1,1])
print(A * B) # 每项相乘
print(A + p) # 每一行都加上向量p
print(A + 1) # 没个元素+1
看待矩阵的四个重要视角