【点云、图像】学习中 常见的数学知识及其中的关系与python实操[更新中]

文章目录

  • 前言
  • 一、平均值、方差、协方差
    • 平均值(mean)np.mean()
    • 方差(variance)np.var()
      • 总体方差 np.var(a, ddof=0)
      • 无偏样本方差np.var(a, ddof=1)
      • 有偏样本方差
      • 标准差(standard deviation)np.std(a, ddof=1)
        • 默认是有偏估计,所以务必加上ddof=1,以下均使用无偏估计(ddof=1)
    • 协方差(covariance)np.cov(x, y,ddof=1)[0][1]
      • 与自身的协方差 np.cov(x,ddof=1)
      • 线性组合的协方差
      • 期望值(Expected value) np.average(a, weights=weights)
        • np.mean()与np.average()的区别
      • 协方差矩阵 (covariance matrix)np.cov(x, y,ddof=1)
        • 交叉协方差矩阵
        • 协方差矩阵(自协方差矩阵)
      • 协方差矩阵=A^T^A的证明
  • 二、奇异值分解、主成分分析法
    • 奇异值分解(Singular Value Decomposition)np.linalg.svd()
      • 补充: 奇异值和特征值
      • 补充:奇异矩阵和非奇异矩阵(线代基础知识)
      • 补充:酉矩阵和正交矩阵
      • 从特征值分解到奇异值分解
        • 求特征值 eig_val, eig_vec = np.linalg.eig(A)
        • 求索引值 index =np.argsort(x)
        • np.linalg.svd()
      • 奇异值的物理意义 (为什么要进行奇异值分解)
    • 主成分分析法(Principal components analysis)
      • 补充:归一化 :(常见)将数据映射到 [0,1] or [-1.1] 的区间之内
      • 补充:去中心化:以平均值为中心移动至原点
      • 补充:标准化:使得方差为1,均值为0
      • 步骤
      • 为什么要进行主成分分析


前言

记录一下 点云学习遇到的一些数学计算方法。

这里点云的在numpy上的形式如下:每个数组里是x,y,z坐标信息。

import numpy as np
points = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(points)

在这里插入图片描述


参考链接
Python之Numpy详细教程
形象理解协方差矩阵【看了很多这个是比较正确的理解】
简而言之,numpy返回一个数组对象,与python中的list不同,拥有更多的操作。
比如:列表不能对[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]列表进行 行列切片。
例如:

