由于目前在学习统计机器学习这本书,首先学习研究学习了常用的相似性度量 及 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;
}
}