导入jar包:Jama-1.0.2.jar
//========计算类===========
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;
/*
* 算法步骤:
* 1)将原始数据按列组成n行m列矩阵X
* 2)特征中心化。即每一维的数据都减去该维的均值,使每一维的均值都为0
* 3)求出协方差矩阵
* 4)求出协方差矩阵的特征值及对应的特征向量
* 5)将特征向量按对应的特征值大小从上往下按行排列成矩阵,取前k行组成矩阵p
* 6)Y=PX 即为降维到k维后的数据
*/
public class PCA {
private static final double threshold = 0.95;// 特征值阈值
/**
*
* 使每个样本的均值为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;
}
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)