Elasticsearch嵌套类型nested使用指南

趁旧智秃1. 引言

复习上一篇文章《最小二乘问题详解1:线性最小二乘》中的知识,对于一个线性问题模型:

f

(

x

;

θ

)

=

A

θ

那么线性最小二乘问题可以表达为求一组待定值

θ

,使得残差的平方和最小:

min

θ

A

θ

?

b

2

本质上是求解超定线性方程组:

A

θ

=

b

具体的线性最小二乘解是:

θ

?

=

(

A

T

A

)

?

1

A

T

b

(1)

2. 求解

2.1 问题

虽然线性最小二乘解已经给出,但是并不意味着在实际的数值计算中就能按照式(1)来进行求解。一个典型的问题就是求逆矩阵:在工程实践和数值计算中,直接求解逆矩阵通常是一个性能消耗大且可能不精确的操作,应该尽量避免。举例来说,我们按照大学本科《线性代数》课程中的方法写程序来求解一个逆矩阵,假设使用伴随矩阵法:

A

?

1

=

1

det

(

A

)

?

adj

(

A

)

其中:

det

(

A

)

是矩阵

A

的行列式。

adj

(

A

)

A

的伴随矩阵。

为了求解伴随矩阵

adj

(

A

)

求代数余子式 (Cofactor):对于矩阵

A

中的每一个元素

a

i

j

,计算其代数余子式

C

i

j

代数余子式

C

i

j

=

(

?

1

)

i

+

j

?

M

i

j

M

i

j

是删去

A

的第

i

行和第

j

列后得到的子矩阵的行列式(称为余子式)。

构造余子式矩阵:将所有代数余子式

C

i

j

按照原来的位置排列,形成一个新矩阵

C

(称为余子式矩阵)。

转置:将余子式矩阵

C

进行转置,得到的矩阵就是伴随矩阵

adj

(

A

)

adj

(

A

)

=

C

T

代入公式:将

det

(

A

)

adj

(

A

)

代入公式

A

?

1

=

1

det

(

A

)

?

adj

(

A

)

即可。

这里我们大概能估算,使用伴随矩阵法求逆矩阵的理论复杂度是

O

(

n

!

)

,这是一个阶乘级的增长,算法效率非常低。《线性代数》中介绍的另外一种算法高斯消元法也只能达到

O

(

n

3

)

,呈指数级增加。其实效率只是一方面的问题,使用计算机求解的另外一个问题是舍入误差累积:在计算机中,浮点数运算存在固有的舍入误差;求逆过程涉及大量的除法和减法运算,这些误差会在计算过程中不断累积和传播。总而言之,使用通解求解逆矩阵,可能存在不精确且性能消耗大的问题。

2.2 QR分解

那么不使用逆矩阵怎么办呢?我们需要注意的是,最小二乘问题的本质是求解,而不是求逆矩阵,因此关键是要求解正规方程:

A

T

A

θ

=

A

T

b

对矩阵

A

作QR分解:

A

=

Q

1

R

其中:

Q

1

R

m

×

n

列正交,满足

Q

T

1

Q

1

=

I

n

R

R

n

×

n

是上三角矩阵,如果

A

列满秩,则

R

的对角元均非零,可逆。

那么把

A

=

Q

1

R

代入正规方程,得到:

(

Q

1

R

)

T

(

Q

1

R

)

x

=

(

Q

1

R

)

T

b

左边整理,因为

Q

T

1

Q

1

=

I

n

R

T

Q

T

1

Q

1

R

x

=

R

T

R

x

右边为

R

T

Q

T

1

b

因此正规方程等价于

R

T

R

x

=

R

T

(

Q

T

1

b

)

R

可逆(即

A

满秩,

rank

(

A

)

=

n

),则

R

T

也可逆。左右两边左乘

(

R

T

)

?

1

,得到:

R

x

=

Q

T

1

b

.

c

=

Q

?

1

b

(这是一个长度为

n

的向量),于是我们得到一个简单的上三角线性系统:

R

x

=

c

,

c

=

Q

T

1

b

