3.1-点云计算数学基础

返回 >>>>>> PCL-3D点云总目录

函数求导

在这里插入图片描述
在这里插入图片描述

方差&协方差矩阵

基本概念

方差(Variance)衡量的是单个随机变量的变化(比如一个人在群体中的身高),概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。方差的公式为:
在这里插入图片描述
¯x是随机变量x的均值,n为样本总数。

标准差(Standard Deviation)是方差的算术平方根,用σ表示。标准差能反映一个数据集的离散程度。

协方差(Covariance)衡量的是两个随机变量同时变化的离散程度(比如一个人在群体中的身高和体重)。方差是协方差的一种特殊情况。
在这里插入图片描述
在这里插入图片描述

协方差矩阵

协方差矩阵表示一组随机变量之间的两两线性相关性,其中的每个元素代表了两个随机变量之间的协方差。

根据方差和协方差的定义,假如现在有n个样本数据,每个样本有d个随机变量,则其协方差矩阵为:
在这里插入图片描述
对角线上的元素为各个随机变量的方差,非对角线上的元素为两两随机变量之间的协方差,根据协方差的定义,我们可以认定:矩阵Σ为对称矩阵(symmetric matrix),其大小为d×d,则如果有一堆二维的点坐标,其协方差矩阵为:
在这里插入图片描述
三维的点坐标,协方差矩阵应为:
在这里插入图片描述

多元正态分布

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline

plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (12, 8)

# Normal distributed x and y vector with mean 0 and standard deviation 1
x = np.random.normal(0, 1, 200)
y = np.random.normal(0, 1, 200)
X = np.vstack((x, y))

plt.scatter(X[:, 0], X[:, 1])
plt.title('Generated Data')
plt.axis('equal')
plt.show()

此时,我们的变量x,y是相互独立的,协方差矩阵 Σ 是如下形式:
在这里插入图片描述
我们可以通过如下代码计算随机生成的点的真实协方差矩阵

# Covariance
def cov(x, y):
    xbar, ybar = x.mean(), y.mean()
    return np.sum((x - xbar)*(y - ybar))/(len(x) - 1)

# Covariance matrix
def cov_mat(X):
    return np.array([[cov(X[0], X[0]), cov(X[0], X[1])],
                     [cov(X[1], X[0]), cov(X[1], X[1])]])

# Calculate covariance matrix
print(cov_mat(X)) # (or with np.cov(X))
[[ 1.08970816 -0.03960157]
 [-0.03960157  0.99871813]]

可见其十分接近我们之前对随机变量x,y方差的定义:
在这里插入图片描述
即协方差矩阵主轴上的数据描述了其各个维度的离散程度(分布情况),值越大,分散的越开。

线性变换

接下来我们为所有点进行线性变换,来观察数据分布的变化以及协方差矩阵的变化。我们先使用以下缩放矩阵(scaling matrix)修改之前的协方差矩阵:
在这里插入图片描述
然后使用旋转矩阵(rotation matrix)进行旋转,θ为逆时针旋转的弧度值:
在这里插入图片描述本例设sx=1/2, sy=2, θ=π/6,即水平方向缩放一半,竖直方向放大一倍,然后逆时针旋转30度:
在这里插入图片描述
只进行缩放操作:
在这里插入图片描述
代码实现:

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (12, 8)

# Normal distributed x and y vector with mean 0 and standard deviation 1
x = np.random.normal(0, 1, 200)
y = np.random.normal(0, 1, 200)
X = np.vstack((x, y)) # 2xn

sx, sy = 0.5, 2.0
Scale = np.array([[sx, 0], [0, sy]])

Y = Scale.dot(X)
# 原始点集
plt.scatter(X[0, :], X[1, :])
# 缩放后点
plt.scatter(Y[0, :], Y[1, :])
plt.title('Generated Data')
plt.axis('equal')
plt.show()

先缩放,后旋转:
在这里插入图片描述
代码实现:

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (12, 8)

# Normal distributed x and y vector with mean 0 and standard deviation 1
x = np.random.normal(0, 1, 200)
y = np.random.normal(0, 1, 200)
X = np.vstack((x, y)) # 2xn

sx, sy = 0.5, 2.0
Scale = np.array([[sx, 0], [0, sy]])

# Rotation matrix
theta = np.pi / 6
c, s = np.cos(theta), np.sin(theta)
Rot = np.array([[c, -s], [s, c]])

# Transformation matrix
T = Rot.dot(Scale)

# Apply transformation matrix to X
Y = T.dot(X)

# 原始点集
plt.scatter(X[0, :], X[1, :])
# 缩放、旋转后
plt.scatter(Y[0, :], Y[1, :])
plt.title('Generated Data')
plt.axis('equal')
plt.show()

