javapca算法代码 javagc算法

求pca(PricipalComponentAnalysis)的java代码package PCA;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jblas.ComplexDoubleMatrix;
import org.jblas.DoubleMatrix;
import org.jblas.Eigen;
public class PCA {
/**
* Reduce matrix dimension减少矩阵维度
* @param source源矩阵
* @param dimension目标维度
* @return Target matrix返回目标矩阵
*/
public static void main(String[] args){
DoubleMatrix d = new DoubleMatrix(new double[][]{{-1,-1,0,2,0},
{-2,0,0,1,1}});
DoubleMatrix result = PCA.dimensionReduction(d, 2);
System.out.println(result);
}
public static DoubleMatrix dimensionReduction(DoubleMatrix source, int dimension) {
//C=X*X^t/m矩阵*矩阵^异或/列数
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//通过特征值将符号向量从大到小排序
ListPCABean beans = new ArrayListPCA.PCABean();
for (int i = 0; ieigVectors.columns; i) {
beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; idimension; i) {
ComplexDoubleMatrix dm = beans.get(i).vector;
DoubleMatrix real = dm.getReal();
newVec.putRow(i, real);
}
return newVec.mmul(source);
}
static class PCABean implements ComparablePCABean {
double eigenValue;
ComplexDoubleMatrix vector;
public PCABean(double eigenValue, ComplexDoubleMatrix vector) {
super();
this.eigenValue = https://www.04ip.com/post/eigenValue;
this.vector = vector;
}
@Override
public int compareTo(PCABean o) {
return Double.compare(o.eigenValue, eigenValue);
}
@Override
public String toString() {
return "PCABean [eigenValue="https://www.04ip.com/post/eigenValue", vector="vector"]";
}
}
}
org.jblasjavapca算法代码的jar包去百度下一个javapca算法代码 , javapca算法代码我不知道怎么上传文件
pca算法介绍及简单实例主成分分析(Principal components analysis , PCA)是一种分析、简化数据集的技术 。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征 。
简而言之,PCA就是压缩数据,降低维度 , 把重要的特征留下来 。
目的:
当你有上百上千个特征,它们可能来自不同的部门给的数据,可能这些来自不同的数据是可以互相推导的,或者某个特征是对结果没什么影响的,或者来自不同的部门的数据其实在描述同一个问题,那么这些冗余的特征是没有价值的 。
我们可以通过降低维度(用机器学习的话来说就是去掉一些特征)来提高算法效率 。
在解决机器学习问题时,如果能把数据可视化,可以大大帮助我们找到解决方案 。但是,如果特征太多(即维数太多),你很难画出图,就算画出来了也不容易理解 。
我们可以通过降低维度使数据反映在平面或者立体空间中 , 便于数据分析
对于一组数据,如果它在某一坐标轴上的方差越大,说明坐标点越分散,该属性能够比较好的反映源数据 。所以在进行降维的时候,主要目的是找到一个超平面,它能使得数据点的分布方差呈最大,这样数据表现在新的坐标轴上时候已经足够分散了 。
我们要对数据样本进行中心化 , 中心化即是指变量减去它的均值 。我们通过坐标轴变换,使得原本属于x轴的数据样本变成w轴样本 。我们希望变化后的数据在坐标轴w的呈现的值z的方差最大,则我们会得到图示目标函数,并且由于w是坐标轴,所以我们会得到一个约束条件 。根据拉格朗日乘子法可以解决该问题,经过处理后我们把问题变成了x协方差求特征值,求特征向量的问题了 。
我们已经在上述过程中知道了问题的数学模型,我们可以解除p个特征值与对应的特征向量 。我们可以对特征值进行大到小排序,如果我们要从p维 -- q维(q<p),那么我们只需要取前q个特征值对应的特征向量进行向量相乘 。如果问题并没有给出具体q的值 , 那么我们可以通过计算如下式子便可以知道q的取值 。其中t的取值相当于是一个阈值,比如我们需要保留80% , 那么t=0.8即可 。
(1)假设我们有一个二维数据 , 我们要通过PCA的方法来将这个二维数据降到一维 。
(2)因为数据已经中心化,所以我们就省去了中心化的步骤 。我们开始求x协方差 。
先来看看协方差的定义和计算方式 。
计算结果如下
同样的 , 了解一下特征值和特征向量的定义以及计算方式
以此题为例 , 分两步来做
a.由矩阵A的特征方程求特征值
b.把每个特征值代入线性方程组,求出基础解系 。(打不出来莱姆达我也很难受)
结果如下
⑥将二维变成一维,选择最大的特征值和对应的特征向量进行降维,结果如下
(十)PCA降维算法主成分分析(Principal components analysis , 以下简称PCA) 是最重要的降维方法之一 。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用 。它可以通过 线性变换 将原始数据变换为一组 各维度线性无关 的表示 , 以此来提取数据的主要线性分量 。需要注意的是,PCA一般只用于线性数据降维,对于非线性数据一般采用KPCA 。
降维就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据 , 并且希望损失尽可能的小 。首先看几张图,有一个直观的认识 。
这里面,把椭圆看成是数据:
基于这个知识 , 如果我们想对数据进行降维的话,比如图1的两个维度的数据降成一维,我们可以选择保留X1这个维度的数据,因为在这个维度上蕴含的信息量更多 。同理 , 图2就可以保留x2这个维度的数据 。但是,问题来了,图3应该保留哪个维度的数据呢?答案是保留哪个维度都不好,都会丢失较大的信息量 。但是,如果我们把图3的坐标轴旋转一下
比较容易看出,图3在新的坐标轴下就能进行降维了 。
所以,第一 , 变换正确的坐标轴(基);第二 , 保留方差最大的几个轴作为主成分,这样的做法就是PCA的核心思想 。
从前文可以看出,理想的坐标轴是要求数据投在新坐标轴后,尽可能的分散,也就是数据的方差最大 。然后每次选择方差最大的轴作为主成分 。
将前文2维降1维的例子扩展到更高维度,还有一个问题需要解决,考虑三维降到二维问题 。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向 。如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的 , 因为发生了大量的信息重复,起不到降维的作用,因此,应该有其他约束条件——就是正交 。PCA要求轴与轴之间是正交的,也就是不同维度的信息相关性为0 。
在表示相关性中,相关系数与协方差是等价的,这里为了方便计算,使用协方差 。下面是协方差公式,当协方差为0时,表示两个特征a,b线性不相关 。
可以发现,当a=b时,协方差公式就变成了方差公式 , 方差是特殊的协方差 。如果运气更好,特征a与b的平均数都为0,那么公式会进一步简化,得到:
所以说,为了计算方便 , PCA降维前,一般都要求将所有特征属性中心化,即平均数为0 。
因为PCA要求,同一轴内方差最大,不同轴协方差为0,如何把它们放在一块呢?这里就引入了协方差矩阵的概念:
假设有m个样本,每个样本特征维度是2,每个特征都经过中心化处理:
我们发现协方差矩阵的对角线是方差 , 而且是对称矩阵 。方差和协方差都放在了一个矩阵里面,只需对这个矩阵优化,使它除了对角线的其余元素都为0,就可以了,美滋滋 。
我们知道矩阵乘法 , 本质上就是一种线性变换的过程 。而正交基矩阵的乘法,则是坐标系变换的过程 。设原空间的数据为X , 协方差矩阵为C,经过正交基矩阵P,得到了新坐标系下的数据Y,即Y=PX 。那么新坐标系下的协方差矩阵D是怎样的呢?
我们发现,新旧空间的协方差矩阵是有关系的,而且都和变换矩阵P有关系 。问题就转化成了 , 能不能找到一个矩阵P,使得新空间下的协方差矩阵的非对角线元素都为0.
首先,原始数据矩阵X的协方差矩阵C是一个实对称矩阵,它有特殊的数学性质:
也就是说,P就是是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量 。如果设P按照中特征值的从大到小 , 将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
其实,经过数学上的推导的,我们就可以知道,特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差 。
由于协方差矩阵的维度和特征相同 , 所以在进行特征值分解时,得到的特征值数目不会超过特征的数目 。
在学习线性代数时 , 我们都会学矩阵的特征值分解,我们知道一个方阵A经过 特征值分解 后就得到 特征向量 和 特征值 了 。那么,这个所谓的特征值和特征向量到底是什么东西呢?
很多人都会说是那个经典的式子:
首先给出概念上的一种解释 。所谓的特征值和特征向量,最重要的是理解“特征”这两个字,特征向量翻译为eigen vector, eigen这个单词来自德语,本义是在“本身固有的,本质的” 。纯数学的定义下 , 并不能很明白地理解到底为什么叫做特征值和特征向量 。但是举一个应用例子,可能就容易理解多了 。
在图像处理中,有一种方法就是特征值分解 。我们都知道图像其实就是一个像素值组成的矩阵,假设有一个100x100的图像,对这个图像矩阵做特征值分解,其实是在提取这个图像中的特征,这些提取出来的特征是一个个的向量,即对应着特征向量 。而这些特征在图像中到底有多重要,这个重要性则通过特征值来表示 。比如这个100x100的图像矩阵A分解之后,会得到一个100x100的特征向量组成的矩阵Q,以及一个100x100的只有对角线上的元素不为0的矩阵E , 这个矩阵E对角线上的元素就是特征值,而且还是按照从大到小排列的(取模,对于单个数来说,其实就是取绝对值),也就是说这个图像A提取出来了100个特征 , 这100个特征的重要性由100个数字来表示,这100个数字存放在对角矩阵E中 。在实际中我们发现,提取出来的这100个特征从他们的特征值大小来看,大部分只有前20(这个20不一定,有的是10,有的是30或者更多)个特征对应的特征值很大,后面的就都是接近0了,也就是说后面的那些特征对图像的贡献几乎可以忽略不计 。
我们知道,图像矩阵 A 特征值分解后可以得到矩阵 P 和矩阵 E (特征值对角矩阵):
我们可以看到,在只取前20个特征值和特征向量对图像进行恢复的时候,基本上已经可以看到图像的大体轮廓了,而取到前50的时候,几乎已经和原图像无异了 。明白了吧,这就是所谓的矩阵的特征向量和特征值的作用 。
所以归根结底,特征向量其实反应的是矩阵A本身固有的一些特征,本来一个矩阵就是一个线性变换 , 当把这个矩阵作用于一个向量的时候,通常情况绝大部分向量都会被这个矩阵A变换得“面目全非”,但是偏偏刚好存在这么一些向量 , 被矩阵A变换之后居然还能保持原来的样子,于是这些向量就可以作为矩阵的核心代表了 。于是我们可以说:一个变换(即一个矩阵)可以由其特征值和特征向量完全表述,这是因为从数学上看,这个矩阵所有的特征向量组成了这个向量空间的一组基底 。而矩阵作为变换的本质其实不就把一个基底下的东西变换到另一个基底表示的空间中么?
参考:
如何结合pca算法和最近邻法进行人脸识别%一个修改后javapca算法代码的PCA进行人脸识别javapca算法代码的Matlab代码
% calc xmean,sigma and its eigen decomposition
allsamples=[];%所有训练图像
for i=1:40
for j=1:5
a=imread(strcat('D:\rawdata\ORL\s',num2str(i),'\',num2str(j),'.pgm'));
% imshow(a);
b=a(1:112*92); % b是行矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右
b=double(b);
allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M=200
end
end
samplemean=mean(allsamples); % 平均图片,1 × N
for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”
end;
sigma=xmean*xmean'; % M * M 阶矩阵
[v d]=eig(sigma);
d1=diag(d);
[d2 index]=sort(d1); %以升序排序
cols=size(v,2);% 特征向量矩阵的列数
for i=1:cols
vsort(:,i) = v(:,index(cols-i 1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量
dsort(i) = d1( index(cols-i 1) ); % dsort 保存的是按降序排列的特征值,是一维行向量
end %完成降序排列
%以下选择90%的能量
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
while( dsum_extract/dsum0.9)
p = p1;
dsum_extract = sum(dsort(1:p));
end
i=1;
% (训练阶段)计算特征脸形成的坐标系
while (i0)
base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA的人脸识别算法研究》p31
i = i1;
end
% add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoor
allcoor = allsamples * base;
accu = 0;
%
for i=1:40
for j=6:10 %读入40 x 5 副测试图像
a=imread(strcat('D:\rawdata\ORL\s',num2str(i),'\',num2str(j),'.pgm'));
b=a(1:10304);
b=double(b);
tcoor= b * base; %计算坐标,是1×p阶矩阵
for k=1:200
mdist(k)=norm(tcoor-allcoor(k,:));
end;
%三阶近邻
[dist,index2]=sort(mdist);
class1=floor( index2(1)/5 ) 1;
class2=floor(index2(2)/5) 1;
class3=floor(index2(3)/5) 1;
if class1~=class2class2~=class3
class=class1;
elseif class1==class2
class=class1;
elseif class2==class3
class=class2;
end;
if class==i
accu=accu 1;
end;
end;
end;
accuracy=accu/200 %输出识别率
函数调用是定义函数,然后用函数名进行调用就可以javapca算法代码了
C#中如何编写PCA算法代码?PCA的处理步骤javapca算法代码:
1javapca算法代码 , 均值化
2javapca算法代码 , 求协方差矩阵(javapca算法代码我知道的有两种方法 , 这是第一种,按部就班的求,第二种是javapca算法代码:(A*A‘/(N-1)))
3,求协方差的特征值和特征向量
4,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵
5,将样本点投影到选取的特征向量上
matlab实现源代码
%PCA算法,matlab实现
function F=pcad(A,n)%A是M*N
%测试实例A=[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1;2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9]
%结果F=[0.8280,-1.7776,0.9922,0.2742,1.6758,0.9129,-0.0991,-1.1446 , -0.4380 , -1.2238]
%PCA第一步:均值化
X=A-repmat(mean(A,2),1,size(A,2))%去均值
%PCA第二步:求特征协方差矩阵
B=COV(X')%求协方差
%PCA第三步:求特征协方差矩阵的特征值和特征向量
[v,d]=eig(B)%求特征值和特征向量
%PCA第四步:将特征值按照从大到小的顺序排序
d1=diag(d);%取出对角矩阵,也就是把特征值提出来组成一个新的M*1的d1矩阵
[d2 index]=sort(d1); %特征值以升序排序 d2是排序后的结果 index是数排序以前的排名位置
cols=size(v,2);% 特征向量矩阵的列数
for i=1:cols%对特征向量做相反位置的调整 是个降序排列 。这个过程把特征值和特征向量同时做相应的降序排列
vsort(:,i) = v(:,index(cols-i 1) ); % vsort 是一个M*col(注:col一般等于M)阶矩阵 , 保存的是按降序排列的特征向量,每一列构成一个特征向量
%vsort保存的是协方差矩阵降序后的特征向量 , 为M*M阶
dsort(i) = d1(index(cols-i 1));% dsort 保存的是按降序排列的特征值,是一维行向量,1*M
end%完成降序排列
M=vsort(:,1:n)%提取主成分量
%PCA第五步:将样本点投影到选取的特征向量上
F=(X'*M)'%最终的投影
求代码大神,Java大腿解题,在线等 。感谢package myPcakage;
import java.util.Scanner;
public class atm {
public static void main(String[] args) {
System.out.print("输入金额javapca算法代码:");
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
int operateInput = input;
int yiBai = 0;
int wuShi = 0;
int erShi = 0;
int shi = 0;
int wu = 0;
int er = 0;
int yi = 0;
for (int i = 1; ioperateInput;) {
if (operateInput = 100) {
operateInput = operateInput - 100;
yiBai;
} else if (operateInput = 50) {
operateInput = operateInput - 50;
wuShi;
} else if (operateInput = 20) {
operateInput = operateInput - 20;
erShi;
} else if (operateInput = 10) {
operateInput = operateInput - 10;
shi;
} else if (operateInput = 5) {
operateInput = operateInput - 5;
wu;
} else if (operateInput = 2) {
operateInput = operateInput - 2;
er;
} else if (operateInput = 1) {
operateInput = operateInput - 1;
yi;
}
}
System.out.println("取款javapca算法代码:"input);
System.out.println("100元javapca算法代码:"yiBai"张");
System.out.println("50元javapca算法代码:"wuShi"张");
System.out.println("20元javapca算法代码:"erShi"张");
System.out.println("10元:"shi"张");
System.out.println("5元:"wu"张");
System.out.println("2元:"er"张");
System.out.println("1元:"yi"张");
}
}
求打赏
【javapca算法代码 javagc算法】javapca算法代码的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于javagc算法、javapca算法代码的信息别忘了在本站进行查找喔 。

    推荐阅读