精华内容
下载资源
问答
  • 数组与矩阵数组是由一组相同类型的数据元素构成的有限序列,访问数据元素的方式是使用元素各自的序号进行访问,也就是下标。数组它本身是线性表的推广,一维数组就是一个向量形式的线性表,二维数组就是由一维数组...

    前言

    一入编程深似海,从此砖头是爱人,日日搬,夜夜搬,搬到天荒地老,精尽人亡,直教人失去了自我,忘记了时间,忽然之间发现九月份快没了,赶紧写篇博客打个卡,证明一下我还活着。。。

    数组与矩阵

    数组是由一组相同类型的数据元素构成的有限序列,访问数据元素的方式是使用元素各自的序号进行访问,也就是下标。数组它本身是线性表的推广,一维数组就是一个向量形式的线性表,二维数组就是由一维数组组成的线性表。

    在许多科学计算和工程应用中,经常要用到矩阵的概念,我们用的最多的其实就是Mysql的表,表数据都是行列存储,这就是矩阵。

    由于矩阵具有元素数目固定以及元素按下标关系有序排列等特点,所以在使用高级语言编程时,一般都是用二维数组来存储矩阵。

    数组的顺序存储

    为什么是顺序存储?

    我想问这个问题就太低级了。因为它是数组,数据的存储方式分为顺序存储和链式存储两种,数组一旦被定义,他的维数和维界就已固定,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作,不存在插入和删除操作,所以数组适合用顺序存储。

    数组存放在内存中的映射关系

    数组可以是多维的,但是内存空间却是一维的,所以我们就要把多维数组通过一定的映射顺序把它变成一维的,然后存储到内存空间之中。

    在大多数高级编程语言中,多维数组在内存中通常有两种不同的顺序存储方式, 按行优先顺序存储 按列优先顺序存储

    举个例子,以下3行4列的一个二维数组矩阵:

    a1,a2,a3,a4

    b1,b2,b3,b4

    c1,c2,c3,c4

    按行优先顺序存储:

    b2f5ec32c58e8c875efbfc560a8135f8.png

    按列优先顺序存储:

    18a27813170131d84118beb91af52f9d.png

    地址计算

    地址计算的意思就是给定数组下标,求在一维内存空间的地址,从而取出数据。

    我们先来看一维数组的地址计算

    一维数组内的元素只有一个下标,存储方法和普通的线性表一样。

    如一维数组 A = [a1,a2,a3,......ai,.........,an],每个元素占用size个存储单元(就是内存大小),那么元素ai的存储地址为 A[0]的位置 + (i-1)*size

    再来看二维数组的地址计算

    以二维数组Amn为例,首元素为A[0][0],数组中任意元素A[i][j]的地址为:A[0][0]的位置 + (n * (i-1) + (j-1))* size;

    比如:一个5行4列的二维数组A,按行存储,其中每个元素占2个存储单元,首元素地址是1000,求第3行第2列的元素在内存中的地址。

    我们把参数套进公式中,答案 = 1000 + (4 * (3-1) + (2-1)) * 2 = 1018;

    如果把矩阵画在纸上观察就一目了然:

    8ca23c9490b0d881999199d21f9a8eb4.png

    公式的内容就是求出格子数,乘以每个格子所占用的存储单元,再加上首地址。

    矩阵转置

    设计一个算法,实现矩阵A(m*n) 转置为矩阵B(n*m),简单的说,就是行列互换。

    $arr = [ ['张三','男','北京'], ['李四','女','上海'], ['王五','男','广州'],];function transpose($a){ $b = []; for ($i = 0;$i < count($a); $i ++){ for($j = 0;$j < count($a[$i]); $j ++){ $b[$j][$i] = $a[$i][$j]; } } return $b;}$result = transpose($arr);

    结果为:

    $result = [

    ['张三','李四','王五'],

    ['男','女','男'],

    ['北京','上海','广州'],

    ];

    特殊矩阵

    特殊矩阵的压缩存储

    特殊矩阵指的是具有许多相同元素或者零元素,并且这些元素的分布有一定规律性的矩阵。

    这种矩阵如果还使用前面的方式来存储,就会产生大量的空间浪费,为了节省存储空间,可以对这类矩阵采用压缩存储,压缩存储的方式是把那些呈现规律性分布的相同元素只分配一个存储空间,对零元素不分配存储空间。

    三角矩阵

    三角矩阵我们以下三角来做例子,如图所示:

    29e58ea8b0d7122ce573b9290c1ae589.png

    所有空格之中装的数据都是null或者都是同一常量,也就是空格中全都是相同的数据。

    按行方式存储的情况下,一维存储内存空间的大小是:1+2+3+4+5+6+7 = n(n+1)/2 = 7 * (7+1) / 2 = 28,当然,在最后还要加一个存储空间,用来存储上三角中相同的数据。

    那么对于任意元素aij,在一维存储内存空间中的地址仍然是要靠计算格子来得到,先算出占满行的总格子数,再加上当前行的格子数:a[0][0]的位置 + (i * (i+1) / 2 + j) * size;

    我们使用公式来验证一下,a42的所在格子数 = (i * (i+1) / 2 + j) = 4 * 5 / 2 + 2 = 12

    带状矩阵

    带状矩阵也叫做对角矩阵,如图所示:

    4292005b1b2c7cf8b146619aadce5a3d.png

    带状矩阵的特征是:所有非0元素都集中在以主对角线为中心的3条对角线区域,其他区域的元素都为0。

    除了第一行和最后一行仅2个非零元素,其余行都是3个非零元素,换句话说就是每行都是3个非零元素,但是第一行少了1个,最后一行少了1个,所以所需的一维空间大小为:3n - 2;

    那么对于任意一个元素 aij,怎么计算它在内存空间的地址呢?

    经过观察可以得知i和j都在对角线附近,相减后的结果与分布情况分别如下

    j - i = 1;对角线上面

    j - i = 0; 对角线

    j - i = -1;对角线下面

    不管是在对角线的哪个位置,我们都可以使用通用的办法来计算地址,也就是先计算出上面行所占的格子,再加上当前行的格子。

    上面的行数:i,由于行列都是0开头计数,所以上面的行数就是i这个值。

    上面的格子数: 3 * i - 1,减1是因为第一行少一个格子。

    当前行格子数: j - i + 1;根据i和j的关系,我们把相减后的值加1,得到当前行的格子数。

    那么最后aij的内存地址 = a00首地址 + ((3 * i -1) + ( j-i+1)) * size; size为每个数据所占用的存储单元大小。

    比如首地址为1000,每个数据占用2个存储单元,那么a45在内存中的地址 = 1000 + 13 * 2 = 1026;

    稀疏矩阵的压缩存储

    由于特殊矩阵中非零元素的分布是有规律的,所以总是可以找到矩阵元素与一维数组下标的对应关系,但还有一种矩阵,矩阵中大多数元素都为0,一般情况下非零元素个数只占矩阵元素总数的30%以下,并且元素的分布是没有任何规律的,这样的矩阵我们称为稀疏矩阵。

    如果采用常规方法存储稀疏矩阵,就会相当浪费存储空间,因此我们需要只存储非零元素。由于稀疏矩阵中非零元素的分布是没有规律的,所以除了存储非零元素的值之外,我们还需要同时存储非零元素的行、列位置,也就是三元组(i,j,aij)。

    如图:

    60d1dd67036fcf3e967b4a1b2df6346f.png

    所谓三元组,也就是一个矩阵,一个二维数组,每一行都三个列,分别为行号、列号、元素值。

    由于三元组在稀疏矩阵与内存地址间扮演了一个中间人的角色,所以稀疏矩阵进行压缩存储后,便失去了随机存取的特性。

    展开全文
  • 说在前面:1、本帖的三个算法全部采用关系(布尔)矩阵实现,也有大佬用STL模板库中的set和vector实现了,本人学完STL之后会补充set和vector的实现方法。2、本帖采用多组数据输入,如果要求“单组输入数据”,请将: ...

    说在前面:

    1、本帖的三个算法全部采用关系(布尔)矩阵实现,也有大佬用STL模板库中的set和vector实现了,本人学完STL之后会补充set和vector的实现方法。

    2、本帖采用组数据输入,如果要求“组输入数据”,请将:

    while(cin>>n)

    改为:

    cin>>n;

    3、本帖算法采用memset函数赋初值,如果不了解memset的使用方法的话,可以参考:memset()函数及其作用_网络_monk1992的博客-CSDN博客

    注:版权归属原作者,侵删

    4、对于没有学过c++的朋友们,可以将cin、cout分别改成scanf、printf。

    5、每一个算法仅提供一组样例。

    6、算法不一定绝对正确,欢迎各位朋友前来hack。

    7、对本帖中算法输入形式的说明:

    第一行是一个正整数n,表示集合A的元素个数,即A={1,2,3,···,n}(n小于等于20)。

    第二行是一个正整数m(0<m≤n*n),表示关系R中二元组的个数。

    接下去是m行,每行有两个整数a和b,表示二元组<a,b>∈R。

    ----------------------------------------------------

    以下是算法具体内容及解析。

    5.19第一次更新,更改了变量名以及部分不恰当的定义。

    ----------------------------------------------------

    一、自反闭包

    自反闭包的矩阵运算规则:

    关系 R 是自反的当且仅当 R 的关系矩阵的主对角线上全为 1.

    题解:

    签到题难度,都不用判断,令主对角线上全为1,然后输出是1的元素即可.

    以下为完整代码:

    #include

    ----------------------------------------------------

    二、对称闭包

    对称闭包的矩阵运算规则:

    关系 R 是对称的当且仅当 R 的关系矩阵 (rij)n×n 为对称矩阵, 即r[i][j]=r[j][i].

    题解:

    只要理清了规则就很好理解,因为两个对称元素必然都是相同的值,那么对于两个不同的元素而言,直接将他们全部赋为相同的值就ok了.

    关键行(伪)代码为:

    {
          

    以下是完整代码:

    #include

    ----------------------------------------------------

    三、传递闭包

    传递闭包的矩阵运算规则:

    关系 R 是传递的当且仅当在 R 的关系矩阵中, 对任意 i,j,k∈{1,2,··· ,n},若 rij = 1 且 rjk = 1,必有 rik = 1.

    题解:

    设有一个布尔矩阵M是R的关系矩阵,可以对两个布尔矩阵做矩阵乘法,如果M中的a[i][j]=0,必然会对应有M*M的b[i][j]=0.

    也就是说,在a[i][j]=0且b[i][j]!=0的情况下,要满足传递性,只能令a[i][j]=1。即求得了传递闭包。

    所以可以想到对M做乘法(当年上课都教考研题的线性代数终于派上了用场),关键行(伪)代码为:

    {
          

    但是注意,此时需要连续计算两次,因为第一次只是填充了新的元素进去,而新的元素有可能构成新的传递闭包,所以需要连续判断两次。

    以下是完整代码:

    #include

    以上。

    展开全文
  • 这里所说的"运气"呢其实可以根据行列式啊,Ax=0Ax=0Ax=0是否有解啊判断得到,具体操作可以看看我聊消元法的那一篇文章。 但是,高斯消元法存在一个问题,就是它是给人做的,比如给第一行乘个倍数加到另一行,或者将...

    上回我们说到,高斯老哥用消元法解线性方程,大致步骤呢就是给系数矩阵消元,运气好点呢直接整出上三角系数矩阵,得到方程组的唯一解,运气不行呢,消着消着发现整不出上三角,这时就得再讨论方程是有多解还是无解。
    这里所说的"运气"呢其实可以根据行列式啊,Ax=0Ax=0是否有解啊判断得到,具体操作可以看看我聊消元法的那一篇文章。
    但是,高斯消元法存在一个问题,就是它是给人做的,比如给第一行乘个倍数加到另一行,或者将矩阵的两行交换个位置,这些我们手写计算当然没什么问题,但是你让计算机做它就不能忍了,计算机没那么多判断的能力,它就想要一种统一的计算模式和计算次数。ok,那我们就来聊一聊计算机是怎么做这些操作的,顺便我们能够知道为什么有很多科学家对矩阵乘法性能的提高有着孜孜不倦的追求。
    我们先以一种抽象的方式来看看矩阵和列向量相乘,比如

    [134275489][xyz]=x[124]+y[378]+z[459]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}* \begin{bmatrix} x \\ y \\ z \end{bmatrix}= x*\begin{bmatrix} 1 \\ 2 \\ 4 \end{bmatrix}+ y*\begin{bmatrix} 3 \\ 7 \\ 8 \end{bmatrix}+ z*\begin{bmatrix} 4 \\ 5 \\ 9 \end{bmatrix}

    根据第一节所说,系数方阵的三个列向量为三维空间中的三个独立向量,用它们可以组成三维空间的任一向量,[x,y,z][x,y,z]分别为这三个向量的扩展倍数,假如我想知道一倍的[1,2,4][1,2,4]与三倍的[3,7,8][3,7,8]的和向量是什么,只需要给[x,y,z][x,y,z]赋值[1,3,0][1,3,0]就可以了,即

    [134275489] ⁣ ⁣[130] ⁣= ⁣1 ⁣ ⁣[124] ⁣+ ⁣3 ⁣ ⁣[378] ⁣+ ⁣0 ⁣ ⁣[459] ⁣= ⁣[102328]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}\!*\! \begin{bmatrix} 1 \\ 3 \\ 0 \end{bmatrix}\!=\! 1\!*\!\begin{bmatrix} 1 \\ 2 \\ 4 \end{bmatrix}\!+\! 3\!*\!\begin{bmatrix} 3 \\ 7 \\ 8 \end{bmatrix}\!+\! 0\!*\!\begin{bmatrix} 4 \\ 5 \\ 9 \end{bmatrix}\!=\!\begin{bmatrix} 10 \\ 23 \\ 28 \end{bmatrix}

    那么如果我想知道
    [1,2,4][1,2,4]向量与
    负三倍的[1,2,4][1,2,4]与一倍的[3,7,8][3,7,8]的和向量以及
    负四倍的[1,2,4][1,2,4]与一倍的[4,5,9][4,5,9]的和向量
    的组合是什么,就可以运算
    [134275489] ⁣ ⁣[100]=  1 ⁣ ⁣[124] ⁣+ ⁣0 ⁣ ⁣[378] ⁣+ ⁣0 ⁣ ⁣[459] ⁣ ⁣= ⁣[124]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}\!*\! \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix}\enspace= \enspace\;1\!*\!\begin{bmatrix} 1 \\ 2 \\ 4 \end{bmatrix}\!+\! 0\!*\!\begin{bmatrix} 3 \\ 7 \\ 8 \end{bmatrix}\!+\! 0\!*\!\begin{bmatrix} 4 \\ 5 \\ 9 \end{bmatrix}\!\!=\!\begin{bmatrix} 1 \\ 2\\ 4 \end{bmatrix}
    [134275489] ⁣ ⁣[310] ⁣= ⁣3 ⁣ ⁣[124] ⁣+ ⁣1 ⁣ ⁣[378] ⁣+ ⁣0 ⁣ ⁣[459] ⁣ ⁣= ⁣[014]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}\!*\! \begin{bmatrix} -3 \\ 1 \\ 0 \end{bmatrix}\!=\! -3\!*\!\begin{bmatrix} 1 \\ 2 \\ 4 \end{bmatrix}\!+\! 1\!*\!\begin{bmatrix} 3 \\ 7 \\ 8 \end{bmatrix}\!+\! 0\!*\!\begin{bmatrix} 4 \\ 5 \\ 9 \end{bmatrix}\!\!=\!\begin{bmatrix} 0 \\ 1\\ -4 \end{bmatrix}
    [134275489] ⁣ ⁣[401] ⁣= ⁣4 ⁣ ⁣[124] ⁣+ ⁣0 ⁣ ⁣[378] ⁣+ ⁣1 ⁣ ⁣[459] ⁣ ⁣= ⁣[037]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}\!*\! \begin{bmatrix} -4 \\ 0 \\ 1 \end{bmatrix}\!=\! -4\!*\!\begin{bmatrix} 1 \\ 2 \\ 4 \end{bmatrix}\!+\! 0\!*\!\begin{bmatrix} 3 \\ 7 \\ 8 \end{bmatrix}\!+\! 1\!*\!\begin{bmatrix} 4 \\ 5 \\ 9 \end{bmatrix}\!\!=\!\begin{bmatrix} 0 \\ -3\\ -7 \end{bmatrix}

    将计算过程及结果整理一下就可以得到

    [134275489] ⁣ ⁣[134010001] ⁣= ⁣[100213447]\begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}\!*\! \begin{bmatrix} 1&-3&-4\\ 0&1&0\\ 0&0&1 \end{bmatrix}\!=\! \begin{bmatrix} 1 & 0 & 0\\ 2 & 1 & -3 \\ 4 & -4 & -7 \end{bmatrix}

    此时我们会惊奇得发现居然消元了,第一行居然消元了!只不过在列方向,高斯消元法需要的是在行方向做消元,那如果我对行向量能做一些求和之类的操作问题不就解决了吗。而这你也不需要担心,因为有数学大佬已经帮你总结好了,即

    [x,y,z][134275489]=x[1,3,4]+y[2,7,5]+z[4,8,9]\begin{bmatrix} x ,y ,z \end{bmatrix} \begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}=x[1,3,4]+y[2,7,5]+z[4,8,9]

    根据消元步骤先根据pivot1给23行消元,即

    [100210401][134275489]=[134013047]\begin{bmatrix} 1&0&0\\ -2&1&0\\ -4&0&1 \end{bmatrix} \begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}= \begin{bmatrix} 1 & 3 & 4\\ 0 & 1 & -3 \\ 0 & -4 & -7 \end{bmatrix}

    再根据pivot2给第三行消元,即

    [100010041][134013047]=[1340130019]\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 4 & 1 \end{bmatrix} \begin{bmatrix} 1 & 3 & 4\\ 0 & 1 & -3 \\ 0 & -4 & -7 \end{bmatrix}= \begin{bmatrix} 1 & 3 & 4\\ 0 & 1 & -3 \\ 0 & 0 & -19 \end{bmatrix}

    再将最后一行变为1

    [10001000119][1340130019]=[134013001]\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -\dfrac{1}{19} \end{bmatrix} \begin{bmatrix} 1 & 3 & 4\\ 0 & 1 & -3 \\ 0 & 0 & -19 \end{bmatrix}= \begin{bmatrix} 1 & 3 & 4\\ 0 & 1 & -3 \\ 0 & 0 & 1 \end{bmatrix}

    以上我们将消元的过程变为了矩阵乘法,我猜这就是计算机做消元的方法,当然,在消元过程中有时要用到两行交换位置的情况,我们也可以利用矩阵乘得到,比如交换矩阵的前两行

    [010100001][134275489]=[275134489]\begin{bmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 3 & 4\\ 2 & 7 & 5 \\ 4 & 8 & 9 \end{bmatrix}= \begin{bmatrix} 2 & 7 & 5 \\ 1 & 3 & 4\\ 4 & 8 & 9 \end{bmatrix}

    我们将上述给原矩阵做变换的矩阵叫做初等变换矩阵,初等变换矩阵的逆矩阵非常好求,逆矩阵的定义为AA1=EAA^{-1}=E,而初等变换矩阵正是EE经过了简单的运算得到的。比如将第一行乘4并加到第二行的变换矩阵,只要从第二行中减去第一行的4倍就变回了单位阵,也就得到了逆矩阵。,即

    A=[100410001]A1=[100410001]A=\begin{bmatrix} 1 & 0 & 0 \\ 4 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}⇒ A^{-1}=\begin{bmatrix} 1 & 0 & 0 \\ -4 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}

    而交换两行的变换阵的逆矩阵是它本身

    那么更一般的矩阵求逆怎么做呢(已知矩阵可逆),要不怎么说数学家牛逼呢,Gauss-Jordan法使求逆完全可以通过消元来解决,就是这二位
    在这里插入图片描述
    他们表示,假如你想求一个逆矩阵啊,先给原矩阵旁边整一个单位阵,然后给第一个矩阵开始消元,消元过程中单位阵做同样的变换,当原来的矩阵变为单位阵时,单位阵就是原矩阵的逆矩阵,首先是Gauss的消元法创造上三角矩阵

    [13102701][13100121]\begin{bmatrix} 1 & 3 \,|\,1&0\\ 2 & 7 \,|\,0&1 \end{bmatrix}⇒ \begin{bmatrix} 1 & 3 \,|\,1&0\\ 0 & 1 \,|\,-2&1 \end{bmatrix}

    然后jordan说你把这个上三角再倒着消元成单位阵就得到逆矩阵啦

    [13100121][10730121]\begin{bmatrix} 1 & 3 \,|\,1&0\\ 0 & 1 \,|\,-2&1 \end{bmatrix}⇒ \begin{bmatrix} 1 & 0 \,|\,7&-3\\ 0 & 1 \,|\,-2&1 \end{bmatrix}

    不放心的话拿到matlab里验证一下就ok了。
    我们可以看到,化简求逆都是经过矩阵乘来运算,这种较为统一的运算过程可是把计算机爽死了,我们说的解方程啊,矩阵求逆啊到这里都变成了矩阵的乘法运算,而矩阵乘不仅仅只有这一点应用,在空间中一个向量的放大,缩小,平移,旋转都是通过乘矩阵的方式来实现,所以在矩阵乘这个计算上一点点的优化都可能使软件性能发生巨大变化,这也就回答了文章开始的问题,为什么有那么多人不断追求矩阵乘运算性能的提高。微小的改变却能导致巨大的性能变化,这可能就是算法之美吧。

    展开全文
  • 主成分分析(principal component analysis,PCA)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。下面通过一个栗子来进行讨论假设有一组数据包含 个样本...

    主成分分析(principal component analysis,PCA)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。下面通过一个栗子来进行讨论

    假设有一组数据包含

    个样本

    每一个样本

    。现在对样本进行降维,可以使用一个矩阵进行变换得到:

    其中

    ,那么
    就是

    这样,降维的问题就变成了如何得到

    ?首先,试着将
    展开来看看

    每一个

    一样是
    维向量,那么得到这些向量就得到了
    。且因为由于
    是每一个向量与样本进行点积的总和,所以我们应该是出于同样的理由来确定每一个
    ,并且不同的
    之间是线性无关的,即

    现在假设有一个

    ,将它与样本的点积展开:

    由于可以对

    进行缩放,所以约束使其模为1,即
    ),于是得到:

    这样,

    与样本的点积就是样本在
    上的投影

    至于如何进行投影,先来看一个栗子。假设有如下样本:

    1b7c755b62f967e465ad094519649206.png

    我们先找一个极端的栗子来看看

    37087042d3fbc0368c522ffb50191f5e.png

    从上图可以看到,我们选择了一个向量,将样本投影到该向量上,所有的都投影在同一个处了。那么投影后的结果

    ,显然有

    这样将无法对这些样本进行区分,等于只剩下了一个样本,其他的样本的信息都丢失了,而我们的目的是尽可能的保留样本的信息,所以显然不能这样进行投影,那么反其道而行之

    c5432ed22ec5385491c2b57c52ff78be.png

    如上图所示,找到这样一个向量,使所有样本在它上面的投影尽可能的散开,即尽可能的保留“信息”,而“散开”的程度,就可以使用方差来进行衡量了

    为了方便下面的推导,先定义几个变量,首先是样本的均值

    样本的投影的均值

    样本的协方差矩阵

    接着,对样本在

    上的
    投影后的方差进行推导化简

    上面的式子中标红了那一块说明一下,因为

    的结果是一个实数,是一个
    的矩阵,所以它自身等同于它的转置,也就是接下来那一行变换的原因。而对于要求的
    就是

    当然,还要加上之前的约束条件:

    综上,可以通过拉格朗日乘数法构造一个目标函数

    对该函数求偏导

    令偏导为0,得到

    观察上式可以发现,

    的特征值,
    是对应的特征向量,我们只要将所有的特征值排序,然后选择前
    最大的特征值对应的特征向量,即可得到

    至于为什么要取最大的那几个特征值,首先回顾一下我们的目的:投影后的方差最大化

    然后将拉格朗日函数对

    的偏导的结果代入到上式中:

    由此推出,投影后的方差就是协方差矩阵的特征值

    另外,由于

    是一个对称矩阵,所以可以得到如下
    特征分解

    是一个
    的矩阵,而且正好是一个
    正交矩阵,每一列都是一个模为1的特征向量

    我们可以取前

    个列向量来组成

    从而得到降维后的数据

    代码也很简单

    def 

    从上面的讨论中可以知道,降维的本质就是特征分解


    下面,从奇异值分解(Singular Value Decomposition,SVD)的角度来进行降维(SVD在numpy中有函数可用,文末附录也有手工计算方法)。首先,将协方差矩阵进行拆解

    将上式标红部分提出来化简

    其中

    表示含有
    个值的向量,并且所有元素的值都为
    ,然后
    是中心化矩阵,代入协方差矩阵的公式,得到

    然后,对矩阵

    进行奇异值分解:

    并且构造矩阵

    的关系可以的到:

    ,而
    就是
    的左奇异矩阵。最后,代码如下:
    def 
    • 奇异值分解

    与特征分解不同,对于任意一个矩阵

    ,不一定能够进行特征分解,但是一定能够进行奇异值分解

    ,则
    都是正交矩阵,一个叫左奇异矩阵,另一个是右奇异矩阵,而
    是一个对角矩阵,它对角线上的元素的是
    的奇异值

    可以通过如下方法来进行矩阵的奇异值分解,首先构造两个矩阵

    可知这两个矩阵都是对称矩阵,所以能够对它们进行特征分解

    接着,再对这两个矩阵进行特征分解:

    可知,

    同样,对

    进行奇异值分解

    可知

    展开全文
  • 简介混淆矩阵是ROC曲线绘制的基础,同时它也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。一句话解释就是 :混淆矩阵就是分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示...
  • 大纲:介绍范数;介绍条件数;介绍条件数的几何意义;介绍有条件数得出的误差估计;介绍backward stable;... 介绍实际操作中该怎么做:1)判断是否well conditioned,如果不是该怎么调整;2)通过residual判断是否...
  • 入门篇1、什么是计算机语言2、C语言的程序的结构3、运行C语言的步骤与方法4、了解简单的算法5、怎么表示算法6、结构化程序设计的方法提高篇1、顺序程序设计2、数据的表现形式3、C语言的输入输出4、选择结构和条件...
  • 目前在基于 eCognition 的影像分割过程中波段选择和权重设置较为客观的方法...例如黄汀等(2018)通过波段间的协方差矩阵判断各波段包含信息量的大小,利用波段间的相关矩阵判断各波段间的相关性和信息的冗余度,...
  • 但我又不知道具体怎么把这个矩阵提取出来(前提是本身保存信息里确实存在这个矩阵) 希望路过的大神们好心给指个方向,就算只有一句“是的,本身这个矩阵就存在,你去想办法读取出来...
  • 后来改了,用i,j表示计算到的位置,把输出了的值赋值成-1,就能判断边界了,然后就循环就行了。 #include #include int m[1111][1111]; int mm,n; int main() { while(scanf("%d%d",&n,&mm) != EOF) { if(n ...
  • ``` #include "stdafx.h" #include "Process.h" #include "My_Matrix.h" int _tmain(int argc, _TCHAR* argv[]) { ...再增加个判断条件,就是当找到的最小值,仍大于某个阈值时,打印匹配失败。
  • 学校作业:我想开发一个能求n阶行列式和n阶矩阵矩阵的计算器,xml已写是6x6的格子,想首先判断输入几阶方阵反馈n的值,就通过判断第一行到第几个格子有值决定。之后求n阶行列式值用了行列式公式,设了int p[][]的...
  • 什么叫多维数组呢?...怎么判断一个数组是否是一维数组呢?通过count()函数 int count ( mixed $var [, int $mode ] ) -- 计算数组中的单元数目或对象中的属性个数 如果可选的 mode 参数设为 COUNT_RECURS...
  • 计算Armv7a架构理论gflops以及自己写的某个算法的gflops的方法,另外提供了一个脚本可以显示native版矩阵乘法各个尺寸对应的gflops。 1. 前言 之前一直在写一些算法怎么优化,包括算法逻辑甚至是更加底层一些的文章...
  • 第一讲:层次分析法 模型介绍 评价类问题可用打分解决 根据权重表格计算得分 ...一致矩阵怎么计算权重 判断矩阵计算权重 方法1:算数平均法算权重 方法2:几何平均法求权重 方法3特征值求权重
  • 图是由顶点集合和边集合组成的,考虑怎么把这两样东西存储在计算机内存中邻接矩阵用两个数组来表示图。一个一维数组存储图中顶点信息;一个二维数组,称为「邻接矩阵」,用来存储图中的边或弧的信息。无向图设图G有n...
  • 模糊评价模型-以2018美赛为例

    万次阅读 多人点赞 2019-01-24 01:08:19
    文章目录前言什么是模糊数学模型基本步骤模糊评价模型的基本概念模糊集和隶属函数隶属函数的选取隶属矩阵R判断矩阵D根据判断矩阵计算特征权重向量A计算得分检验评价矩阵具体应用确定特征根据原则确定隶属函数计算...
  • 今天在使用matlab计算过程中,发生了一个很奇怪的事。...于是我直接输入矩阵A,把0.000改为0重新计算,就获得想要的结果。我不禁思考,这是怎么回事呢?一顿摸索后,发现最终问题出现在cos(pi/2)这个函数。在mat...
  • 所以用判断两线段相交的方法,我看书看了好长时间,没怎么看懂,直接就把函数移过来了,等以后学计算几何的时候在弄他吧。。   #include #include #include #include using namespace std
  • ❝ 【GiantPandaCV导语】计算Armv7a架构理论gflops以及自己写的某个算法的gflops的方法,另外提供了一个脚本可以显示native版矩阵乘法各个尺寸对应的gflops。 ❞1. 前言之前一直在写一些算法怎么优化,包括算法逻辑...
  • ​在日常的分析中,经常会碰到计算结果为空值的情况,比如计算上年...空值在矩阵和表格中什么都不显示,像这样:而在卡片图中,直接显示大大的两个字:空白,非常扎眼,那怎么能不这样显示呢?常用的做法是将空值以...
  • 问对问题,找对方法,...-上海交大032-047行列式的定义、性质与计算10/03048-078矩阵的定义、运算10/03079-117可逆矩阵、初等变换与秩10/04118-143最大线性无关向量组与秩10/05144-159线性方程组解的判断与求解方法...
  • 首先,暴力解就是以矩阵每一个点为起点,依次判断边长为1,2,3,...,min(矩阵长, 矩阵宽)的区域是否是正方形,显然复杂度是过不了。 很容易知道,上述过程在判断较大区域是否为正方形的时候,并没有用到前面计算的...
  • python实现二维向量旋转问题描述选定基向量计算两向量夹角使用叉积二次判断旋转角大小构建旋转矩阵计算新向量坐标 问题描述 现有一起点在原点 (0,0) 处的向量 (-5,-8)。选择一个基向量 (此基向量可以选任意方向、...
  • 什么是层次分析法?层次分析法,是应用网络系统理论和多目标综合...运用层次分析法构造系统模型时,大体可以分为以下五个步骤:建立层次结构模型构造判断矩阵一致性检验计算各层权重总体一致性检验层次分析法的优点...
  • UVa201 Squares(正方形)

    2019-10-10 20:02:49
    思路:关键是怎么判断存在正方形,创建两个矩阵,一个是计算点(i, j)右边最多连着几个点;另外一个是计算点(i, j)下边最多连着几个点。然后比较就可以了。 #include <stdio.h> #include <string.h> #...
  • 1210: OY问题 [搜索]

    2017-04-23 21:24:08
    题目描述 OY是什么意思?那么oyt你知不知道呢(这拼音首字母真...那么问题来了,给出这样的01矩阵,你能否判断它是“O”还是“Y”呢?你可能会说这太简单了(应该会说吧……),所以为了加大难度,给出矩阵所展示的图
  • POJ1094 Sorting It All Out

    2021-01-17 19:16:34
    挺裸的Floyd,比较傻X的是我纠结了好久怎么判断和输出正确的关系…… 直接统计矩阵的小于出现次数,如果等于n∗(n−1)/2n*(n-1)/2n∗(n−1)/2说明所有关系都判断出来了;输出的话,计算第iii行有多少个小于,n-这个...
  • 怎么说呢,这个题还是很简单的,循环遍历矩阵,每个位置上的4个数[ i ][ j ] ,[ i + 1][ j ], [ i ][ j + 1], [i + 1][j + 1].对应的字符+1,判断是不是f,a,c,e。如果是cnt++,然后ok清零 如果不是ok直接清零,...
  • 1210: OY问题 [搜索]题目描述OY是什么意思?那么oyt你知不知道呢?...那么问题来了,给出这样的01矩阵,你能否判断它是“O”还是“Y”呢?你可能会说这太简单了(应该会说吧……),所以为了加大难...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

判断矩阵怎么计算