序言
API 有一个非常强大之处在于,是完全可以跨语言的。
numpy 工具强大到令人赞叹,那么 java 有没有类似的开源库呢?
答案是有的。
numpy 对应就是 ND4j。
ND4j
ND4J 是Java编写的开源、分布式深度学习项目,由总部位于旧金山的商业智能和企业软件公司Skymind牵头开发。
团队成员包括数据专家、深度学习专家、Java程序员和具有一定感知力的机器人。 通过科学计算,分析师能够从大数据中挖掘出价值。我们认为,业内对深入理解和挖掘数据之货币价值的旅程才刚刚起步。
因此,我们决定在Java虚拟机(JVM)环境下运用科学计算。
快速开始
maven 引入
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native-platform</artifactId>
<version>1.0.0-beta6</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7<</version>
</dependency>
矩阵的创建
创建一个全0的矩阵
创建一个全0的矩阵使用zeros方法
INDArray zeros = Nd4j.zeros(3,5);
构造一个3行5列的全0 的 ndarray。
如下:
[[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]]
创建一个全1的矩阵
INDArray ones = Nd4j.ones(3,5);
如下:
[[ 1.0000, 1.0000, 1.0000, 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000, 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000, 1.0000, 1.0000]]
创建一个随机矩阵
INDArray rand = Nd4j.rand(3,5);
如下:
[[ 0.7856, 0.6902, 0.9957, 0.2112, 0.6514],
[ 0.2687, 0.9486, 0.2844, 0.5083, 0.0264],
[ 0.8163, 0.3329, 0.0089, 0.1918, 0.0853]]
根据数组来创建矩阵
INDArray array1 = Nd4j.create(new float[]{2,2,2,2} ,new int[]{1,4});
如下:
[[ 2.0000, 2.0000, 2.0000, 2.0000]]
INDArray array2 = Nd4j.create(new float[]{5,2,6,2,6,6,6,6,9},new int[]{3,3});
如下:
[[ 5.0000, 2.0000, 6.0000],
[ 2.0000, 6.0000, 6.0000],
[ 6.0000, 6.0000, 9.0000]]
矩阵的修改
创建
INDArray nd = Nd4j.create(new float[]{1,2,3,4,5,6,7,8},new int[]{2,4});
如下:
[[ 1.0000, 2.0000, 3.0000, 4.0000],
[ 5.0000, 6.0000, 7.0000, 8.0000]]
double value = nd.getDouble(1, 3); //8.0
修改
现在对矩阵的值进行修改。
第1行第4列的值改为100
nd.putScalar(0,3,100);
获取矩阵的一行
INDArray row = nd.getRow(1);
- 替换第一行数据
INDArray row2 = Nd4j.create(new float[] {2,4,6,8});
nd.putRow(1,row2);
矩阵的计算
创建
//1*2
INDArray nd1 = Nd4j.create(new float[]{2,2},new int[]{1,2});
//2*1
INDArray nd2 = Nd4j.create(new float[]{3,3},new int[]{2,1});
//2*2
INDArray nd3 = Nd4j.create(new float[]{3,3,3,3},new int[]{2,2});
//2*2
INDArray nd4 = Nd4j.create(new float[]{4,4,4,4},new int[]{2,2});
矩阵加法
标量
矩阵1[2,2] 加上 一个标量 6 = [8,8]
INDArray add_num = nd1.add(6);
结果:
[[ 8.0000, 8.0000]]
矩阵
矩阵3 + 矩阵 4
INDArray add_NDArray = nd3.add(nd4);
结果:
[[ 7.0000, 7.0000],
[ 7.0000, 7.0000]]
矩阵减法
标量
INDArray sub_num = nd1.sub(6);
输出:
[[ -4.0000, -4.0000]]
矩阵
INDArray sub_NDArray = nd3.sub(nd4);
输出:
[[ -1.0000, -1.0000],
[ -1.0000, -1.0000]]
矩阵乘法
矩阵1 乘 矩阵2
INDArray add = nd1.mmul(nd2);
结果
[[12.0000]]
矩阵2 乘 矩阵1
INDArray add = nd2.mmul(nd1);
结果:
[[ 6.0000, 6.0000],
[ 6.0000, 6.0000]]
矩阵除法
INDArray div_num = nd1.div(2);
输出
[[ 1.0000, 1.0000]]
矩阵转置
INDArray transpose = nd2.transpose();
nd2 = [[3.0000],
[3.0000]]
转置 = [[ 3.0000, 3.0000]]
总结
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次相遇。
参考资料
《统计学习方法》
http://nd4j.org/cn/userguide#creating