精华内容
下载资源
问答
  • 关于Hessian矩阵

    千次阅读 2016-03-23 16:45:19
    Hessian矩阵是和二阶导数相关的东东,经常在Taylor二次展开、Newton法等出没。以前一直以为它就是一个普通的二次求导呗,直到有一天看一篇文献十分费解。现在终于恍然大悟,没有注意到陷阱! 1. 变量是向量x:...
    Hessian矩阵是和二阶导数相关的东东,经常在Taylor二次展开、Newton法等出没。以前一直以为它就是一个普通的二次求导呗,直到有一天看一篇文献十分费解。现在终于恍然大悟,没有注意到陷阱!

    1. 变量是向量x:(注意f(x)是实值函数哦)

    一阶导数:

                                       

    二阶导数: 也就是Hessian矩阵,实际上是一阶导数再求导,现在是向量求导,而不是实值求导!

              

    (注意:一阶导数和二阶导数的维度变化)

    2.变量是向量 

    一阶导数:

              

    二阶导数:(注意此时是矩阵值函数对矩阵求导!)

    在这里,我们要先介绍矩阵值函数矩阵求导的定义形式:

    定义1:

    是一个矩阵值函数,其中是F(X)的第ij个元素,是一个值函数。现定义F(X)对矩阵变量X的导数为

    所以(注意:维度变大了!)。

    现在我们回到二阶导数上,定义如下啦:


    (二阶导数维度一定变大!所以Newton法里Hessian矩阵的逆一般不好求!)

    展开全文
  • 关于矩阵比较大小的故事

    千次阅读 2016-11-30 17:05:27
    以为这个博客会永远的荒芜下去…没想到这时候可以用来自己做一些关于代码作业的小的记录用。做好了几年以后回头不可思议的看着负基础的自己认真的记录这些可能很简单的事情的准备,开始吧。 题目部分//主函数部分 ...

    写在前面

    以为这个博客会永远的荒芜下去…没想到这时候可以用来自己做一些关于代码作业的小的记录用。做好了几年以后回头不可思议的看着负基础的自己认真的记录这些可能很简单的事情的准备,开始吧。

    题目部分

    //主函数部分 
    int main() {
      size_t total = 0, size = 0;
      scanf("%zu%zu", &total, &size);
      int matrixArr[MAX_TOTAL][MAX_SIZE][MAX_SIZE] = {};
      for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
        inputMatrices(matrixArr[matrixIndex],size);
      }
      qsort_r(matrixArr, total, sizeof(matrixArr[0]), &cmpMatrices, &size);
      for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
        printMatrices(matrixArr[matrixIndex], size);
      }
      return 0;
    }
    • 首先是过编译的问题:传入的指针到底如何匹配函数的形参呢。其实回头看来传入的就是一个简单的数组首元素的指针而已。所以在函数形参中写arry[]就已经足够了,如果是一行或者一张表的指针,是需要定义如int *ptr[num]的…唔,其实是很简单的问题。多维数组指针的应用还需要多了解啊。
    • 传入了一个void型的指针,强制转换类型才能对其进行递增递减的操作。大概是因为递增递减是要看数据类型来增加字节数的,所以没有明确的数据类型,就不知道加一时要偏移多少个字节。
    • 还有qsort_r这个陌生的函数,第四个参数是指向定义比较大小规则的函数的指针,而第五个参数是要用的size的地址,在写比较大小的函数的时候也要先强制转换数据类型才能取到里面的值。
    • 还有为了代码更加具有可移植性的size_t。记一下他的定义所在的头文件:stddef.h。

    声明部分

    #define MAX_TOTAL 10
    #define MAX_SIZE 4
    #include <stddef.h>
    
    //.h里面的声明内容 
    void inputMatrices(int matrixArr[],size_t size);
    void printMatrices(int matrixArr[],size_t size);
    int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr);
    • 大概是…函数声明怎么声明各种形参的格式的问题。数据类型+形参的名字。很不熟练啊。返回值类型也要注意。

    函数定义的部分

     //.c里面的定义内容
    #include <stddef.h>
    
    void inputMatrices(int matrixArr[],size_t size){
        int x=0,y=0,count=0;
        for(x=0;x<size;x++){
            for(y=0;y<size;y++){
                scanf("%d",(matrixArr+count++));
            }
        }
        getchar();
        return;
    }
    
    void printMatrices(int matrixArr[],size_t size){
        int x=0,y=0,count=0;
        for(x=0;x<size;x++){
            for(y=0;y<size-1;y++){
                printf("%d ",*(matrixArr+count++));
            }
            printf("%d\n",*(matrixArr+count++));
        }
        printf("\n");
        return;
    }
    
    int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr){
        size_t *matrixSizePtr = (size_t *)sizePtr;
        size_t matrixSize = *matrixSizePtr;
        int * use;
        int usenum=0,count=0;
        int sumfirst=0,sumsecond=0,x=0,y=0;
        for(x=0;x<matrixSize;x++){
            for(y=0;y<matrixSize;y++){
                if(x==y || x+y==matrixSize-1){
                use = ((int *)(firstMatrixPtr)+count++);
                usenum = *use;
                sumfirst+=usenum;}
                else count++;
            }
        }
        count=0;
        for(x=0;x<matrixSize;x++){
            for(y=0;y<matrixSize;y++){
                if(x==y || x+y==matrixSize-1){
                use = ((int *)(secondMatrixPtr)+count++);
                usenum = *use;      
                sumsecond+=usenum;}
                else count++;
            }
        }
        if(sumfirst==sumsecond){
            return 0;
        }else if(sumfirst>sumsecond){
            return 1;
        }else{
            return -1;
        }
    }
    • 首先是一个强制转换类型再偏移指针的问题!
    • 还有一个思维上的坑点:在main函数中,定义了的一张张数组表都是4x4形式的,所以传入的数组表也是4x4形式的。如果输入的数组小于4x4的规模,这张表中就会有空出来的位置。那么…空在哪里呢。按一瞬间的反应来说,一定是空出了右边和下面,然后数字按矩阵排好。这时候输入输出以及判断大小的函数都要有跳过那些空出来的位置才可以得到正确的sum值。然而…
      完全没有考虑到还有空位的我直接把输入的矩阵的数据连续储存起来,虽然在形式上这些数字看起来完全不是一个矩阵,但是只要输入输出和判断大小的函数中保持一样的操作地址的思维,用x、y递增来把这些连续数字看成正方形的矩阵,也是可以得到正解的…
      如果一开始我就知道他传入的是4x4的矩阵…我肯定也会努力去凑出矩阵看上去要排列的样子。嘛…这说明有些时候虽然数据连续,但是用循环也可以把他们“看成”各种各样的排列的形状吧。数据结构可能也是这么一件事情吧…虽然大家都是被连续存储在一条内存空间里面,但是有了其他人为添加的变量限制,以及语句的功能,才成为了想象中不同的结构类型。
      …好像说了不得了的话。

    最后

    希望自己能常常记起来有这么一个博客呢…不要偷懒,把学到的东西都写一写吧。

    展开全文
  • matplotlib画混淆矩阵正确率曲线

    千次阅读 2019-03-22 01:18:12
    混淆矩阵 找不到参看的那篇博客啦~~希望原博主不要讨伐我 #!/usr/bin/python3.5 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['FangS...

         今天很兴奋,再来一篇庆祝一下~~~

     

    混淆矩阵    

    找不到参看的那篇博客啦~~希望原博主不要讨伐我

    #!/usr/bin/python3.5
    # -*- coding: utf-8 -*-
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['FangSong']  #可显示中文字符
    plt.rcParams['axes.unicode_minus']=False
    
    classes = ['a','b','c','d','e','f','g']
    confusion_matrix = np.array([(99,1,2,2,0,0,6),(1,98,7,6,2,1,1),(0,0,86,0,0,2,0),(0,0,0,86,1,0,0),(0,0,0,1,94,1,0),(0,1,5,1,0,96,8),(0,0,0,4,3,0,85)],dtype=np.float64)
    
    plt.imshow(confusion_matrix, interpolation='nearest', cmap=plt.cm.Oranges)  #按照像素显示出矩阵
    plt.title('混淆矩阵')
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=-45)
    plt.yticks(tick_marks, classes)
    
    thresh = confusion_matrix.max() / 2.
    #iters = [[i,j] for i in range(len(classes)) for j in range((classes))]
    #ij配对,遍历矩阵迭代器
    iters = np.reshape([[[i,j] for j in range(7)] for i in range(7)],(confusion_matrix.size,2))
    for i, j in iters:
        plt.text(j, i, format(confusion_matrix[i, j]),fontsize=7)   #显示对应的数字
    
    plt.ylabel('真实类别')
    plt.xlabel('预测类别')
    plt.tight_layout()
    plt.show()

     

     

    正确率曲线

     

        fig ,ax= plt.subplots()
        plt.plot(np.arange(iterations), fig_acc,'b')
        plt.plot(np.arange(iterations), fig_realacc, 'r')
        ax.set_xlabel('迭代次数')
        ax.set_ylabel('正确率(%)')
    
        labels = ["训练正确率", "测试正确率"]
        # labels = [l.get_label() for l in lns]
        plt.legend( labels, loc=7)
        plt.show()

    睡啦睡啦~~  

    展开全文
  • MATLAB 对矩阵的操作

    千次阅读 2019-01-06 21:30:35
    inv(A):对矩阵进行求逆 det(A):对矩阵求行列式 rank(A):求矩阵的秩 eig(A):求矩阵的特征值和特征向量 trace(A):求矩阵的迹,就是主角元素之和 rref(A):把A化成约化阶梯型 svd(A):把...

    1.常见矩阵函数运算

    2.矩阵翻转

    3.矩阵抽取

     

     

    矩阵函数运算:

    inv(A):对矩阵进行求逆

    det(A):对矩阵求行列式

    rank(A):求矩阵的秩

    eig(A):求矩阵的特征值和特征向量

    trace(A):求矩阵的迹,就是主对角元素之和

    rref(A):把A化成约化阶梯型

    svd(A):把矩阵进行奇异值分解

    cond(A):求矩阵的条件数(啥是条件数,我不太清楚)

    对矩阵的一些特殊操作:

    对矩阵变维有两种方法:1.“:” ,主要针对两个矩阵进行变维,前提:两个矩阵事先定义好维数

     a=1:24

    a =

      1 至 19 列

         1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19

      20 至 24 列

        20    21    22    23    24

    >> c=ones(4,6)

    c =

         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1
         1     1     1     1     1     1

    >> c(:)=a(:)

    c =

         1     5     9    13    17    21
         2     6    10    14    18    22
         3     7    11    15    19    23
         4     8    12    16    20    24

    2.reshape函数

     b=reshape(a,3,8)

    b =

         1     4     7    10    13    16    19    22
         2     5     8    11    14    17    20    23
         3     6     9    12    15    18    21    24

     

     

    矩阵翻转:

    有rot90、fliplr、flipud和flipdim函数。

    rot90(A):将A逆时针翻转90度。

    rot90(A,K):将A逆时针翻转90*K度。

    fliplr(A):将A左右翻转。

    flipud(A):将A上下翻转。

    flipdim(A,dim):将A绕dim维翻转,dim为1时表示行,为2时表示列。

    b =

         1     4     7    10
         2     5     8    11
         3     6     9    12

    >> rot90(b)

    ans =

        10    11    12
         7     8     9
         4     5     6
         1     2     3

    >> rot90(b,2)

    ans =

        12     9     6     3
        11     8     5     2
        10     7     4     1

    >> fliplr(b)

    ans =

        10     7     4     1
        11     8     5     2
        12     9     6     3

    >> flipud(b)

    ans =

         3     6     9    12
         2     5     8    11
         1     4     7    10

    >> flipdim(b,1)

    ans =

         3     6     9    12
         2     5     8    11
         1     4     7    10

    >> flipdim(b,2)

    ans =

        10     7     4     1
        11     8     5     2
        12     9     6     3

     

    常见的矩阵抽取函数:

    有diag、tril、triu函数。

    diag(X,k)表示抽取矩阵X的第k条对角线上元素构成向量。k为零时表示抽取主对角线上元素。

    diag(V,k)表示生成一个n阶对角阵,矩阵第k条对角线上的元素为向量V。

    tril(X,k)提取X的第k条对角线下面的部分,生成下三角矩阵。

    triu(X,k)提取X的第k条对角线上面的部分,生成上三角矩阵。

    b =

         1     5     9    13    17    21    25    29    33
         2     6    10    14    18    22    26    30    34
         3     7    11    15    19    23    27    31    35
         4     8    12    16    20    24    28    32    36

    >> diag(b,2)

    ans =

         9
        14
        19
        24

    >> diag(b)

    ans =

         1
         6
        11
        16

    >> diag(b,1)

    ans =

         5
        10
        15
        20

    >> v=[1 1 1 1];
    >> diag(v,2)

    ans =

         0     0     1     0     0     0
         0     0     0     1     0     0
         0     0     0     0     1     0
         0     0     0     0     0     1
         0     0     0     0     0     0
         0     0     0     0     0     0

    >> tril(b,1)

    ans =

         1     5     0     0     0     0     0     0     0
         2     6    10     0     0     0     0     0     0
         3     7    11    15     0     0     0     0     0
         4     8    12    16    20     0     0     0     0

    >> triu(b,2)

    ans =

         0     0     9    13    17    21    25    29    33
         0     0     0    14    18    22    26    30    34
         0     0     0     0    19    23    27    31    35
         0     0     0     0     0    24    28    32    36

     

     

     

     

     

    展开全文
  • 大家都知道, matlab有个非常方便的工作区功能, 如下: 点击矩阵变量可以方便的查看每个元素: 那么, 作为python的编辑...如果是实数矩阵的话, 右上角会直接弹出矩阵的每个元素的视图, 和matlab中基本一样。 但如果
  • 混淆矩阵、F1-Score

    万次阅读 2018-02-23 21:28:33
    (一)混淆矩阵 混淆矩阵是除了ROC曲线和AUC之外的另一个判断分类好坏程度的方法。下面给出二分类的混淆矩阵 Predicted as Positive Predicted as Negative Labeled as Positive True Positive(TP)...
  • 文章目录图片转化成矩阵方法一:方法二:矩阵转换图片错误代码段正确代码段 图片转化成矩阵 方法一: 使用 PIL 的方法 + img.getdata() 提取数据 + np.array() 的转换 最后得到的结果是个二维数组 from PIL ...
  • 关于混淆矩阵、ROC、AUC的问题

    千次阅读 2018-09-29 15:45:14
    相信关于混淆矩阵、ROC和AUC的问题一直困扰着大家,要想搞懂ROC和AUC,首先要明白混淆矩阵是什么。 混淆矩阵 混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下: 称预测类别为1的为Positive...
  • 矩阵

    千次阅读 2014-04-11 22:24:06
    写这些体会的目的,是希望能够像我一样的比较愚钝的学生能有所帮助,希望能够让这些教材中抽象的概念能够在他们的脑海中产生直观的生动的印象,帮助和我一样的学弱更好的理解数学概念,体会数学之美。  在此声明...
  • 理解矩阵矩阵背后的现实意义

    千次阅读 多人点赞 2018-01-15 16:28:19
    这是很早以前已经看过的,最近无意中又把保存的文章翻出来时,想起很多朋友问过矩阵,虽对矩阵似懂非懂,但却很想弄懂它,希望这几篇文章能帮你一下,故转之: 线性代数课程,无论你从行列式入手还是直接从矩阵入手...
  • 线性代数笔记8:矩阵角化

    万次阅读 多人点赞 2018-04-02 21:33:36
    本文主要讲矩阵对角化的证明及应用。 矩阵对角化条件 定义一:若存在可逆矩阵SSS,使得S−1ASS−1ASS^{-1}AS为矩阵,则称为矩阵AAA是可角化的(diagonalized)。 设n×nn×nn\times n矩阵有nnn个线性...
  • 出现这个状况主要是因为在使用matplotlib绘图时,语句的逻辑顺序有问题。 # 错误的语句顺序 plt.imshow(cm, interpolation='nearest', cmap=cmap) ...正确的语句顺序对应的混淆矩阵图如下:  
  • 矩阵论(七):投影矩阵

    万次阅读 多人点赞 2019-01-18 23:32:03
    广义逆矩阵 投影矩阵 投影的定义 投影矩阵 求法 性质 投影矩阵的应用 从投影角度看广义逆 从投影角度看最小二乘 。。。 投影的定义 什么是投影?下图给出了投影的直观理解: 如图是在R3R^3R3空间中,一条...
  • 在python环境编程下做多分类问题要画混淆矩阵...其中一个又是可以正常显示出混淆矩阵,如下右边图所示(截去了坐标标题信息),经过比较发现不能正常显示混淆矩阵的matplotlab安装库版本是3.1.1,而另外一个能正常显...
  • 理解矩阵

    千次阅读 2017-09-24 15:32:16
    这里看到的这篇“理解矩阵”的文章进行总结,文章从一种比较不一样的角度对矩阵进行了解释,觉得还是挺有意思的,所以在这里记录一下,主要还是原文进行删减以及加上自己的理解。 线性代数的重要性:用瑞典数学...
  • 1、判断当前给出的最大秩分解是否正确 2、给出AAA的M-P广义逆A+A^+A+ 3、判断矩阵是否相容 4、若矩阵相容则输出Ax=bAx=bAx=b的最小范数解和通解 5、若不相容则输出Ax=bAx=bAx=b的最小二乘解、通解和最佳逼近解 \qua...
  • 非负矩阵分解NMF

    万次阅读 多人点赞 2016-08-03 12:37:26
    Non-negative matrix factorization)NMF的发展及原理 著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung数学中非负矩阵研究的突出成果。该文提出了一种新的矩阵分解思想——非负矩阵分解(Non
  • 关于矩阵类的C++实现

    千次阅读 2015-06-18 15:34:27
    和同事忙了三天,终于把实现的矩阵类在LINUX环境下编译成功且运行结果正确,并且意外的是实现的 + - * / 二元操作符的现实性运用。心情大好!matrix.h#pragma once #include #include #include #include ...
  • 极几何及单应矩阵

    千次阅读 多人点赞 2018-06-18 13:34:09
    1.本质矩阵用两个相机在不同位置拍摄同一物体,两张照片中的景物有重叠部分,那么理论上这两张照片会存在一定的对应关系,本节任务是探索如何描述他们之间的对应关系--极几何,属于立体视觉的部分。关于相机成像...
  • 第三周我们计划刷关于矩阵的题目。 此次参与刷题的共五人(嘟嘟、琼琼、东东、大智、博主)。 首次把宿舍的白板用上了。。 正题 28.搜索二维矩阵 每行都是有序的,且下一行第一个元素比上一行最后...
  • 什么是矩阵的迹

    千次阅读 2018-07-21 08:13:09
    在学习andrew ng的深度学习公开课里,可看到一段与数据的矩阵...在线性代数中,一个n×n的矩阵A的主角线(从左上方至右下方的角线)上各个元素的总和被称为矩阵A的迹(或迹数),一般记作tr(A)。 例子如...
  • 1.混淆矩阵 对于二分类问题,可将样例根据其真实类别与分类器预测类别的组合划分为: 真正例(true positive):将一个正例正确判断为正例 假正例(false positive):将一个反例错误判断为正例 真反例(true ...
  • 特征向量角化一个矩阵:3、假设n×nn\times n矩阵有nn个线性无关的特征向量,如果这些向量是矩阵SS的列,那么S−1ASS^{-1}AS是一个矩阵Λ\Lambda,AA的特征值在Λ\Lambda的角线上: S−1AS=Λ=⎡⎣⎢⎢⎢⎢...
  • 混淆矩阵

    万次阅读 2016-01-22 10:06:09
    论文中咱们会经常看见一类图,比如说多类别文类问题,那么每一个类别分到其他类别都有一些数据,但是分到自己类别的毕竟多,这样计算百分比之后就形成了一个矩阵,如果分类正确率高的话,那么角线上的元素的值,也...
  • 多数高中生学习矩阵矩阵乘法,但是他们往往不知道为什么矩阵乘法是这样工作的。 添加矩阵很简单: 只需添加相应的条目。 然而,矩阵乘法并不是这样工作的,对于一个不理解矩阵背后理论的人来说,这种矩阵相乘的...
  • 按键矩阵

    千次阅读 2016-07-26 11:58:46
    矩阵键盘肯定是每一个单片机学习者都接触过的题目。 一般地 4*4 矩阵键盘线路如下图所示,A-D 输出端口,1-3 输入端口: 使用原理也简单,如下图。 当 B 端输出高电平,B3 键 pressed,即在 3 端可以检测到高...
  • UC矩阵

    万次阅读 多人点赞 2010-01-06 16:54:00
    过程/数据矩阵(U/C矩阵) 目录[隐藏]1 什么是U/C矩阵 2 U/C矩阵正确性的检验 3 利用U/C矩阵方法划分子系统的步骤 4 U/C矩阵的主要功能 5 U/C矩阵的特点[1] 6 U/C矩阵的案例分析[2] 7 参考文献 [编辑]什么是U/C...
  • 关于OpenGL和OSG的矩阵

    千次阅读 2011-10-08 13:55:55
    矩阵真的是一个很神奇的数学工具, 虽然单纯从数学上看, 它并没有什么特别的意义, 但一旦用到空间中的坐标变换,它就“一遇风云便成龙”, 大显神威了。简单的工具实现了复杂的功能,便预示着要理解它我们还是要花...
  • 矩阵相乘详解

    万次阅读 多人点赞 2020-02-17 15:39:48
    首先要知道矩阵是怎么相乘的 首先,两个矩阵要是想相乘需要...a矩阵是3 * 3(3行3列)的矩阵,b矩阵是3 * 2(3行2列)的矩阵,满足第一个矩阵的列数等于第二个矩阵的行数。那我们就可以相乘了 一个m*n的矩阵和一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 145,674
精华内容 58,269
关键字:

关于成对比较矩阵正确的是