pca各个向量之间的相关度_PCA主成分分析

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

1.概念

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。

PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

如何得到这些包含最大差异性的主成分方向呢?通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。

2.那么协方差矩阵到底是什么?

我们都知道对于样本来说:

样本均值:

样本标准差:

样本方差:

很显然,均值描述的是样本集合的中间点,它告诉我们的信息是很有限的,而标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前者是8.3,后者是1.8,显然后者较为集中,故其标准差小一些,标准差描述的就是这种“散布度”。之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的标准差,即统计上所谓的“无偏估计”。而方差则仅仅是标准差的平方。

注意到,标准差和方差一般是用来描述一维数据的,方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到。但现实生活我们常常遇到含有多维数据的数据集。面对这样的数据集,我们当然可以按照每一维独立的计算其方差,但是通常我们还想了解更多,比如,一个男孩子的猥琐程度跟他受女孩子欢迎程度是否存在一些联系啊,嘿嘿~协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

来度量各个维度偏离其均值的程度,协方差可以这么来定义:

协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),也就是说一个人越猥琐就越受女孩子欢迎,嘿嘿,那必须的~结果为负值就说明负相关的,越猥琐女孩子越讨厌,可能吗?协方差为0,说明X和Y相关性为0,相关性为0并不一定相互独立,相互独立协方差(相关性)一定为零。

从协方差的定义上我们也可以看出一些显而易见的性质,如:

所以协方差多了就是协方差矩阵,上面协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差。举一个简单的三维的例子,假设数据集有三个维度,则协方差矩阵为:

35ca45259b3833bcfd84d3869e31f2c1.png

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的协方差。补充:计算协方差需要计算均值,那是按行计算均值还是按列呢?协方差矩阵是计算不同维度间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列为一个维度,所以要按列计算均值。

散布矩阵又称散度矩阵,将协方差矩阵乘以系数(n-1)就得到了散布矩阵,所有散布矩阵与协方差矩阵矩阵的作用是一样的,它们的特征值和特征向量也是一样的。这里值得注意的是,散度矩阵是SVD奇异值分解的一步,因此PCA和SVD是有很大联系,后面补充。理解了协方差矩阵也就理解了散布矩阵,它们只有一个系数只差而已。

3.PCA算法有两种实现方法

先了解一些基础:(1)特征值与特征向量

如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:

其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

(2) 特征值分解矩阵

对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:

其中,Q是矩阵A的特征向量组成的矩阵,

则是一个对角阵,对角线上的元素就是特征值。

(3)SVD分解矩阵原理

奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

假设A是一个m*n的矩阵,那么得到的U是一个m*m的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m*n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值

是v的转置矩阵,是一个n*n的矩阵,它里面的正交向量被称为
右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。

SVD分解矩阵A的步骤:

(1)求

的特征值和特征向量,用单位化的特征向量构成 U。

(2) 求

的特征值和特征向量,用单位化的特征向量构成 V。

(3) 将

或者
的特征值求平方根,然后构成 Σ。

(1) 基于特征值分解协方差矩阵实现PCA算法

输入:数据集

,需要降到k维。
  1. 去平均值(即去中心化),即每一位特征减去各自的平均值。
  2. 计算协方差矩阵
    。这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。
  3. 用特征值分解方法求协方差矩阵
    的特征值与特征向量。
  4. 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。
  5. 将数据转换到k个特征向量构建的新空间中,即Y=PX。

总结:关于这一部分为什么用

,这里面含有很复杂的线性代数理论推导,想了解具体细节的可以看下面这篇文章。CodingLabs - PCA的数学原理

关于为什么用特征值分解矩阵,是因为

是方阵,能很轻松的求出特征值与特征向量。当然,用奇异值分解也可以,是求特征值与特征向量的另一种方法。

举例:

2240e49a3d964641f3a41b8e89181be3.png

为例,我们用PCA方法将这两行数据降到一行。
  1. 因为X矩阵的每行已经是零均值,所以不需要去平均值。
  2. 求协方差矩阵

92159c2d89c5719c6f081dddfa4b6662.png

3.求协方差矩阵的特征值与特征向量。求解后的特征值为:

其对应的特征向量分别是:

0608ae4c1b2f1c4ca3e12d9838c3e0c9.png

其中对应的特征向量分别是一个通解,c1和c2可取任意实数。那么标准化后的特征向量为:

f2273f13f00db34b98ac54cb1f3f3b6e.png

因此我们的矩阵P是:

ea4a4678ea5eacd81d5236760ea48e6a.png

