由于目前在学习统计机器学习这本书,首先学习研究学习了常用的相似性度量 及 java和python实现计算,详见http://blog.csdn.net/qq_36603091/article/details/78216124
在学习第一感受就是python真是太好了!!!!
而java太繁琐,但是没办法公司项目还是要java 没办法 还是要用java!!!!
在求解马氏距离的时候需要用到矩阵的计算,那刚开始接触了jama
一、jama简介
Jama是一个基本的线性代数java包。包括一个基本的Matrix类和5个矩阵分解类。
Matrix类提供了基本的线性代数数值运算的功能,不同的构造函数可以构造双精度和浮点精度的二维数组,而不同的gets和sets方法可以返回子矩阵和矩阵元素。
官方文档:http://math.nist.gov/javanumerics/jama/doc/
math3简介
math3是Apache下的一款进行数学计算的一款java开源工具。jar包名称为:commons-math3.jar。大家可以通过maven或者其他网站进行下载。
math3是一款非常好用的工具,里面提供了各种运算的方法及类,方便大家调用。其API文档为:http://commons.apache.org/proper/commons-math/javadocs/api-3.2/index.html。可以参照API文档进行学习,也可以在实战中,进行学习。
数组转化为矩阵,矩阵的逆,矩阵的转置,矩阵的乘法,矩阵转为数组等等 非常方便 貌似没发现jama有矩阵转数组的 功能。
package aa; import org.apache.commons.math3.linear.Array2DRowRealMatrix; import org.apache.commons.math3.linear.DecompositionSolver; import org.apache.commons.math3.linear.LUDecomposition; import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.stat.descriptive.moment.Mean; public class Math { @SuppressWarnings("unused") public static void main(String[] args) { //double[]数组转换为矩阵 double[] x0={10,2,3}; double[] x1={-1,30,1.0}; double[] x2={200,200,5000}; double[] x3={3000,1000,1000}; double[][] x = {{10,2,3},{-1,30,1.0},{200,200,5000}}; RealMatrix matrix0 = new Array2DRowRealMatrix(x0); RealMatrix matrix1 = new Array2DRowRealMatrix(x1); RealMatrix matrix2 = new Array2DRowRealMatrix(x2); RealMatrix matrix3= new Array2DRowRealMatrix(x3); RealMatrix matrix= new Array2DRowRealMatrix(x); RealMatrix inverseMatrix =inverseMatrix(matrix);//矩阵求逆 System.out.println(inverseMatrix); RealMatrix combinedCol =combinedCol(matrix1,matrix2); System.out.println(combinedCol); RealMatrix combinedRow =combinedRow(matrix1,matrix2); System.out.println(combinedRow); RealMatrix meanRow = meanRow(matrix); RealMatrix mean = mean(matrix); System.out.println(meanRow); System.out.println(mean); //矩阵相乘、获取返回的第一列数据 RealMatrix pMatrix = matrix;//matrix和matrix2相乘 System.out.println(pMatrix); double[] y = pMatrix.scalarMultiply(1/1).getColumn(0);//获取到第一列 for (int i = 0; i < y.length; i++) { System.out.println(y[i]); } } //矩阵求逆 public static RealMatrix inverseMatrix(RealMatrix matrix) { LUDecomposition LUDe = new LUDecomposition(matrix); DecompositionSolver solver = LUDe.getSolver(); RealMatrix result = solver.getInverse(); return result; } //按列合并矩阵[a/b] public static RealMatrix combinedCol(RealMatrix a, RealMatrix b) { int col = a.getColumnDimension() + b.getColumnDimension(); int row = a.getRowDimension(); RealMatrix result = MatrixUtils.createRealMatrix(row, col); int temp = a.getColumnDimension(); for (int i = 0; i < col; i++) { if (i < a.getColumnDimension()) { for (int j = 0; j < row; j++) { result.setEntry(j, i, a.getEntry(j, i)); } } else { for (int j = 0; j < row; j++) { result.setEntry(j, i, b.getEntry(j, i - temp)); } } } return result; } //按行合并矩阵[a,b] public static RealMatrix combinedRow(RealMatrix a, RealMatrix b) { int col = a.getColumnDimension(); int row = a.getRowDimension() + b.getRowDimension(); int temp = a.getRowDimension(); RealMatrix result = MatrixUtils.createRealMatrix(row, col); for (int i = 0; i < row; i++) { if (i < a.getRowDimension()) { for (int j = 0; j < col; j++) { result.setEntry(i, j, a.getEntry(i, j)); } } else { for (int j = 0; j < col; j++) { result.setEntry(i, j, b.getEntry(i - temp, j)); } } } return result; } //返回各列平均值1*col public static RealMatrix mean(RealMatrix a) { int col = a.getColumnDimension(); double[] data = new double[col]; for (int i = 0; i < col; i++) { data[i] = new Mean().evaluate(a.getColumn(i)); } RealMatrix result = MatrixUtils.createRowRealMatrix(data); return result; } //返回各行平均值row*1 public static RealMatrix meanRow(RealMatrix a) { int row = a.getRowDimension(); double[] data = new double[row]; for (int i = 0; i < row; i++) { data[i] = new Mean().evaluate(a.getRow(i)); } RealMatrix result = MatrixUtils.createRowRealMatrix(data); return result; } //获取指定列的元素 public static RealMatrix getColMatrix(RealMatrix absMatrix) { RealMatrix a = absMatrix.getColumnMatrix(1);//此处的1指第二列 return a; } }