矩阵

海森矩阵和半正定矩阵

折月煮酒 提交于 2019-12-10 04:17:56
多元函数的Hessian矩阵就类似一元函数的二阶导。 多元函数Hessian矩阵半正定就相当于一元函数二阶导非负,半负定就相当于一元函数二阶导非正。如果这个类比成立的话,凸函数的Hessian恒半正定就非常容易理解了——这是一元凸函数二阶导必非负的多元拓展。 至于为什么这个类是有道理的,你要这么看。对一元函数f(x)来说,就极值而言,一阶导为0是极值点的必要但不充分条件,一阶导为0切二阶导非负是极小值的充要条件。 为什么呢,因为有泰勒展开 。如果一阶导为0,二阶导非负,dx不论是多少,f(x)一定不比f(x0)小。 你把多元函数也个泰勒展开,主要区别在于: 1) 二阶导变成了Hessian。 2) 以前只要考虑x怎么变,现在还要考虑y怎么变,x和y怎么一起变,头疼了很多。 以二元为例, 从一元的情况类比过来,如果一阶导为0,是不是极小值完全取决于不同的dx, dy下,能不能做到最后一项一直非负。 只有对于任意 , 一直非负的情况,我们才能说这是极小值。如果 一直非正,这就是极大值。如果它一会正一会负,就是鞍点。 然后“对于任意 , 一直非负”这是啥?半正定的定义嘛!它就是这么引出来的,也是我们为什么需要半正定这个概念的原因 我们首先假设 函数在定义域上连续 函数在定义域上二阶可导 现在要证明的是: definition 1st-order condition 1st-order

主成分分析(PCA)原理总结

穿精又带淫゛_ 提交于 2019-12-10 04:13:48
    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA,下面我们就对PCA的原理做一个总结。 1. PCA的思想     PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据$(x^{(1)},x^{(2)},...,x^{(m)})$。我们希望将这m个数据的维度从n维降到n'维,希望这m个n'维的数据集尽可能的代表原始数据集。我们知道数据从n维降到n'维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这n'维的数据尽可能表示原来的数据呢?     我们先看看最简单的情况,也就是n=2,n'=1,也就是将数据从二维降维到一维。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,$u_1$和$u_2$,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出,$u_1$比$u_2$好。     为什么$u_1$比$u_2$好呢?可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。     假如我们把n'从1维推广到任意维,则我们的希望降维的标准为

卡尔曼滤波(Kalman filter)

戏子无情 提交于 2019-12-10 03:00:08
参考 : https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2 卡尔曼滤波模型 : 其中噪声服从 假设初始状态以及每一时刻的噪声{ x 0 , w 1 , ..., w k , v 1 ... v k }都互相独立. 卡尔曼滤波器 两个 状态 变量: , 在时刻 k 的状态的估计 , 后验 估计误差协方差矩阵,度量估计值的精确程度 预测 (预测状态) (预测估计协方差矩阵) 更新 三个辅助变量 (测量余量) (测量余量协方差) (最优卡尔曼增益) 更新滤波器变量 x 与 P : (更新的状态估计) (更新的协方差估计) 以上是kalman的流程(from wiki),下面是具体的推导过程 具体推导 这边用的是不一样的记号(MIT的lecture) 然后,我们有 最优卡尔曼增益 上面的就是 最优卡尔曼增益 ,所以有 例子 假设一辆小车,我们值观测到了位置,我们用kalman滤波去估计速度 N = 100 z = np.arange(N) + 0.0 # 观测到的位置,做匀速直线运动, 0, 1, 2, 3,... noise = np.random.randn(N) # 观测的位置加上1的噪声 z += noise X = np.array([5, 5]).reshape(-1, 1)

顺时针打印矩阵(python)

荒凉一梦 提交于 2019-12-09 20:13:17
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 1 # -*- coding:utf-8 -*- 2 class Solution: 3 # matrix类型为二维列表,需要返回列表 4 def printMatrix(self, matrix): 5 # write code here 6 def help(topRow,topCol,botRow,botCol): 7 8 if topRow == botRow:#只有一行: 9 while topCol <=botCol: 10 res.append(matrix[topRow][topCol]) 11 topCol+=1 12 elif topCol == botCol:#只有一行 13 while topRow<=botRow: 14 res.append(matrix[topRow][topCol]) 15 topRow+=1 16 else: 17 curCol=topCol 18 curRow=topRow 19 while curCol<botCol: 20 res.append

01背包,二维数组存储结构

那年仲夏 提交于 2019-12-09 18:21:19
# include <bits/stdc++.h> using namespace std ; # define NUM 50 # define CAP 1500 int v [ NUM ] ; int w [ NUM ] ; int p [ NUM ] [ CAP ] ; int main ( ) { int W , n ; while ( scanf ( "%d" , & W ) && W ) { scanf ( "%d" , & n ) ; for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d%d" , & w [ i ] , & v [ i ] ) ; memset ( p , 0 , sizeof ( p ) ) ; for ( int i = 1 ; i <= n ; i ++ ) for ( int c = W ; c > 0 ; c -- ) if ( w [ i ] <= c ) p [ i ] [ c ] = max ( p [ i - 1 ] [ c ] , p [ i - 1 ] [ c - w [ i ] ] + v [ i ] ) ; else p [ i ] [ c ] = p [ i - 1 ] [ c ] ; printf ( "%d\n" , p [ n ] [ W ] ) ; //输出最优值 }