import numpy as np
li =[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
try :print(li[:,0])
except Exception as error:print(error)#报错
shuzu =np.array(li)[:,0] #第一个:表示第一维,第二个0表示第二维的第一个元素 #或者说取第一列
print(shuzu)
print(type(shuzu))
print(list(shuzu))

在这里插入图片描述
关于np.array和np.asarray

import numpy as np
points = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
points1 = np.asarray([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(points)
print(points1)

返回的数组一致,只是参数上有区别,详情见上面的教程。
在这里插入图片描述

一、平均值、方差、协方差

平均值(mean)np.mean()

概念不用多说,这里强调一下写法:
在这里插入图片描述
The arithmetic mean of a set of numbers x1, x2, …, xn is typically denoted using an overhead bar, (英文里平均值常写成xbar,bar英文意思是条,带。意思是通常使用个头顶条来表示。)
使用:np.mean() #mean 英译:平均值

import numpy as np
points = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
average_data = np.mean(points, axis=0)##axis=0表示按列求均值
print(average_data)
#[5.5 6.5 7.5]

方差(variance)np.var()

总体方差 np.var(a, ddof=0)

主要看到第一个等号就行,下面推导的是方差也=数平方的均值-数均值的平方
在这里插入图片描述
这里u=均值。
np.var()

import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
variance = np.var(a,axis=1) #axis=1表示按行求方差
print(variance)
#[0.66666667 0.66666667 0.66666667 0.66666667]

无偏样本方差np.var(a, ddof=1)

一般来说,点云中计算从方差都是选取部分点云来算方差,所以基本上用无偏样本方差,其中,对n − 1的使用称为贝塞尔校正,它也用于样本协方差和样本标准差(方差的平方根)。详见Wiki百科。定义如下:
在这里插入图片描述
np.var(a, ddof=1) ddof=0表示总体方差,ddof=1表示为样本方差

import numpy as np
a = ([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
sample_variance = np.var(a, ddof=1, axis=1) #ddof=1表示无偏估计
print(sample_variance)
#[1. 1. 1. 1.]

有偏样本方差

则是除以n,这里n为样本大小。与总体方差计算方式一样。

标准差(standard deviation)np.std(a, ddof=1)

standard deviation,缩写为S.D.或σ1。标准差是一种衡量数据分散程度的统计量,它是方差的平方根。
主要用第一种。
在这里插入图片描述
np.std()

import numpy as np #第一种
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
sample_standard_deviation = np.std(a, ddof=1,axis=1) #ddof=1表示无偏估计
print(sample_standard_deviation)
#[1. 1. 1. 1.]
import numpy as np #第二种
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
sample_standard_deviation = np.std(a, ddof=0,axis=1) #ddof=0表示有偏估计
print(sample_standard_deviation)
#[0.81649658 0.81649658 0.81649658 0.81649658]

可以验证是方差的开根号。

默认是有偏估计,所以务必加上ddof=1,以下均使用无偏估计(ddof=1)

协方差(covariance)np.cov(x, y,ddof=1)[0][1]

方差衡量单个随机变量(如人口中一个人的身高)的变化,而协方差是衡量两个随机变量一起变化的程度(如一个人的身高和人口中一个人的体重)。

在这里插入图片描述
n为样本数量,方差亦可视作随机变量与自身的协方差
在这里插入图片描述
或者 写成如下形式
在这里插入图片描述
(图上应为1/n-1)E(x)下面会讲。其中,xi和yi的数量n应相等。

cov为协方差(covariance)的前三个字母缩写。
var为方差(variance)的前三个字母缩写。
在这里插入图片描述

与自身的协方差 np.cov(x,ddof=1)

import numpy as np
x = np.array([1, 2, 3, 4, 5])
covxx = np.cov(x,ddof=1)
varx = np.var(x,ddof=1)
print(covx)
print(varx)
'''
2.5
2.5
'''

线性组合的协方差

np.cov(x, y)返回一个协方差矩阵,类似于输出:下面会讲到

[[cov(x,x)],cov[x,y]
[cov(y,x)],cov(y,y)]

所以np.cov(x, y,ddof=1)[0,1] (或[0][1],或[1,0])是x和y的协方差

import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])
covariance = np.cov(x, y,ddof=1)# np.cov(x, y)返回一个协方差矩阵,[0, 1]表示x和y的协方差
print(covariance)
print(covariance[0,1])
'''
[[ 2.5 -2.5][-2.5  2.5]]
-2.5
'''

或者用下面一种形式,默认把每一行当作一个变量。

import numpy as np 
x = np.array([[1, 2, 3], [3, 1, 1], [2, 8, 9], [1, 11, 12]])
covariance = np.cov(x,ddof=1)
print(covariance)
'''
[[ 1.         -1.          3.5         5.5       ][-1.          1.33333333 -4.33333333 -7.        ][ 3.5        -4.33333333 14.33333333 23.        ][ 5.5        -7.         23.         37.        ]]
'''

可以看出是个对称矩阵,因为协方差是交换的,即cov(X,Y) = cov(Y,X)。这个矩阵的每个位置都代表了x中两个随机变量的协方差。

用定义的方式验证一下这个函数,当然是对的。

#验证协方差公式
import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])
print(np.cov(x, y,ddof=0)[0][0]) #ddof=0表示有偏估计
print(np.cov(x, y,ddof=0)[1][1])
print(np.cov(x, y,ddof=0)[0][1])
covx = np.mean((x - x.mean()) ** 2) #np.mean()求均值 /n
covy = np.mean((y - y.mean()) ** 2)
covxy = np.mean((x - x.mean()) * (y - y.mean()))
print(covx)
print(covy)
print(covxy)
'''
2.0
2.0
-2.0
2.0
2.0
-2.0
'''

如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高。
在这里插入图片描述

期望值(Expected value) np.average(a, weights=weights)

这里E(X)为期望值:试验中每次可能的结果乘以其结果概率的总和,例如:
在这里插入图片描述
由于此时每个点的概率相等,所以也可以写成如上cov(X,Y)形式。
在这里插入图片描述
np.average()可以接受一个weights参数,用来计算加权平均值。

import numpy as np
a = np.array([1, 2, 3, 4, 5])
weights = np.array([0.1, 0.2, 0.3, 0.2, 0.2])
weighted_expectation = np.average(a, weights=weights)
print(weighted_expectation)
#3.2
np.mean()与np.average()的区别
import numpy as np
a = np.array([1, 2, 3, 4, 5])
weights = np.array([0.1, 0.2, 0.3, 0.4, 0.5])
mean = np.mean(a)
average = np.average(a, weights=weights)
try :print(a, weights=weights)
except Exception as error:print(error)
print("mean:", mean)
print("average:", average)
'''
'weights' is an invalid keyword argument for print()
mean: 3.0
average: 3.6666666666666665
'''

可以看到,当不指定weights参数时,np.mean()和np.average()的结果是一样的,都是3.0。但是当指定了weights参数时,np.average()会根据每个元素的权重来计算加权平均值,结果是3.6666666666666665。np.mean()不支持weights参数,会报错。

协方差矩阵 (covariance matrix)np.cov(x, y,ddof=1)

交叉协方差矩阵

以下为中文wiki百科中协方差的定义

在统计学与概率论中,协方差矩阵(covariance matrix)是一个方阵,代表着任两列随机变量间的协方差,是协方差的直接推广。
因为是方阵,所以下面的m=n。
在这里插入图片描述
在这里插入图片描述
英文的wiki百科中交叉协方差矩阵的定义
交叉协方差矩阵
是一个矩阵,其元素在 i、j 位置是随机向量的第 i 个元素与另一个随机向量的第 j 个元素之间的协方差。

后发现这样来理解np.cov()函数理解不了,故查询了英文的wiki百科中协方差矩阵的定义,发现确实有问题,上述定义在英文wiki百科中定义为交叉协方差矩阵,而协方差矩阵定义如下:

协方差矩阵(自协方差矩阵)

英文的wiki百科中协方差矩阵的定义

在概率论和统计学中,协方差矩阵(covariance matrix),也称为自动协方差矩阵(auto-covariance matrix)、色散矩阵(dispersion matrix)、方差矩阵(variance matrix)或方差-协方差矩阵(variance–covariance matrix)。

是一个平方矩阵,给出给定随机向量的每对元素之间的协方差。任意协方差矩阵都是对称的和半正定的矩阵,且其主对角线包含方差(即每个元素自身的协方差)。不要和交叉协方差矩阵搞混。

直观地说,协方差矩阵将方差的概念推广到多个维度。例如,二维空间中随机点集合的变化不能完全用单个数字来表征,二维空间中随机点的方差也不能用x和y方向包含所有必要的信息;一个2×2矩阵对于充分表征二维变化是必要的。

任何协方差矩阵都是对称的,并且是正半定的,其主对角线包含方差(即每个元素与自身的协方差)。

这里主要按python中的函数来解读了,实际上这样解读更符合直觉上的逻辑。
故可以理解为:

[[cov(x,x)],cov[x,y]
[cov(y,x)],cov(y,y)]

其中covariance_matrix[0,0]和covariance_matrix[1][1]为分别对自身x,和y的协方差。

import numpy as np
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])
covariance_matrix = np.cov(x, y,ddof=1)# np.cov(x, y)返回一个协方差矩阵
print(covariance_matrix)
'''
[[ 2.5 -2.5][-2.5  2.5]]
'''

