矩阵乘法

【矩阵乘法快速幂】

十年热恋 提交于 2019-11-29 14:33:14
快速入门视频: av56433157 1> p1926 斐波那契 #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; long long n; const int mod=1000000007; long long nw[2][2],ans[2][2]; long long t[2][2]; void mul1() { memset(t,0,sizeof(t)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) t[i][j]+=(ans[i][k]*nw[j][k])%mod; for(int i=0;i<2;i++) for(int j=0;j<2;j++) ans[i][j]=t[i][j]; } void mul2() { memset(t,0,sizeof(t)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) t[i][j]+=(nw[i][k]*nw[j][k])%mod; for(int i=0;i<2;i++) for(int j=0;j<2;j++) nw[i][j]=t[i][j]; } void mul3()

机器学习中的线性代数

◇◆丶佛笑我妖孽 提交于 2019-11-29 10:56:49
第二章 机器学习中的线性代数知识 线性代数作为数学中的一个重要的分支,广发应用在科学与工程中。掌握好线性代数对于理解和从事机器学习算法相关的工作是很有必要的,尤其是对于深度学习而言。因此,在开始介绍深度学习之前,先集中探讨一些必备的线性代数知识。 2.1 标量,向量,矩阵和张量 标量(scalar) :一个标量就是一个单独的数。用斜体表示标量,如 s ∈ R //--> . 向量(vector) :一个向量是一列数,我们用粗体的小写名称表示向量。比如 x //--> ,将向量 x //--> 写成方括号包含的纵柱: x = ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ x 1 x 2 ⋮ x n ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ //--> 矩阵(matrix) :矩阵是二维数组,我们通常赋予矩阵粗体大写变量名称,比如 A ​ //--> 。如果一个矩阵高度是 m ​ //--> ,宽度是 n ​ //--> ,那么说 A ∈ R m × n ​ //--> 。一个矩阵可以表示如下: A = [ x 11 x 21 x 12 x 22 ] //--> 张量(tensor) :某些情况下,我们会讨论不止维坐标的数组。如果一组数组中的元素分布在若干维坐标的规则网络中,就将其称为张量。用 A ​ //--> 表示,如张量中坐标为 ( i , j , k ) ​ //--> 的元素记作 A i , j , k ​ //-

线性代数_矩阵