# Calculate covariance matrix
print(cov_mat(Y)) # (or with np.cov(Y))

其协方差矩阵输出结果为:

[[ 1.1830068  -1.66028421]
 [-1.66028421  3.10071868]]

为了计算变换与协方差矩阵个关系,我们将旋转矩阵、缩放矩阵合并为同一个变换矩阵:A=RS
在这里插入图片描述
可验证与之前代码输出的协方差结果近似。现在我们已经得到协方差矩阵与缩放矩阵、旋转矩阵的关系,由于协方差矩阵是正定对称矩阵即可对角化矩阵,则接下来我们对协方差矩阵进行特征值分解,观察其特征向量矩阵、特征值矩阵与缩放矩阵、旋转矩阵的关系

特征分解

在这里插入图片描述
我们通过以下代码对Σ进行特征分解、对结果进行验证:

import numpy as np

sigma = np.array([
    [19 / 16, -15 * np.sqrt(3) / 16,],
    [-15 * np.sqrt(3) / 16, 49 / 16]
])

eVa, eVe = np.linalg.eig(sigma)
print("eigen value:\n", eVa)
print("eigen vector:\n", eVe)

输出

eigen value - SS^T:
 [0.25 4.  ]
eigen vector - U:
 [[-0.8660254  0.5      ]
 [-0.5       -0.8660254]]

可验证该输出结果与上述一致。

我们可以将特征值和特征向量分别相乘,得到变换后椭圆区域的两个基向量:

# Calculate covariance matrix
C = cov_mat(Y)
print(C)  # (or with np.cov(Y))

eVa, eVe = np.linalg.eig(C)

plt.scatter(Y[:, 0], Y[:, 1])
for value, eigen in zip(eVa, eVe.T):
    plt.plot(
        [0, 3 * np.sqrt(value) * eigen[0]],
        [0, 3 * np.sqrt(value) * eigen[1]],
         lw=5)

plt.title('Transformed Data')
plt.axis('equal')
plt.show()

输出:
在这里插入图片描述
总结:
一个多元正态分布的概率密度函数中,其协方差矩阵 Σ包含了分布的旋转角度和缩放信息,其均值向量μ包含了密度中心的位置信息。

雅克比矩阵

雅克比向量

在这里插入图片描述
将多个维度作为整体,来理解函数与变量的关系。

雅克比矩阵即通过线性代数的向量来描述高纬度的数据在空间中的表现。

通过向量将每一个函数的变量变化(偏导数)合并为一个整体,在高维空间去观察变化。|J|是其在梯度方向的向量的模,该向量指向其梯度的上坡方向。

雅克比向量&矩阵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

雅克比寻找极值

在这里插入图片描述
当函数进入极大值或极小值时,其梯度会比较平缓,接近或等于0。当极值只有一个时,找到对应的x,y位置比较容易。

当函数比较复杂时,极值可能有多个,会有全局最高的山顶、全局最低的山谷、局部山顶、局部的山谷。这些地方的梯度也都是0。如果将x,y等于0,则无法确定是哪个极值。

如果我们任意选择一点,无法知道最高峰和最低谷的位置。但是可以知道其最近的较高点和较低点。雅克比Vector的方向指向了最近的较高点,其模表述了幅度。即可以帮我们高效地找到局部的较高和较低点,但不能帮我们找到全局的最高点和最低点。

黑塞矩阵

理解黑塞矩阵

在这里插入图片描述
数学上,黑塞矩阵(Hessian matrix又称海森矩阵)是一个自变量为向量的实值函数的二阶偏导数组成的方阵。即可以理解为对Jacobian Vector再次进行求导,把每一项偏导项再做一次求导。其矩阵是对称矩阵。

那么如何在J处于极值情况下,判断这个极值是最大值、最小值、还是鞍值?这就需要使用黑塞矩阵了。

对于二次函数,黑塞矩阵为常数矩阵,与参数无关。

令J = 0

  • 当H的行列式|H|>0且左上角值H11>0,此时函数对应极小值。
  • 当H的行列式|H|>0且左上角值H11>0,此时函数对应极大值。
  • 当H的行列式|H|<0 ,在一个方向上是极大值,另一个方向是极小值。

如果一个多维函数如下:
在这里插入图片描述
假如此函数的所有二阶导数都存在,则其黑塞矩阵为:
在这里插入图片描述

计算过程

在这里插入图片描述
δ即为偏导数partial

按照如下形式求每一项的二阶偏导:
在这里插入图片描述
注:以上文字和图片均来源于链接,若有侵权请联系转载方删除。

返回 >>>>>> PCL-3D点云总目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值