假设为点云数据形式,实际上和上述一样理解,只不过放在一个数组里了。

import numpy as np #第二种
x = np.array([[1, 2, 3], [3, 1, 1], [2, 8, 9], [1, 11, 12]])
covariance = np.cov(x,ddof=1)
print(covariance)
'''
[[ 1.         -1.          3.5         5.5       ][-1.          1.33333333 -4.33333333 -7.        ][ 3.5        -4.33333333 14.33333333 23.        ][ 5.5        -7.         23.         37.        ]]
'''

可以看出上述协方差矩阵为对称的。
在这里插入图片描述

协方差矩阵=ATA的证明

请添加图片描述

更多可参考
理解和分析协方差矩阵
形象理解协方差矩阵 (有关于是正半定矩阵的证明)

二、奇异值分解、主成分分析法

奇异值分解(Singular Value Decomposition)np.linalg.svd()

这篇大佬讲的很细,可以参考通俗易懂。
SVD分解
这里仅在此基础上做些概念上的补充,简化理解过程,及错误的勘误。

补充: 奇异值和特征值

特征值和特征向量是方阵的概念,它们表示矩阵作用于某些向量时,只会改变向量的长度,不会改变向量的方向。
特征值是这些向量的长度缩放比例,特征向量是这些向量的方向。
特征值和特征向量可以用来分解方阵为对角矩阵和正交矩阵的乘积,这样可以简化矩阵的运算和理解矩阵的性质。