心不动则不痛 提交于 2019-11-29 10:54:22
线性代数 矩阵 定义 矩阵乘法 转置矩阵 向量内积与正交 矩阵 定义 加法: C = A + B = ( a i j ) m × n + ( b i j ) m × n = ( c i j ) m × n C=A+B=\left(a_{i j}\right)_{m \times n}+\left(b_{i j}\right)_{m \times n}=\left(c_{i j}\right)_{m \times n} C = A + B = ( a i j ​ ) m × n ​ + ( b i j ​ ) m × n ​ = ( c i j ​ ) m × n ​ 其中 c i j = a i j + b i j c_{i j}=a_{i j}+b_{i j} c i j ​ = a i j ​ + b i j ​ 数乘矩阵: k A = A k = k [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a m 1 a m 2 ⋯ a m n ] = [ k a 11 k a 12 ⋯ k a 1 n k a 21 k a 22 ⋯ k a 2 n ⋮ ⋮ ⋮ k a m 1 k a m 2 ⋯ k a m n ] kA=Ak=k\left[\begin{array}{cccc}{a_{11}} & {a_{12}} & {\cdots} &

形象理解线性代数的本质(一) 向量与矩阵

拈花ヽ惹草 提交于 2019-11-29 10:52:32
本科学习线性代数的时候,一直苦于对矩阵这么一堆罗列起来的数没有一种直观的感觉,也不知道它的具体应用,只是傻傻的学了为了得高分。当用到机器学习的时候才发现在高阶的应用领域都是需要线性代数作为基础的。之所以没有用到线性代数,不是因为它没有用,而是自己工作内容太LOW,够不到使用线性代数的水平。 这里结合中科院王赫然博士的线性代数课程和网上的线性代数帖子,写一系列线性代数的博文,直观的讲解一下线性代数的形象理解。这里只讲解其直观理解,不作推导与证明。 本节要讲的概念有 标量 向量 矩阵 空间 一、 向量和标量 标量的意义—— 比例,权重; 是一维的向量。 向量的意义—— 多个标量的组合;是进化了的标量。 二、向量思想 借用面向对象编程的一句话: 根据这个思想,我们可以把一切都看作向量,所有的变化都可以看做对向量的一种计算。 例如:在三维空间中, 向量 a (1,2,3)是空间中的一个点,也可以看做是一个向量;对它的伸缩、平移、翻转等变换就是一种运算。 三、行向量与列向量 列向量是对象,行向量是方法。这样我们就能够对 向量的乘法 有一个直觉的理解。 我们举一个有趣的例子,来讲一下行向量、列向量以及 行向量 × 列向量 的意义。 我们都玩过对战游戏,游戏角色通常有各种属性值。这里选的角色是曹操,我们用一个列向量来代表曹操(对象)的各项能力数据:统率值、武力值、智力值和政治值。其中每一个数据的

线性代数的本质

不问归期 提交于 2019-11-29 10:52:04
Essense Of Linear Algebra 让你完全理解线性代数。 线性空间中,当你选定一组基之后,不仅可以用一个向量来描述空间中的任何一个对象,而且可以用矩阵来描述该空间中的任何一个运动(变换),从而得出 矩阵 是线性空间里的变换 的描述 。而使某个对象发生对应运动(变换)的方法,就是用代表那个运动(变换)的矩阵,乘以代表那个对象的向量。转换为数学语言: 是 矩阵, 是向量, 相当于将 作线性变换从而 得到 ,从而使得 矩阵 (由n个向量组成)在对象或者说向量 上的变换 就由简单的实数 来刻画,由此称 为矩阵 A的特征值,而 称为 对应的特征向 量。 总结来说,特征值和特征向量的出现实际上将 复杂的矩阵由实数和低维的向量来形象的描述 (代表),实现了 降维 的目的。在几何空间上还可以这样理解:矩阵A是向量的集合,而 则是向量的方向, 可以理解为矩阵A在 方向上作投影,而矩阵又是线性空间变换的描述,所以变换后方向保持不变,仅是各个方向投影后有个缩放比例 。 线性代数的本质 是用静态的坐标(一维(线),二维(面),三维(体)),描述事物的运动。这是其实质。 矩阵 :矩阵就是建立不同的维度,不同的基坐标系。这样你应该理解矩阵的运算法则。加法,乘法。矩阵的阶代表不同的维度,二阶是平面,三阶是体也就是三维,4阶就是超立方体,依次类推。 你可能不理解多维度空间。简单点说:点,线,面

线性代数的直观理解 -- Intuition in Linear Algebra

北慕城南 提交于 2019-11-29 10:47:56
受《理解线性代数》启发,结合自身学习的经验,直观的总结我对线性代数的理解。强调直观是因为在这里不纠缠于数学的严谨性,所以如果追求数学严谨性和证明的还是去看教材比较好。 统计的目标是对数表内各种数据进行挖掘从而找出隐含其中的关系,线性代数为统计提供了对数表的表达方式和对数表进行处理的工具。 在初等数学中我们学过函数,用来表示的数据之间一种确定的关系,给定x一定能算出唯一的y。但现实中我们遇到的数据可就没有那么明确的联系了,我们不知道谁和谁有联系,甚至不知道是不是存在联系。因此我们急需一种框架来帮助我们处理这些”不好看”的数据。统计就是为了处理数据而生的,它的目标即挖掘出数据之间的联系,从而抽象出数学模型来做解释或预测。 先来扯句题外话,我们知道数学的本质是抽象。那究竟什么是抽象?抽象就是从不同个体中找相同,这些相同也就是规律和关系。初等数学中学到的函数关系就是一种规律,无论x到底是什么值,它和y之间都存在这样的规律。这也是为什么说数学模型都是错的,但却是有用的原因。抽象忽略了个体差异,只留相同点,利用相同点我们能处理满足此相同点的任何差异个体。 言归正传。回忆下中学解析几何或者大学微积分时我们是如何处理数据的: 我们会把函数f(x)映射到欧几里得空间内笛卡尔坐标系做visualization。在代数上对函数的操作等价于对欧几里得空间中相应函数图像做操作。函数是确定的关系

如何理解正定矩阵和半正定矩阵

谁说胖子不能爱 提交于 2019-11-29 07:00:24
乍看正定和半正定会被吓得虎躯一震,因为名字取得不知所以,所以老是很排斥去理解这个东西是干嘛用的,下面根据自己和结合别人的观点解释一下什么是 正定矩阵(positive definite, PD) 和 半正定矩阵(positive semi-definite, PSD) 。 定义 首先从定义开始对PD和PSD有一个初步的概念: 正定矩阵(PD) : 给定一个大小为 \(n\times n\) 的 实对称矩阵 \(A\) ,若对于任意长度为 \(n\) 的非零向量 \(X\) ,有 \(X^TAX>0\) 恒成立,则矩阵 \(A\) 是一个正定矩阵。 半正定矩阵(PSD) 给定一个大小为 \(n\times n\) 的 实对称矩阵 \(A\) ,若对于任意长度为 \(n\) 的非零向量 \(X\) ,有 \(X^TAX≥0\) 恒成立,则矩阵 \(A\) 是一个半正定矩阵。 说人话来理解 光看定义其实肯定不能理解到底是个啥,以及为什么要这么定义。所以下面用说人话的方式来进行解释。 仔细看一下上面的定义可以看到两种矩阵的唯一区别就是正定要求是大于0,而半正定要求大于等于0。这个是不是很像二次函数 \(y=ax^2\) : 当 \(a>0\) 时, \(y>0\) ; 当 \(a≥0\) 时, \(y≥0\) 。 其实我们可以把 \(y=X^TAX\) 看作是 \(y=ax^2\)

矩阵乘法(四):分析问题,确定递推式,采用矩阵快速幂求解

流过昼夜 提交于 2019-11-29 05:32:14
应用矩阵快速幂运算可以解决递推问题。在实际应用中,有时候题目并没有直接给出递推式,需要认真分析问题,找出递推式,然后再利用矩阵快速幂运算加快问题的求解。 【例1】程序阅读理解。 有如下的C语言程序: #include <stdio.h> int main() { int n,m,f,i; while(scanf("%d%d",&n,&m)!=EOF) { f=0; for(i=1;i<=n;i++) { if (i&1)f=(f*2+1)%m; else f=f*2%m; } printf("%d\n",f); } return 0; } 阅读上面的程序,根据输入的n和m,写出程序运行的结果。例如,输入 3 10,输出应为5。 但由于给定输入的n和m的数据范围为1<=n, m <= 1000000000,且测试集中数据量较大,因此如果直接将给定的程序提交会超时的。请你编写一个程序,能根据输入的n和m快速完成问题的求解,以实现给定程序的功能。 (1)编程思路。 给定程序段实际是通过迭代的方式求f(n)%m的值。先不考虑求余,找到f(n)的求法。 分析给定程序知,f(0)=0, 当 n为奇数时,f(n)=2*f(n-1)+1;当n为偶数时,f(n)=2*f(n-1)。 下面进一步分析,找到不考虑n的奇偶性的一个统一的递推式。 当 n为奇数时,f(n)=2*f(n-1)+1,n

什么是卷积和池化

China☆狼群 提交于 2019-11-29 02:41:16
在传统的神经网络中,比如多层感知机( MLP ),其输入通常是一个特征向量,需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用,有时多了,有时少了,有时选择的特征根本就不起作用(真正起作用的特征在浩瀚的未知里面)。这就是为什么在过去卷积神经网络一直被 SVM 等完虐的原因。 如果有人说,任何特征都是从图像中提取的,那如果把整副图像作为特征来训练神经网络不就行了,那肯定不会有任何信息丢失!那先不说一幅图像有多少冗余信息,单说着信息量就超级多。。。 假如有一幅 1000*1000 的图像,如果把整幅图像作为向量,则向量的长度为 1000000 ( 10^6 )。在假如隐含层神经元的个数和输入一样,也是 1000000 ;那么,输入层到隐含层的参数数据量有 10^12 ,什么样的机器能训练这样的网络呢。所以,我们还得降低维数,同时得以整幅图像为输入(人类实在找不到好的特征了)。于是,牛逼的卷积来了。接下来看看卷积都干了些啥。 什么叫卷积? 卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意这里是一个单独的值,不再是矩阵了)。 卷积的本质就是用卷积核的参数来提取原始数据的特征,通过矩阵点乘的运算,提取出和卷积核特征一致的值,如果卷积层有多个卷积核

[矩阵乘法] CF 1182 E.Product Oriented Recurrence

二次信任 提交于 2019-11-28 21:53:50
F n = c 2n-6 * F n-1 * F n-2 * F n-3 ,求 F n . 推一下式子,变成 F n * c n = ( F n-1 * c n-1 ) * ( F n-2 * c n-2 ) * ( F n-3 * c n-3 ) 记 T n = F n * c n ,就有 T n = T n-1 * T n-2 * T n-3 . 再推一下,T n = T n-2 2 * T n-3 2 * T n-4 , T n 的指数就是可以 ( a , b , c ) ----- > ( b+a , c+a , a ) 递推的, 这个显然是可以矩阵乘法优化的,式子很容易推就不放了。 要注意的是矩阵乘法求出来的是指数,所以中间过程是对 p - 1 取模, 因为 a t mod p = a t mod (p-1) mod p,p为质数 . 1 #include<bits/stdc++.h> 2 #define rep(i,a,b) for(register int i=a;i<=b;++i) 3 #define rpd(i,a,b) for(register int i=a;i>=b;--i) 4 #define rep1(i,x) for(register int i=head[x];i;i=nxt[i]) 5 typedef long long ll; 6 const