可以验证协方差矩阵C的对角化:

99a8af53fb4ed9696d1e744f3f761995.png

最后我们用P的第一行乘以数据矩阵,就得到了降维后的表示:

f4bb89a480f34a4c0d0e2cfe2e7afec9.png

降维投影结果如下图:

0a97325eb04b87bad70dd506cb6b94b0.png
数据矩阵X降维投影结果

注意:如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。

(2) 基于SVD分解协方差矩阵实现PCA算法

还是输入:数据集

,需要降到k维。
  1. 去平均值,即每一位特征减去各自的平均值。
  2. 计算协方差矩阵。
  3. 通过SVD计算协方差矩阵的特征值与特征向量。
  4. 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
  5. 将数据转换到k个特征向量构建的新空间中。

在PCA降维中,我们需要找到样本协方差矩阵

的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵
,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

1) 有一些SVD的实现算法可以先不求出协方差矩阵

也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

2)注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?

假设我们的样本是m*n的矩阵X,如果我们通过SVD找到了

矩阵最大的k个特征向量组成的k*n的矩阵
,则我们可以做如下处理:

1caf3f3a202132276ce4b4793e192d9d.png

可以得到一个m*k的矩阵X',这个矩阵和我们原来m*n的矩阵X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

还是看示例:

##Python实现PCA
import numpy as np
def pca(X,k):#k is the components you want#mean of each featuren_samples, n_features = X.shapemean=np.array([np.mean(X[:,i]) for i in range(n_features)])#normalizationnorm_X=X-mean#scatter matrixscatter_matrix=np.dot(np.transpose(norm_X),norm_X)#Calculate the eigenvectors and eigenvalueseig_val, eig_vec = np.linalg.eig(scatter_matrix)eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]# sort eig_vec based on eig_val from highest to lowesteig_pairs.sort(reverse=True)# select the top k eig_vecfeature=np.array([ele[1] for ele in eig_pairs[:k]])#get new datadata=np.dot(norm_X,np.transpose(feature))return dataX = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])print(pca(X,1))

上面代码实现了对数据X进行特征的降维。结果如下:

b7f686ef08f271ea00fa2c93d8eaf5e8.png

用sklearn的PCA与我们的PCA做个比较:

##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X))

结果如下:

3db2d1f0e78626cfa4c27284eac76ed8.png

搞了半天结果不是很一样啊。sklearn中的PCA是通过svd_flip函数实现的,sklearn对奇异值分解结果进行了一个处理,因为ui*σi*vi=(-ui)*σi*(-vi),也就是u和v同时取反得到的结果是一样的,而这会导致通过PCA降维得到不一样的结果(虽然都是正确的)。

整个PCA过程貌似及其简单,就是求协方差的特征值和特征向量,然后做数据转换。但是有没有觉得很神奇,为什么求协方差的特征向量就是最理想的k维向量?其背后隐藏的意义是什么?整个PCA的意义是什么?

4. PCA的理论推导

PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。

我在这里只介绍最大方差理论:

d92ed6c4c61868f897ddd6a7fb746db9.png

在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化):

3896362f3a7df7e2ec45d285d1515656.png

假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

计算投影的方法见下图

c014c7b16b96cb41f8dcf1feb82cf917.png

图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>(即

或者
)。

5. 选择降维后的维度K(主成分的个数)

如何选择主成分个数K呢?先来定义两个概念:

88eaec57a196cc8bfaa0aeb2f5ff1757.png

选择不同的K值,然后用下面的式子不断计算,选取能够满足下列式子条件的最小K值即可。

7a422ed866103e92c33c15335f00e2fb.png

其中t值可以由自己定,比如t值取0.01,则代表了该PCA算法保留了99%的主要信息。当你觉得误差需要更小,可以把t值设的更小。上式还可以用SVD分解时产生的S矩阵来表示,如下面的式子:

8d4e3f7f7e8ba2c8ca95bcb53c7037b0.png
  1. 虽然PCA有降维的效果,也许对避免过拟合有作用,但是最好不要用PCA去作用于过拟合。
  2. 在训练集中找出PCA的主成分,(可以看做为映射 mapping),然后应用到测试集和交叉验证集中。而不是对所有数据集使用PCA然后再划分训练集,测试集和交叉验证集。

6. SVD与PCA的关系

假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n的矩阵A进行坐标轴的变化,P就是一个变换的矩阵从一个N维的空间变换到另一个N维的空间,矩阵A在空间中就会进行一些类似于旋转、拉伸的变化。

47f9f8006b0646a5c1c17c89c8e80e35.png

