展开全部
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 减少矩阵维度e68a84e8a2ad3231313335323631343130323136353331333363373665
* @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];
//通过特征值将符号向量从大到小排序
List beans = new ArrayList();
for (int i = 0; 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; i
ComplexDoubleMatrix dm = beans.get(i).vector;
DoubleMatrix real = dm.getReal();
newVec.putRow(i, real);
}
return newVec.mmul(source);
}
static class PCABean implements Comparable {
double eigenValue;
ComplexDoubleMatrix vector;
public PCABean(double eigenValue, ComplexDoubleMatrix vector) {
super();
this.eigenValue = eigenValue;
this.vector = vector;
}
@Override
public int compareTo(PCABean o) {
return Double.compare(o.eigenValue, eigenValue);
}
@Override
public String toString() {
return "PCABean [eigenValue=" + eigenValue + ", vector=" + vector + "]";
}
}
}
org.jblas的jar包去百度下一个,我不知道怎么上传文件