这就是QR方法把正规方程化简得到的核心结果:只需解上三角方程

R

x

=

Q

T

1

b

以上只是对

A

列满秩的情况做了推导,如果

A

列满秩,那么QR分解可以表示为

x

=

R

?

1

Q

?

1

b

;如果

A

列不满秩(

R

奇异),需要使用列主元QR方法对

R

T

R

x

=

R

T

(

Q

T

1

b

)

进行求解,或者干脆使用下面要介绍的SVD分解(奇异值分解)法。

2.3 SVD分解

另外一种求解的方法是SVD分解。对任意矩阵

A

,存在奇异值分解:

A

=

U

Σ

V

T

其中:

U

R

m

×

m

为正交(列为左奇异向量),

V

R

n

×

n

为正交(列为右奇异向量),

Σ

R

m

×

n

为“对角块”矩阵,通常写成

Σ

=

[

Σ

r

0

0

0

]

其中

Σ

r

=

diag

(

σ

1

,

,

σ

r

)

(

σ

1

σ

2

?

σ

r

>

0

)

r

=

rank

(

A

)

将SVD代入正规方程,先计算

A

?

A

A

T

A

=

(

U

Σ

V

T

)

T

(

U

Σ

V

T

)

=

V

Σ

T

U

T

U

Σ

V

T

=

V

(

Σ

T

Σ

)

V

T

.

注意

U

T

U

=

I

。而

Σ

T

Σ

n

×

n

的对角块矩阵,其非零对角元就是

σ

2

i

(

i

=

1..

r

)

,其余为零。

同样的,计算

A

T

b

A

T

b

=

V

Σ

T

U

T

b

.

于是正规方程变为:

V

(

Σ

T

Σ

)

V

T

x

=

V

Σ

T

U

T

b

.

两边左乘

V

T

,因为

V

正交,

V

T

V

=

I

,得到:

(

Σ

T

Σ

)

(

V

T

x

)

=

Σ

T

(

U

T

b

)

y

=

V

T

x

c

=

U

T

b

代入,得到更简单的对角方程:

(

Σ

T

Σ

)

y

=

Σ

T

c

接下来按奇异值分块展开对角方程,先写出

Σ

相关的形状:

Σ

=

[

Σ

r

0

0

0

]

,

Σ

?

Σ

=

[

Σ

2

r

0

0

0

]

y

c

也做相应分块:

y

=

[

y

1

y

2

]

,

c

=

[

c

1

c

2

]

其中

y

1

,

c

1

R

r

对应非零奇异值,

y

2

,

c

2

对应奇异值为0的部分(维度

n

?

r

),代入得到分块方程:

[

Σ

2

r

0

0

0

]

[

y

1

y

2

]

=

[

Σ

r

0

0

0

]

[

c

1

c

2

]

即等价于两组方程:

Σ

2

r

y

1

=

Σ

r

c

1

,

0

=

0

?

c

2

(

无约束/自由分量

)

由于

Σ

r

为对角且可逆,第一式等价于

Σ

r

y

1

=

c

1

?

y

1

=

Σ

?

1

r

c

1

.

y

2

(对应零奇异值的分量)在正规方程中不受约束——这反映了在列秩不足时普通最小二乘解不是唯一的(可以在零空间方向任意加解)。为得到最小范数解(惯常的选择),取

y

2

=

0

最后回到

x

的求解,对于

y

有:

y

=

[

Σ

?

1

r

c

1

0

]

c

1

c

=

U

?

b

关系代回:

y

=

[

Σ

?

1

r

0

0

0

]

U

T

b

由于

y

=

V

T

x

,于是:

x

=

V

y

=

V

[

Σ

?

1

r

0

0

0

]

U

T

b

定义

Σ

+

为将非零奇异值取倒数后转置得到的伪逆矩阵(对角块为

Σ

?

1

r

,其余为0),则

x

+

=

V

Σ

+

U

T

b

这就是 最小二乘的 Moore–Penrose 伪逆解:

A

列满秩,则为唯一最小二乘解,由于那么

Σ