奇异值和奇异向量是任意矩阵的概念,它们表示矩阵作用于某些向量时,会使向量的长度达到最大或最小。
奇异值是这些向量的长度,奇异向量是这些向量的方向。
奇异值和奇异向量可以用来分解任意矩阵为对角矩阵和两个正交矩阵的乘积,这样可以用来降维、压缩、去噪等应用。

简而言之:奇异值是对特征值在矩阵上的推广,将方阵推广到了任意矩阵

奇异值分解能够用于任意mxn矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广。

补充:奇异矩阵和非奇异矩阵(线代基础知识)

奇异矩阵和非奇异矩阵是线性代数中的概念,它们都是指方阵,即行数和列数相等的矩阵。
奇异矩阵是指行列式为0的矩阵,也就是说它的秩不是满秩,或者它的特征值有0。
非奇异矩阵是指行列式不为0的矩阵,也就是说它的秩是满秩,或者它的特征值都不为0。
非奇异矩阵也称为可逆矩阵,因为它们都有唯一的逆矩阵。

补充:酉矩阵和正交矩阵

酉矩阵和正交矩阵都是一种特殊的方阵,它们的转置矩阵等于它们的逆矩阵,也就是说它们都满足AT = A-1
但是,酉矩阵是复数方阵,它的转置矩阵要求是共轭转置,也就是说它满足AH = A-1, 其中AH 表示A的共轭转置。
在这里插入图片描述
正交矩阵是实数方阵,它的转置矩阵不需要是共轭的,也就是说它满足AT = A-1

简而言之:酉矩阵是正交矩阵的推广,当酉矩阵的元素都是实数时,它就是正交矩阵。满足AT A = AAT =E

从特征值分解到奇异值分解

学过线代的我们都知道,若A~ ^ (^ 为对角矩阵 ) 则P-1AP =^,(P为可逆矩阵)
可以推到A = P ^ P-1, 此时由相似的性质可以得到A的特征值=^的特征值,且一一对应其特征向量的位置。说不太清,下面开始手推。
特征值分解:
定义为:
在这里插入图片描述
A为方阵(nxn),W为正交矩阵,(正交默认单位化了,即行向量,列向量都是正交的单位向量。),中间Σ为对角矩阵(nxn)(也叫特征值矩阵)。

在这里插入图片描述
最后的^ 里即为A(nxn)的特征值。
奇异值分解:
定义为:
在这里插入图片描述
U(m×m酉矩阵),Σ(m×n),除了主对角线上的元素以外全为零,主对角线上的每个元素都称为奇异值,V是一个n×n的酉矩阵。
请添加图片描述
SVD分解

求特征值 eig_val, eig_vec = np.linalg.eig(A)

返回第一个值为特征值数组,第二个特征向量矩阵。注意特征值不一定是有序排列,但特征向量返回的默认是单位向量。eig 是特征值(eigenvalue)的缩写

求索引值 index =np.argsort(x)

输出的结果是x数组中的元素从小到大排序后的索引数组值。
[::1]为倒序排列,在列表形式的数据中,也能排列。

