正规方程之矩阵求导(Matrix derivatives)

1、背景

最近,开始学习机器学习之旅。我的学习方式是:跟着斯坦福公开课Andrew Ng的讲义和视屏开始学习。

下面,简单介绍一下线性回归下面的普通方程之矩阵求导。
对应英文章节:Linear Regression-->The normal equations-->Matrix derivatives


2、矩阵求导公式

AtrAB=BT ∇ A t r A B = B T                                        (1) ( 1 )

ATf(A)=(Af(A))T ∇ A T f ( A ) = ( ∇ A f ( A ) ) T                          (2) ( 2 )

AtrABATC=CAB+CTABT ∇ A t r A B A T C = C A B + C T A B T         (3) ( 3 )

A|A|=|A|(A1)T ∇ A | A | = | A | ( A − 1 ) T                               (4) ( 4 )


3、公式推导

3.1 公式(1)的推导


: 知 识 须 知 :
1tr线tr线 1 、 t r 为 矩 阵 的 迹 , 即 对 角 线 元 素 之 和 。 t r 既 然 是 对 角 线 元 素 之 和 , 那 么 矩 阵 为 正 方 形 矩 阵 。
2AA 2 、 ∇ 符 号 为 求 梯 度 , 实 际 上 就 是 求 导 。 ∇ A 就 是 对 A 矩 阵 求 导 。

### C语言实现牛顿迭代法解方程组 为了使用C语言实现牛顿迭代法解方程组,通常需要定义目标函数及其雅可比矩阵(即偏导数组成的矩阵),并通过迭代过程逐步接近方程组的真实解。下面是一个简单的例子,展示如何用C语言编写牛顿迭代法来解决两个变量的非线性方程组。 #### 定义头文件和全局常量 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX_ITERATIONS 500 /* 最大允许的迭代次数 */ #define TOLERANCE 1e-8 /* 收敛条件中的绝对误差限 */ ``` #### 声明辅助函数用于计算给定点处的目标函数值向量F(x,y)以及其对应的雅克比行列式的逆J^-1(F)(x,y) 对于特定形式的一对方程式f(x, y)=0,g(x, y)=0来说: 假设我们有如下方程组: \[ f_1(x, y) = x^2 + xy - 1 \] \[ f_2(x, y) = sin(y)-y+x/4 \] 那么可以写出相应的雅各布矩阵为: \[ J = \begin{bmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y}\\ \frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} \end{bmatrix} = \begin{bmatrix} 2x+y & x\\ 1/4 & cos(y)-1 \end{bmatrix} \] 因此,在代码中我们需要分别声明这两个部分作为独立的功能模块以便后续调用[^3]。 #### 编写具体的函数体 ##### 计算 F 向量 (Function Vector Calculation) ```c void calculate_F(double *result, double x, double y){ result[0] = pow(x, 2) + x*y - 1; result[1] = sin(y) - y + x / 4.0; } ``` ##### 雅可比矩阵 J 的求逆操作(Inverse of Jacobian Matrix Computation) 由于这里只涉及二阶矩阵的情况,可以直接采用公式法来进行求解;如果是更高维度,则可能需要用到更复杂的数值方法如LU分解等。 ```c int inverse_jacobian(double (*j)[2], double inversed_j[][2]){ // Calculate determinant double det = j[0][0]*j[1][1]-j[0][1]*j[1][0]; if(fabs(det)<TOLERANCE){return 0;} // Singular matrix inversed_j[0][0]= j[1][1]/det; inversed_j[0][1]=-j[0][1]/det; inversed_j[1][0]=-j[1][0]/det; inversed_j[1][1]= j[0][0]/det; return 1; } ``` ##### 主要逻辑流程控制(Main Logic Flow Control) 最后一步就是把所有的组件组合起来形成完整的牛顿迭代循环结构。 ```c // Newton's iteration loop to solve the system of nonlinear equations. void newton_iteration(){ int i,k=0; double X[2]={/* Initial guess */}, delta_X[2], temp_result[2], jacobi_matrix[2][2]; do{ // Compute current residual vector and Jacobian at point X[k]. calculate_F(temp_result,X[0],X[1]); // Fill out Jacobi matrix based on partial derivatives evaluated at X[k]. jacobi_matrix[0][0] = 2*X[0]+X[1]; jacobi_matrix[0][1] = X[0]; jacobi_matrix[1][0] = 0.25; jacobi_matrix[1][1] = cos(X[1])-1; // Solve linear equation set using obtained information from above steps. if(!inverse_jacobian(jacobi_matrix,delta_X)){ printf("Singular or nearly singular Jacobian encountered.\n"); exit(EXIT_FAILURE); } // Update solution estimate with correction term ΔX=-J⁻¹·F(X). for(i=0;i<2;++i){ X[i]+=delta_X[i]*temp_result[i]; } ++k; }while(sqrt(pow(delta_X[0],2)+pow(delta_X[1],2))>TOLERANCE && k<=MAX_ITERATIONS); if(k>=MAX_ITERATIONS){ printf("Maximum number of iterations reached without convergence."); }else{ printf("Solution found after %d iterations:\nx=%.9lf\ny=%.9lf",k,X[0],X[1]); } } int main(void){ newton_iteration(); return EXIT_SUCCESS; } ``` 这段代码展示了如何在C语言环境中运用牛顿迭代法去近似求得一组非线性的联立方程式的零点位置。需要注意的是,实际编程过程中还需要考虑更多细节问题,比如输入参数的有效范围检查、异常处理机制的设计等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值