+

=

Σ

?

1

,SVD求解公式退化为常见的

x

=

V

Σ

?

1

U

T

b

若秩亏,它给出 在所有最小二乘解中范数最小的那个(minimum-norm solution)。

2.4 比较

从以上论述可以看到,SVD分解稳定且能处理秩亏的情况,但比QR分解慢,复杂度高,通常

O

(

m

n

2

)

;QR分解在列满秩、条件数不是太差时更快;若需要判定秩或求最小范数解,SVD是首选。

3. 补充

在最后补充一些基础知识,也是笔者很感兴趣的一点,那就是为什么一个矩阵A可以进行QR分解或者SVD分解呢?

3.1 QR分解

QR分解其实非常好理解,它的本质其实就是大学本科《线性代数》课程中提到的施密特(Gram–Schmidt)正交化。我们先复习一下施密特正交化相关的知识。

设有一组线性无关向量

a

1

,

a

2

,

,

a

n

R

m

我们想把它们变成一组正交(再归一化后变成标准正交)的向量

q

1

,

q

2

,

,

q

n

。具体步骤如下:

取第一个向量,归一化:

q

1

=

a

1

|

a

1

|

对第 2 个向量,先减去在

q

1

上的投影:

~

q

2

=

a

2

?

(

q

T

1

a

2

)

q

1

然后归一化:

q

2

=

~

q

2

|

~

q

2

|

对第 3 个向量,减去它在前两个正交向量上的投影:

~

q

3

=

a

3

?

(

q

T

1

a

3

)

q

1

?

(

q

T

2

a

3

)

q

2

然后归一化:

q

3

=

~

q

3

|

~

q

3

|

一般地,对第

j

个向量:

~

q

j

=

a

j

?

j

?

1

i

=

1

(

q

T

i

a

j

)

q

i

,

q

j

=

~

q

j

|

~

q

j

|

这样得到的

q

i

就是标准正交基,且每个

q

j

只用到了前

j

?

1

个。

现在把矩阵

A

看成由列向量组成:

A

=

[

a

1

,

a

2

,

,

a

n

]

R

m

×

n

.

把施密特正交化写成矩阵形式,我们得到一组正交向量:

Q

1

=

[

q

1

,

q

2

,

,

q

n

]

R

m

×

n

,

Q

T

1

Q

1

=

I

n

.

同时,原向量可以写成:

a

j

=

j

i

=

1

r

i

j

q

i

其中:

r

i

j

=

q

T

i

a

j

把这些关系拼成矩阵形式:

A

=

Q

1

R

其中:

R

=

(

r

i

j

)

n

×

n

上三角矩阵,因为第

j

列只用到前

j

q

i

Q

1

的列正交,所以

Q

T

1

Q

1

=

I

3.2 SVD分解

SVD分解其实也非常有意思,同样也可以顺着《线性代数》中基础知识来进行推导。首先复习一下特征值和特征向量。对于一个方阵

A

R

n

×

n

,如果存在一个非零向量

v

R

n

和一个实数

λ

,使得:

A

v

=

λ

v

那么:

λ

称为 特征值(eigenvalue)

v

称为对应于

λ

的 特征向量(eigenvector)

接下来复习一下什么叫做对角化。如果一个

n

×

n

矩阵

A

可以写成:

A

=

P

D

P

?

1

其中:

D

是一个对角矩阵(只有对角线上有元素)

P

是一个可逆矩阵

我们就说

A

是 可对角化的。

而且通常:

D

的对角元素是

A

的特征值:

D

=

diag

(

λ

1

,

,

λ

n

)

P

的列是对应的特征向量

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模与仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学与运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性与控制机制;同时,该模拟器可用于算法验证、控制器设计与教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习与仿真验证;②作为控制器(如PID、LQR、MPC等)设计与测试的仿真平台;③支持无人机控制系统教学与科研项目开发,提升对姿态控制与系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导与实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划与控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、数学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束与通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性与鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向与代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成与协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习与仿真实践的参考资料,帮助理解分布式优化与模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证与性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理与信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值