• wuxingyu
    了解作者
  • Java
    开发工具
  • 4KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2017-12-28 18:08
    上传日期
A face recognition algorithm of pca using java code
pca.rar
  • pca
  • PcaDimensionalityReduction.java
    5KB
  • Pca.java
    11.5KB
内容介绍
package com.bjtu.machinelearninggroup.imageprocessing; /** * Created by xingyu on 2017/12/24. */ import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import Jama.Matrix; import Jama.SingularValueDecomposition; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; /* * 算法步骤: * 1)将原始数据按列组成n行m列矩阵X * 2)特征中心化。即每一维的数据都减去该维的均值,使每一维的均值都为0 * 3)求出协方差矩阵 * 4)求出协方差矩阵的特征值及对应的特征向量 * 5)将特征向量按对应的特征值大小从上往下按行排列成矩阵,取前k行组成矩阵p * 6)Y=PX 即为降维到k维后的数据 */ public class Pca { private static final double threshold = 0.7;// 特征值阈值 /** * * 使每个样本的均值为0 * * @param primary * 原始二维数组矩阵 * @return averageArray 中心化后的矩阵 */ public double[][] changeAverageToZero(double[][] primary) { int n = primary.length;//样本个数 int m = primary[0].length;//特征个数 double[] sum = new double[m]; double[] average = new double[m]; double[][] averageArray = new double[n][m]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { sum[i] += primary[j][i]; } average[i] = sum[i] / n;//当前特征除以n个数 } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { averageArray[j][i] = primary[j][i] - average[i]; } } return averageArray; } /** * * 计算协方差矩阵 * * @param matrix * 中心化后的矩阵 * @return result 协方差矩阵 */ public double[][] getVarianceMatrix(double[][] matrix) { int n = matrix.length;// 行数 int m = matrix[0].length;// 列数 double[][] result = new double[m][m];// 协方差矩阵 for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { double temp = 0; for (int k = 0; k < n; k++) { temp += matrix[k][i] * matrix[k][j]; } result[i][j] = temp / (n - 1); } } return result; } /** * 求特征值矩阵 * * @param matrix * 协方差矩阵 * @return result 向量的特征值二维数组矩阵 */ public double[][] getEigenvalueMatrix(double[][] matrix) { Matrix A = new Matrix(matrix); // 由特征值组成的对角矩阵,eig()获取特征值 A.eig().getD().print(10, 6); double[][] result = A.eig().getD().getArray(); return result; } /** * 标准化矩阵(特征向量矩阵) * * @param matrix * 特征值矩阵 * @return result 标准化后的二维数组矩阵 */ public double[][] getEigenVectorMatrix(double[][] matrix) { Matrix A = new Matrix(matrix); A.eig().getV().print(6, 2); double[][] result = A.eig().getV().getArray(); return result; } /** * 寻找主成分 * * @param primaryArray * 原始二维数组数组 * @param eigenvalue * 特征值二维数组 * @param eigenVectors * 特征向量二维数组 * @return principalMatrix 主成分矩阵 */ public Matrix getPrincipalComponent(double[][] primaryArray, double[][] eigenvalue, double[][] eigenVectors) { Matrix A = new Matrix(eigenVectors);// 定义一个特征向量矩阵 double[][] tEigenVectors = A.transpose().getArray();// 特征向量转置 Map<Integer, double[]> principalMap = new HashMap<Integer, double[]>();// key=主成分特征值,value=该特征值对应的特征向量 TreeMap<Double, double[]> eigenMap = new TreeMap<Double, double[]>( Collections.reverseOrder());// key=特征值,value=对应的特征向量;初始化为翻转排序,使map按key值降序排列 double total = 0;// 存储特征值总和 int index = 0, n = eigenvalue.length; double[] eigenvalueArray = new double[n];// 把特征值矩阵对角线上的元素放到数组eigenvalueArray里 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) eigenvalueArray[index] = eigenvalue[i][j]; } index++; } for (int i = 0; i < tEigenVectors.length; i++) { double[] value = new double[tEigenVectors[0].length]; value = tEigenVectors[i]; eigenMap.put(eigenvalueArray[i], value); } // 求特征总和 for (int i = 0; i < n; i++) { total += eigenvalueArray[i]; } // 选出前几个主成分 double temp = 0; int principalComponentNum = 0;// 主成分数 List<Double> plist = new ArrayList<Double>();// 主成分特征值 for (double key : eigenMap.keySet()) { if (temp / total <= threshold) { temp += key; plist.add(key); principalComponentNum++; } } System.out.println("\n" + "当前阈值: " + threshold); System.out.println("取得的主成分数: " + principalComponentNum + "\n"); // 往主成分map里输入数据 for (int i = 0; i < plist.size(); i++) { if (eigenMap.containsKey(plist.get(i))) { principalMap.put(i, eigenMap.get(plist.get(i))); } } // 把map里的值存到二维数组里 double[][] principalArray = new double[principalMap.size()][]; Iterator<Entry<Integer, double[]>> it = principalMap.entrySet() .iterator(); for (int i = 0; it.hasNext(); i++) { principalArray[i] = it.next().getValue(); } Matrix principalMatrix = new Matrix(principalArray); return principalMatrix; } /** * 矩阵相乘 * * @param primary * 原始二维数组 * * @param matrix * 主成分矩阵 * * @return result 结果矩阵 */ public Matrix getResult(double[][] primary, Matrix matrix) { Matrix primaryMatrix = new Matrix(primary); Matrix result = primaryMatrix.times(matrix.transpose()); return result; } public Matrix getReConfigurationMatrix(double[][] primary,double[][] averageMatrix,Matrix feature){ double[][] Matrix=feature.transpose().getArray();//n*k int n = primary.length;//样本个数 int m = primary[0].length;//特征个数 double[] sum = new double[m]; double[] average = new double[m]; double[][] averageArray = new double[n][m]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { sum[i] += primary[j][i]; } average[i] = sum[i] / n;//当前特征除以n个数 } double[][] featureArray=feature.getArray(); System.out.println("feature"+featureArray[0].length); System.out.println("feature"+featureArray.length); double[] one=averageMatrix[0]; int d
评论
    相关推荐
    • video-Face-Detection-and-tracking.rar
      人脸检测定位:运动区域检测预处理, 肤色区域的分割和利用二值形态学等操作的人脸粗检,利用眼、嘴特征的彩色信息检测的人脸细检,利用投影法检测眼睛和嘴巴亮块的人脸定位。提出了一种基于自适应肤色模型匹配与...
    • facematch.zip
      人脸匹配算法。pdf文件,没有源代码。主要是论文中的实现。
    • faceRecognition.zip
      基于SVM和PCA人脸识别,使用了ORL人脸数据集和libsvm.jar
    • src.rar
      人脸识别模块,采用java编写,效果还不错
    • 基于javaCv实现的PCA人脸识别Demo
      使用javaCv实现的人脸识别小程序,包含有ORL人脸库图片,使用了PCA降维再识别的方法,识别率不高,只有46%左右,但有一定的参考意义,注释写的很详细!
    • 人脸识别程序Matlab程序
      基于SVM的人脸识别程序,包含人脸数据集,数据归一化程序,PCA降维程序,LibSVM等。容易理解,容易学习和程序移植。
    • 基于PCA和LDA实现的人脸识别程序
      Java语言+openCV实现的人脸识别,JavaFX实现的拍照程序,有界面
    • 成都四方伟业JAVA笔试题-Introduction:个人博客:www.bianzw.cn
      成都四方伟业JAVA笔试题 为了让各位老师更好地了解我,我将从荣誉成绩、项目实践和综合能力这三个方面展开介绍: 论文 Driving Assistance System Based on Deep Learning and Traditional Vision Zhenwei Bian, Tao...
    • 基于opencv3.1库的JAVA源码
      第1章 Java概述、安装及简易教学 14 1-1 Java概述 14 1-2 Java安装 16 1-3 Eclipse安装 18 1-4 GUI设计工具WindowBuilder 18 1-5 在Eclipse开发第一个Java程式 23 1-6 在Eclipse开发第一个Java视窗程式-显示影像 26 ...
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档