import numpy as np# 定义一个3x2的矩阵A
A = np.array([[0, 1], [1, 1], [1, 0]])
print(A)# 求AAT的特征值和特征向量
AAT = np.dot(A, A.T)
print(AAT)
eig_val, eig_vec = np.linalg.eig(AAT) #默认返回单位向量
print(eig_val)
print(eig_vec)# 按特征值的大小降序排列,调整特征向量的顺序
idx = eig_val.argsort()[::-1]
eig_val = eig_val[idx]
eig_vec = eig_vec[:, idx]U=eig_vec
print(U)# 求ATA的特征值和特征向量
ATA = np.dot(A.T, A)
print(ATA)
eig_val, eig_vec = np.linalg.eig(ATA)
print(eig_val)
print(eig_vec)# 按特征值的大小降序排列,调整特征向量的顺序
idx = eig_val.argsort()[::-1]
eig_val = eig_val[idx]
eig_vec = eig_vec[:, idx]V=eig_vec
print(V)# 求奇异值,构成Σ
Sigma = np.diag(np.sqrt(eig_val))
print(Sigma) #默认shape是与行列的较小值的方阵#理应shape与输入矩阵A相同
Sigma = np.append(Sigma, np.zeros((1, A.shape[1])), axis=0)
print(Sigma)# 验证A=UΣV*
print(np.dot(U, np.dot(Sigma, V.T))) #特征向量不唯一导致的'''
[[0 1][1 1][1 0]]
[[1 1 0][1 2 1][0 1 1]]
[ 3.00000000e+00  1.00000000e+00 -5.13860489e-17]
[[-4.08248290e-01  7.07106781e-01  5.77350269e-01][-8.16496581e-01  2.48915666e-16 -5.77350269e-01][-4.08248290e-01 -7.07106781e-01  5.77350269e-01]]
[[-4.08248290e-01  7.07106781e-01  5.77350269e-01][-8.16496581e-01  2.48915666e-16 -5.77350269e-01][-4.08248290e-01 -7.07106781e-01  5.77350269e-01]]
[[2 1][1 2]]
[3. 1.]
[[ 0.70710678 -0.70710678][ 0.70710678  0.70710678]]
[[ 0.70710678 -0.70710678][ 0.70710678  0.70710678]]
[[1.73205081 0.        ][0.         1.        ]]
[[1.73205081 0.        ][0.         1.        ][0.         0.        ]]
[[-1.00000000e+00  2.22044605e-16][-1.00000000e+00 -1.00000000e+00][-1.11022302e-16 -1.00000000e+00]]
'''
np.linalg.svd()
import numpy as np# 定义一个3x2的矩阵A
A = np.array([[0, 1], [1, 1], [1, 0]])
print(A)# 使用linalg.svd函数进行奇异值分解
U, S, V = np.linalg.svd(A)# 打印结果
print("U:", U)
print("S:", S)
print("V:", V)# 使用diag函数构造对角矩阵Σ
Sigma = np.diag(S)
print("Sigma:", Sigma)
'''
[[0 1][1 1][1 0]]
U: [[-4.08248290e-01  7.07106781e-01  5.77350269e-01][-8.16496581e-01  5.55111512e-17 -5.77350269e-01][-4.08248290e-01 -7.07106781e-01  5.77350269e-01]]
S: [1.73205081 1.        ]
V: [[-0.70710678 -0.70710678][-0.70710678  0.70710678]]
Sigma: [[1.73205081 0.        ][0.         1.        ]]
'''

勘误:SVD分解
如上,我们不能得出特征值矩阵等于奇异值矩阵的平方,他们连矩阵的nxm形式都不同,只能说:如果奇异值矩阵Σ的行数与特征值矩阵相等,才能得到如此说法,由它的例子也可以看出,不过由上述手推和怕python返回值上来说,也可以接受这种说法。

在这里插入图片描述

奇异值的物理意义 (为什么要进行奇异值分解)

奇异值的物理意义
我们为什么要进行奇异值分解,以及为什么选取前几个较大的奇异值可以代表举证的主要信息,而后面的较小的奇异值则可以忽略或近似为零,这样可以实现矩阵的降维、压缩、去噪等目的。

主成分分析法(Principal components analysis)

补充:归一化 :(常见)将数据映射到 [0,1] or [-1.1] 的区间之内

在这里插入图片描述
由此可见归一化为很多种,常见的是指最小、最大特征缩放。

1、映射到[0,1]范围内:
每一项减去最小值后都除以最大值与最小值之差
在这里插入图片描述
2、映射到[-1,1]范围内:
[0,1]->[0,2]->[-1,1]
在这里插入图片描述

补充:去中心化:以平均值为中心移动至原点

使数据每一项都减去均值:
在这里插入图片描述

补充:标准化:使得方差为1,均值为0

去中心化后,除以标准差。
在这里插入图片描述

步骤

主要基于维基百科,部分参考:
主成分分析(PCA)原理详解
手撸PCA(Python七行代码实现)
在这里插入图片描述
在这里插入图片描述

第一个主成分可以等效地定义为使投影数据方差最大化的方向。在以上奇异值分解的基础上,可以理解为最大的特征值所对应的特征向量。
第二主成分可以理解为第二大特征值所对应的特征向量,以此类推。

第一步:
去中心化。
原数据[[1, 2, 3], [3, 1, 1], [2, 8, 9], [1, 11, 12]],求取列方向的均值(求行向量没有意义,行向量为单个点的[x,y,z]数据)。然后将其减掉。
也可以进行标准化,这里仅中心化。
在这里插入图片描述

通常,为了确保第一主成分描述的是最大方差的方向,我们会使用平均减法(去中心化)进行主成分分析。如果不执行平均减法,第一主成分有可能或多或少的对应于数据的平均值。另外,为了找到近似数据的最小均方误差,我们必须选取一个零均值。

PCA 的结果取决于变量的缩放。这可以通过按标准差缩放每个特征来解决这个问题,从而最终得到具有单位方差的无量纲特征。(也就是说标准化,可以得到位方差的无量纲特征)

在某些应用中,每个协方差矩阵的列向量,也可以缩放为方差等于 1(标准化)。这一步会影响计算出的主成分,但使它们独立于用于测量不同变量的单位。

一般来说,如果数据的各个特征的量纲和尺度相差不大,或者数据的分布比较均匀,那么只需要去中心化就可以了。如果数据的各个特征的量纲和尺度相差很大,或者数据的分布比较偏态,那么最好进行标准化,以提高PCA的效果和稳定性。

第二步:
计算协方差矩阵。
计算XTX 就可以得到协方差矩阵。(参见协方差矩阵=ATA的证明)
Gram matrix

ATA又被称为Gramian矩阵
在这里插入图片描述
这里(ATA的一些探讨)
在维基百科中的公式如下:
在这里插入图片描述
看到很多的博客上没有除以n-1。

个人看法:至于为什么不除以n-1,在探究特征向量时,n-1不影响结果,在研究贡献率时(每个特征值占所有特征值和),也不影响结果。
当然研究特征值时会有影响,但一般在数值上大多数涉及到百分比率时,变无关紧要了,还有就是ATA也是协方差矩阵。
对是否要/n-1,持保留意见。

第三步:
通过SVD计算协方差矩阵的特征值与特征向量。
第四步:
降序排序
第五步:
求贡献率:每个主成分对整体特征影响了多少百分比。
在这里插入图片描述
下面仅进行去中心化操作。

import numpy as np
A = np.array([[1, 2, 3], [3, 1, 1], [2, 8, 9], [1, 11, 12]])
#1、去中心化
average = np.mean(A, axis=0)
decentration_matrix = A - average #去中心化
std=np.std(A, axis=0,ddof=1)
#decentration_matrix = decentration_matrix/std #标准化        
print(decentration_matrix)
#2、求协方差矩阵
H = np.dot(decentration_matrix.T, decentration_matrix)  # 求协方差矩阵
print(H)
#3、求协方差矩阵的特征值和特征向量
eigenvectors, eigenvalues, eigenvectors_T = np.linalg.svd(H) 
print(eigenvalues)
#4、降序排列特征值,调整特征向量的顺序
index = eigenvalues.argsort()[::-1] # 从大到小排序 .argsort()是升序排序,[::-1]是将数组反转,实现降序排序
eigenvalues = eigenvalues[index] # 特征值  ## 使用索引来获取排序后的数组
print(eigenvalues)
eigenvectors = eigenvectors[:, index] # 特征向量
print(eigenvectors)
#5、贡献率
contribution_rate = eigenvalues / eigenvalues.sum()
print(contribution_rate)
'''
[[-0.75 -3.5  -3.25][ 1.25 -4.5  -5.25][ 0.25  2.5   2.75][-0.75  5.5   5.75]]
[[ 2.75 -6.5  -7.75][-6.5  69.   73.5 ][-7.75 73.5  78.75]]
[1.48237664e+02 2.20024983e+00 6.20861128e-02]
[1.48237664e+02 2.20024983e+00 6.20861128e-02]
[[-0.06925606 -0.96162402  0.26548605][ 0.68147921 -0.23995698 -0.69138031][ 0.72855315  0.13304095  0.67194525]]
[9.84967868e-01 1.46196002e-02 4.12532311e-04]
'''

为什么要进行主成分分析

中文翻译后再看这个
理解主成分分析、特征向量和特征值 打的比喻生动形象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

Dockerfile镜像构建

Dockerfile镜像构建 1、部署harbor仓库 #部署docker #解压harbor安装包 rootharbor:~# cd /app/harbor/ rootharbor:/app/harbor# ll total 597560 drwxr-xr-x 3 root root 180 Jan 13 13:17 ./ drwxr-xr-x 4 root root 77 Jan 13 13:14 ../ drwxr-xr-x 3 root …

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉导航

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 VX关注&#xff0c;并留下邮箱可获得每日定时推送 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换

场景 SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源&#xff1a; SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源-CSDN博客 上面实现通过注解和配置文件的方式去进行多数据源操作。 如果业务需求&#xff0c;比…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

大模型日报-20240120

这里写目录标题 视觉Mamba来了&#xff1a;速度提升2.8倍&#xff0c;内存能省87%一键实景转动画&#xff0c;清华系初创公司全球首发4D骨骼动画框架&#xff0c;还能生成个性化角色如何利用革命性的蛋白质结构工具来发现药物&#xff1f;AlphaFold 发现了数千种可能的致幻剂扎…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

【Qt5】QString的成员函数chop

2024年1月19日&#xff0c;周五下午 QString 的 chop 方法用于从字符串的末尾移除指定数量的字符。这个方法会修改原始字符串&#xff0c;并返回 void。 下面是一个简单的示例&#xff1a; #include <QString> #include <QDebug>int main() {QString originalStr…

Jetson AGX Orin安装archiconda、Pytorch

想在Jetson AGX Orin创建一个虚拟环境&#xff0c;然后安装pytorch&#xff0c;过程中遇到了很多的坑&#xff0c;这篇文章主要用于记录过程~因为Orin本身是Arm架构&#xff0c;X86架构可以装Anaconda&#xff0c;对于ARM要装archiconda。 1.安装archiconda 1.1确定操作系统架…

KBP206-ASEMI小功率家用电源KBP206

编辑&#xff1a;ll KBP206-ASEMI小功率家用电源KBP206 型号&#xff1a;KBP206 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;2A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;600V 正向浪涌电流&#xff1a;60A 正向电压&#xff08;V…

BeanUtils工具类简介

BeanUtils工具类 一、简介 ​ BeanUtils 是 Apache commons组件的成员之一&#xff0c;主要用于简化JavaBean封装数据的操作。可以将一个表单提交的所有数据封装到JavaBean中。 二、pom依赖 <dependency><groupId>commons-beanutils</groupId><artifa…

容器技术1-容器与镜像简介

目录 1、容器与虚拟化 2、容器发展历程 3、镜像简介 4、镜像原理 &#xff08;1&#xff09;分层存储 &#xff08;2&#xff09;写时复制 &#xff08;3&#xff09;内容寻址 &#xff08;4&#xff09;联合挂载 1、容器与虚拟化 容器技术在操作系统层面实现了对计算机…