而将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是:

2e2abda8c03a75f73f620ce6428867ca.png

但是这个怎么和SVD扯上关系呢?之前谈到,SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…我们回忆一下之前得到的SVD式子:

1af878b33f696f959814a2048f5b5dbd.png

在矩阵的两边同时右乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵

,所以可以化成后面的式子

5866a0a79a28ee22f6d4d9dbc6485343.png

将后面的式子与A * P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。这里是将一个m * n 的矩阵压缩到一个m * r的矩阵,也就是对列进行压缩,如果我们想对行进行压缩(在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉)怎么办呢?同样我们写出一个通用的行压缩例子:

5086243ee1c6a583cd38a2fa07472237.png

这样就从一个m行的矩阵压缩到一个r行的矩阵了,对SVD来说也是一样的,我们对SVD分解的式子两边乘以U的转置

fd7a1c031891596e2321e88de7c230d5.png

这样我们就得到了对行进行压缩的式子。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对

进行特征值的分解,只能得到一个方向的PCA。

转载于:

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园​www.cnblogs.com
dde81c0c41fe86bd7b3021d28819063f.png
主成分分析(PCA)原理详解_网络_Microstrong-CSDN博客​blog.csdn.net
6fc6290cb811b05e5e557913fcc7af2f.png
http://blog.codinglabs.org/articles/pca-tutorial.html​blog.codinglabs.org

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

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

相关文章

matlab 图像坐标系

matlab 图像中图像坐标系与plot、 imrotate坐标系的区别 图像坐标系是以图像左上角为原点&#xff0c;访问图像像素点img&#xff08;m&#xff0c;n&#xff09;&#xff0c;如下图所示&#xff1a; plot的坐标系&#xff0c;以图像左上角为原点&#xff0c;在图像中划线时&am…

matlab impyramid图像金字塔

B impyramid&#xff08;I, direction&#xff09; direction 可取‘reduce’或‘expand’&#xff0c;表示图像的宽度与高度缩小为原来的1/2与变大为原来的2倍

python你会吗_Python这些问题你会吗?

Python这些问题你会吗&#xff1f;final作用域的代码一定会被执行吗&#xff1f;正常的情况下&#xff0c;finally作用域的代码一定会被执行的&#xff0c;不管是否发生异常。哪怕是调用了sys.exit函数&#xff0c;finally也是会被执行的&#xff0c;那怎么样才能让finally代码…

perl大骆驼和小骆驼_你好骆驼:自动文件传输

perl大骆驼和小骆驼Apache Camel在其主页上 &#xff08;以及Camel用户指南中 &#xff09;将其描述为“基于已知企业集成模式的通用开源集成框架”。 Camel框架基于《 企业集成模式 》一书&#xff0c;并提供了该书中描述的模式的实现 。 我看一下这篇文章中使用Camel的“ Hel…

Django实战1-权限管理功能实现-01:搭建开发环境

1 项目开发环境 语言环境&#xff1a; python3.6.2 , django-2.1.2数据库环境&#xff1a;sqlite3(开发环境使用&#xff0c;部署环境使用mysql5.6)开发工具&#xff1a;pycharm2 安装python 说明&#xff1a;已经安装过python3.6环境的可以跳过此步。 python安装包下载地址&a…

matlab imhist灰度直方图

imhist()函数显示图像直方图要求图像是二维的灰度图像。 1.h imhist&#xff08;I&#xff09;:直接显示灰度图像I的直方图 2.h imhist(I,b):b是用来形成直方图的‘容器’的数目,默认256。 3.h imhist(X,map):显示索引图像的直方图&#xff0c;此直方图显示颜色映射图上色…

python语言程序设计计算机二级难不难_全国计算机二级的难度有多大?

计算机二级任选一科目考试及格即可获取计算机二级证书。自2019年3月考试起&#xff0c;二级语言类及数据库类科目(即除MS Office高级应用外的其他二级科目)调整获证条件为&#xff1a;总分达到60分且选择题得分达到50%及以上(即选择题得分要达到20分及以上)的考生方可取得合格证…

Jacobian 和Hessian矩阵

雅克比&#xff08;Jacobian matrix&#xff09;矩阵&#xff1a;目标函数f为一个函数向量&#xff0c;f(f1(x),f2(x),…fm(x))T&#xff0c;自变量x(x1,x2,…,xn)T&#xff1b;函数向量f对x求梯度&#xff0c;结果为一个矩阵&#xff1b;行数为f的维数&#xff1b;列数位x的维…

