机器学习线性代数:矩阵基础

以下内容来自慕课网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

看待矩阵的四个重要视角

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值