[ch04-04] 多样本单特征值计算

梦想与她 提交于 2019-12-09 17:33:50
系列博客,原文在笔者所维护的github上: https://aka.ms/beginnerAI , 点击star加星不要吝啬,星越多笔者越努力。 4.4 多样本单特征值计算 在前面的代码中,我们一直使用单样本计算来实现神经网络的训练过程,但是单样本计算有一些缺点: 很有可能前后两个相邻的样本,会对反向传播产生相反的作用而互相抵消。假设样本1造成了误差为0.5,w的梯度计算结果是0.1;紧接着样本2造成的误差为-0.5,w的梯度计算结果是-0.1,那么前后两次更新w就会产生互相抵消的作用。 在样本数据量大时,逐个计算会花费很长的时间。由于我们在本例中样本量不大(200个样本),所以计算速度很快,觉察不到这一点。在实际的工程实践中,动辄10万甚至100万的数据量,轮询一次要花费很长的时间。 如果使用多样本计算,就要涉及到矩阵运算了,而所有的深度学习框架,都对矩阵运算做了优化,会大幅提升运算速度。打个比方:如果200个样本,循环计算一次需要2秒的话,那么把200个样本打包成矩阵,做一次计算也许只需要0.1秒。 下面我们来看看多样本运算会对代码实现有什么影响,假设我们一次用3个样本来参与计算,每个样本只有1个特征值。 4.4.1 前向计算 由于有多个样本同时计算,所以我们使用 \(x_i\) 表示第 \(i\) 个样本,X是样本组成的矩阵,Z是计算结果矩阵,w和b都是标量: \[ Z =

PHP:根据二维数组中的某个字段进行排序

蹲街弑〆低调 提交于 2019-12-09 16:15:28
转载 作者: 申文哲 出处: http://www.cnblogs.com/wenzheshen/ 首先了解下以下两个函数: 1.array_column() 返回输入数组中某个单一列的值。 2.array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多 个值相同,它将对下一个数组进行排序。 具体实现代码实例: <?php $data = array( array( 'id' => 5698, 'first_name' => 'Bill', 'last_name' => 'Gates', ), array( 'id' => 4767, 'first_name' => 'Steve', 'last_name' => 'Aobs', ), array( 'id' => 3809, 'first_name' => 'Mark', 'last_name' => 'Zuckerberg', ) ); //根据字段last_name对数组$data进行降序排列 $last_names = array_column($data,'last_name'); array_multisort($last_names,SORT_DESC,$data); var_dump($data); ?> 首先了解下以下两个函数: 1

矩阵中的路径

这一生的挚爱 提交于 2019-12-09 15:30:04
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 注意: 输入的路径不为空; 所有出现的字符均为大写英文字母; 样例 matrix= [ [“A”,“B”,“C”,“E”], [“S”,“F”,“C”,“S”], [“A”,“D”,“E”,“E”] ] str=“BCCE” , return “true” str=“ASAE” , return “false” class Solution { public : bool hasPath ( vector < vector < char >> & matrix , string & str ) { for ( int i = 0 ; i < matrix . size ( ) ; i ++ ) { for ( int j = 0 ; j < matrix [ i ] . size ( ) ; j ++ ) { if ( dfs ( matrix , str , 0 , i , j ) ) { return true ; } } } return false ; } bool dfs ( vector < vector < char >> &

垒骰子---蓝桥杯---矩阵快速幂---C++

半城伤御伤魂 提交于 2019-12-09 14:18:14
题目描述: 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。 假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。 两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。 由于方案数可能过多,请输出模 10^9 + 7 的结果。 不要小看了 atm 的骰子数量哦~ 「输入格式」 第一行两个整数 n m n表示骰子数目 接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。 「输出格式」 一行一个数,表示答案模 10^9 + 7 的结果。 「样例输入」 2 1 1 2 「样例输出」 544 「数据范围」 对于 30% 的数据:n <= 5 对于 60% 的数据:n <= 100 对于 100% 的数据:0 < n <= 10^9, m <= 36 思路 一开始完全不知道矩阵快速幂有什么用,直到昨天吃了亏,果然,还是刷题刷的少啊,我的线代真是学了浪费= =。 通过邻接矩阵来保存第一个骰子到第n个骰子两个状态的连通性即可能性, 通过矩阵乘法来实现状态堆积

矩阵转置

江枫思渺然 提交于 2019-12-09 13:34:13
Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N*N的矩阵,输出它的转置矩阵。 Input 第一行为整数N(1≤N≤100)。 接着是一个N*N的矩阵。 Output 转置矩阵。 Sample Input 2 1 2 1 2 Sample Output 1 1 2 2 Hint Source ZJGSU **本题的核心语句为b[j][i] = a[i][j]; # include <stdio.h> # include <stdlib.h> int main ( ) { int n ; int a [ 100 ] [ 100 ] , b [ 100 ] [ 100 ] ; //定义两个数组:a数组为存放原数据,b数组为转置后的数组; int i , j ; scanf ( "%d" , & n ) ; for ( i = 0 ; i < n ; i ++ ) { for ( j = 0 ; j < n ; j ++ ) { scanf ( "%d" , & a [ i ] [ j ] ) ; //输入矩阵数据 } } for ( i = 0 ; i < n ; i ++ ) { for ( j = 0 ; j < n ; j ++ ) { b [ j ] [ i ] = a [ i ] [ j ]