循环语句 for循环、while循环、do while循环

循环语句可以在满足循环条件的情况下&#xff0c;反复执行某一段代码&#xff0c;这段被重复执行的代码被称为循环体语句&#xff0c;当反复执行这个循环体时&#xff0c;需要在合适的时候把循环判断条件修改为false&#xff0c;从而结束循环&#xff0c;否则循环将一直执行下去…

获取按钮点击次数_无限次数使用,不会吧?不会吧?

就目前来说国内设计教程的网站虎课网还是很不错的里面的教程都很丰富但无奈的是普通用户每天只能学习一个课程想要学习多点就要充值而且会员只能开通年费对于只需偶尔学习一下的小伙伴来说可能太浪费了所以今天来大家分享一个超好用的浏览器插件官网看(适用平台&#xff1a;Chr…

现代化历险记:策略+将COBOL转换为Java的示例

在Keyhole Software&#xff0c;我们在很大程度上是一家现代化公司。 我们拥有一些顾问&#xff0c;他们专门研究将旧的代码迁移到新的&#xff0c;翻新的残旧代码库&#xff0c;并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的有趣的副作用&#xff0c;我…

String类的特点和使用步骤

概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如 "abc" &#xff09;都可以被看作是实现此类的实例 类 String 中包括用于检查各个字符串的方法&#xff0c;比如用于比较字符串&#xff0c;搜索字符串&#xff0c;提取子字符串以及…

Ostu最大类间差方法

Ostu方法又名最大类间差方法&#xff0c;通过统计整个图像的直方图特性来实现全局阈值T的自动选取&#xff0c;其算法步骤为&#xff1a; 1) 先计算图像的直方图&#xff0c;即将图像所有的像素点按照0~255共256个bin&#xff0c;统计落在每个bin的像素点数量 2) 归一化直方图…

pads 文本不能修改_斜框检测经典网络(文本)- R2CNN

论文题目&#xff1a;R2CNN&#xff1a;Rotational Region CNN for Orientation Robust Scene Text Detection论文来源&#xff1a;2017CVPR论文地址&#xff1a;https://arxiv.org/abs/1706.09579论文代码&#xff1a;https://github.com/DetectionTeamUCAS/R2CNN_Faster-RCNN…

【题解】炮兵阵地

【题解】炮兵阵地 luogu 题解 暴力状压记录上一行和上上行信息&#xff0c;暴力判断是否存在不合法的阵地&#xff0c;暴力滚动数组&#xff0c;暴力统计&#xff0c;暴力转移即可。 看了yyb代码&#xff0c;我感觉我不曾写过代码... 加入说不要那么暴力也可以&#xff0c;可以…

matlab reshape矩阵维度变换

B reshape(A,m,n) 将矩阵A的元素返回到一个mn的矩阵B。如果A中没有mn个元素则返回一个错误。 B reshape(A,m,n,p,...) or B reshape(A,[m n p ...]) 把A中元素进行重塑成mnp…的矩阵&#xff0c;特别地&#xff0c;指定的维数mnp…的积必须与prod(size(A))相同。 …

使用Arquillian测试Spring Data + Spring Boot应用程序(第2部分)

在上一篇文章中 &#xff0c;我写了关于如何使用Arquillian Cube和 Docker一起测试Spring Data应用程序的信息。 测试看起来像&#xff1a; RunWith(SpringRunner.class) SpringBootTest(classes PingPongController.class, webEnvironment RANDOM_PORT) ContextConfigurati…

OpenCV circle图像上画圆

OpenCV中circle与rectangle函数显示&#xff0c;只不过rectangle在图像中画矩形&#xff0c;circle在图像中画圆。 void circle(Mat img, Point center, int radius, Scalar color, int thickness1, int lineType8, int shift0) img为源图像 center为画圆的圆心坐标 radius…

如何得到长整数逆序后的整数

目录 一 如何得到长整数逆序后的整数注&#xff1a;原创不易&#xff0c;转载请务必注明原作者和出处&#xff0c;感谢支持&#xff01; 一 如何得到长整数逆序后的整数 最近在写代码遇到这样一个问题&#xff1a;如何得到得到一个长整型数逆序后的长整型数&#xff1f;比如输入…

python网页表格读取_是否可以读取网页html表格数据?

我目前正在考虑一些自动读取网页数据。因此&#xff0c;有没有可能从网页中读取以下类型的表格&#xff1a;excel应该有一个值name of condion,Operator and Expressions。在编辑>>> from urllib import urlopen>>> from bs4 import BeautifulSoup>>&g…