python多线程有几种实现方法,都是什么,多线程python实现方式
正如序言所说,做赶超技术博客。这仍然不是一个伟大的水平,但这是第一步。希望以后每天都有一点进步。
我接触机器学习一年多了,学了很多算法。PCA是数据预处理中的一个重要算法。当时我也在网上看了很多资料,简单的PCA也有严格的数学推导。通过当时的研究生考试,我知道了为什么数学这么难。
本文主要是PCA算法的总结,数学原理主要来自PCA的数学原理(http://博客。coding labs . org/articles/PCA-tutorial . html),并进行总结)。
本文中的数学概念简介Scikit-learn是用来衡量随机变量与其数学期望(均值)的偏差。统计学中的方差(样本方差)是每个数据的方差之和及其平均值的平均值。
33558www。Sina.com/:2:是一种用于测量两个随机变量之间关系的统计量。协方差为0的两个随机变量没有相关性。
方差:在统计学和概率论中,协方差矩阵的每个元素就是每个向量元素之间的协方差。矩阵对角线上的特殊元素是向量的方差。
摘自3354百度百科
尤其是协方差这个概念很重要。
介绍PCA协方差矩阵,这是一种探索高维数据的技术。PCA通常用于搜索和可视化高维数据集。它还可以用于数据压缩、数据预处理等。PCA可以将可能具有线性相关性的高维变量合成为线性无关的低维变量,称为协方差矩阵。新的低维数据集尽可能保留原数据的变量,将高维数据集映射到低维空间。
必须是主成分分析(Principal Component Analysis)。在原始数据中对模型没有影响,希望通过降维来改善是不现实的。但考虑到实际数据本身往往存在的相关性,可以考虑在降维的同时尽可能减少信息损失的方法。俊秀的故事给原始数据带来了不错的效果,但是因为太慢,模型太复杂,所以可以降低PCA维度。
默认情况下,PCA的理论基的二维空间是(1,0)和(0,1)作为一组基。
实际上,两个线性无关的二维向量可以是一个群的基。因为正交群具有良好的性质,所以常用的群都是正交的。
例如,只有一个(3,2)不能正确表示一个向量。这里的3实际上是指向量在X轴上的投影值是3,在Y轴上的投影值是2。即隐式引入基于默认选择(1,0)和(0,1)的定义,它们是相对于X轴和Y轴的正方向长度为1的向量。
内积向量A和B的内积公式如下。
ab= a b cos(a)ab= a b cos(a))。
优选的底物类型是1。因为在内积的意义上,可以知道如果底数的模型为1,那么矢量点与底数相乘就可以很容易地得到底数上的新坐标,即主成分(principal components)。
基变换的矩阵表示将一系列向量的基变换表示为矩阵的乘法。一般来说,如果我们有M个N维向量,想把它们转换到R个N维向量表示的新空间(R基),那么如果我们先逐行构造R基,再逐列构造矩阵P,那么两个矩阵的乘积就是转换结果。R可以小于n,但R决定了转换数据的维数。也就是第一到第n维的数据可以转换到更低维的空间,转换后的维依赖于基数。
因此,这个矩阵的乘法可以表示降维变换:
YRM=PRNXNMYRM=PRNXNM
两个矩阵相乘的意义:注意:降维就意味着信息的丢失
如何选择优化目标的基础是最好的。或者说,如果我们有一组N维向量,现在化简为R维,应该如何选择R基才能最大限度地保留原始信息?
对于二维空间:在二维平面中选择一个方向,将所有数据投影到该方向所在的直线上,用投影值表示原始记录。这是一个从两个维度降一个维度的实际问题。那么,如何选择这个方向才能留下尽可能多的原始信息呢?作为直观的看法,希望投影后的投影值尽可能分散,但分散的程度在数学上可以表示为向量在基上的投影=向量与基的内积=坐标。
对于将上述两个维度降维为一个维度的问题,只需找到方差最大的方向即可。然而,更高维度还有另一个问题。考虑三维降维到二维的问题,和之前一样,我想先找到投影后方差最大的方向。这完成了第一方向的选择,然后选择第二投影方向。如果单纯选择方差最大的方向,很明显这个方向和第一个方向应该是“几乎重叠”的。显然,这样的维度是没有用的,所以
,应该还有其他约束。直观来说,让两个不同的维度代表尽可能多的原始信息。我们不希望它们之间存在(线性)相关性,因为相关性意味着两个维度不是完全线性独立的,必然存在重复的信息。
数学上,协方差用于表示两个维度之间的相关性。当协方差为0时,表示两个维度完全独立。为了使协方差为0,我们在选择第二基的时候,只能选择与第一基正交的方向,所以最后选择的两个方向一定是正交的。
降维问题的优化目标:将一组N维向量降维为R维,其目标是选取R单位正交基,使原始数据变换到这组基后,各维的协方差为0,而各维的方差尽可能大(在正交性约束下,取最大R方差)。
协方差矩阵导出优化目标,那么如何实现呢?以下是协方差矩阵。回过头来看,协方差矩阵的每个元素都是每个向量元素之间的协方差。特别地,矩阵对角线上的元素是每个向量的方差。
设原矩阵为X(NM),代表M个n维向量,其协方差矩阵为c(nn);P(RN)是变换矩阵;Y(RM)是目标矩阵,它的协方差矩阵是D.我们要求降维矩阵Y的每一维所包含的数据足够分散,即每一行(维)的方差足够大,行与行之间的元素线性无关,即行与行之间的协方差都是0,这就要求协方差矩阵D的对角线元素足够大,除对角线外的元素都是0。
相当于C的协方差矩阵对角化.
具体推导如下:
D=1 myy=1 mpxxP=PCPD=1 myy=1 mpxxP=PCP
c是x的协方差矩阵,是实对称矩阵,整个PCA降维过程其实就是一个实对称矩阵对角化的过程。
在具体的PCA算法步骤中有m个n维数据:
原始数据被分组到具有n行和m列的矩阵x中。
对X的每一行执行零均值化,即减去每行的平均值。
求x的协方差矩阵c
求协方差矩阵C,C的特征值就是Y的每维元素的方差,也是D的对角线元素的特征值和对应的特征向量,由大到小对角排列形成d。
根据实际业务场景,取特征向量按对应特征值大小从上到下按行排列成矩阵的前R行组成矩阵p。
Y=PX是降维到R维的目标矩阵。
Scikit-learn PCA案例分析Scikit-learn是Python下著名的机器学习库,这里就不介绍了。反正很好很厉害。
首先,选择经典的手写字符数据作为数据。
从sk学习导入数据集digits=datasets . load _ digits()x=digits . data #输入数据y=digits.target #输出数据PCA调用也很简单。
从sk学习导入分解PCA=decomposition . PCA()PCA . fit(x)可视化,matplotlib是Python下的一个图库,功能也很强大。
将matplotlib.pyplot导入为PLT PLT . figure()PLT . plot(PCA . explained _ variance _, k ,line width=2)PLT . xlabel( n _ components ,Fonize=16) PLT。YLABEL (explained _ variance _ ,Fontsize=16) PLT。SHOW () PCA。explained _ variance _是上面协方差矩阵D的对角元素,如下图所示:
至于缩减到多少维,主要看方差。具体方法可以是交叉验证。
实现基于Nnmpy, Pandas, Matploylib的PCA算法实现PCA并可视化结果。整个代码非常简单。按照上面总结的算法步骤一步一步计算。Numpy和熊猫很厉害,你能想到的操作几乎都有。
首先,定义异常类:
classdimensionvalueerror(value error):“”定义异常类“”传递定义PCA类:
类PCA(object): 定义了PCA类 def __init__(self,x,n _ components=None):self . x=x self . dimension=x . shape[1]If _ components和n _ components=self。维:提高维值错误(“n _ components错误”)本身。n _ components=n _ components接下来,计算协方差矩阵,特征值,特征向量,为了下面的计算方便,我把特征值和特征向量整合在一个数据帧中,按照特征值的大小降序排列:
Def cov(self): 求x x _ T=NP . transpose(self . x)# matrix transpose x _ cov=NP . cov(x _ T)#协方差矩阵return x_cov def get_feature(self): 求协方差矩阵C x _ cov=self.cov () a,B=NP . linalg . EIG(x _ cov)m=a . shape[0]C=NP . h stack((a . reshape((m,1))B)C _ Csort (columns=0,ascending=false)返回c _ df _ sort最后,降维有两种方式。指定降维,根据方差贡献率自动降维。默认差异贡献率为99%:
Def reduce_dimension(self): 指定降维并根据方差贡献率自动降维 C _ DF _ sort=self . get _ feature()variance=self . explained _ variance _()IF self . n _ components:#指定降维p=C _ DF _ sort . values[0:self . n _ components,1:] y=np.dot (p, np.transpose(self.x))返回NP . transpose(y)varience _ sum=sum(varience)varience _ radio=varience/varience _ sum varience _ contribution=0 for R in x range(self . dimension):varience _ contribution=varience _ radio[R]Verience _ contribution=0.99:break p=c _ df _ sort . values[0:R1,1:] #取第一个R个特征向量y=np.dot (p,np.transpose (self.x))返回NP . transpose(transpose
后记根据以上对PCA数学原理的解释,我们可以知道PCA的一些能力和局限性。PCA本质上是以方差最大的方向作为主要特征,对每个正交方向上的数据进行“去相关”,也就是使它们在不同的正交方向上不相关。
因此,PCA也有一定的局限性,比如可以很好的去除线性相关性,但是对于高阶相关性就没有办法了。对于高阶相关的数据,可以考虑核PCA,通过核函数将非线性相关转化为线性相关,这一点我们就不讨论了。另外,PCA假设数据的主要特征分布在正交方向上,如果有几个方向在非正交方向上方差很大,那么PCA的效果就会大打折扣。
最后需要说明的是,PCA是一种无参数的技术,也就是说,面对同样的数据,如果不考虑清洗,谁做都是一样的结果,没有主观参数的干预,所以PCA很容易普遍实现,但不能单独优化。
希望本文可以帮助朋友们了解PCA的数学理论和实现原理,从而了解PCA的适用场景和局限性,以便更好地利用这种算法。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。