Java实现"矩阵链算法MATCHAIN”

import java.io.IOException;

/**

 * 题目:对于一下5个矩阵应用算法设计MATCHAIN矩阵链算法

 * M1:2x3; M2:3x6; M3:6x4; M4:4x2; M5:2x7;

 * (a)找出这5个矩阵相乘所需要的最少乘法运算次数(即矩阵链算法求 C[1,5])

 * (b)请给出一个括弧序列表示出矩阵乘法的优先顺序;

 *

 * title_矩阵链算法 made by 任辉 2010-10-22

 */

 

public class Task7_11 {

    private int[] r = { 2, 3, 6, 4, 2, 7 };//矩阵链

    private int C[][];//存储三角表

    private int s[][];//记录断点位置

 

    /** 构造 */

    public Task7_11() throws IOException {

       System.out.print("根据本题M1:2x3,M2:3x6,M3:6x4,M4:4x2,M5:2x7/n所以");

       System.out.print("矩阵链数组为:");

       for (int i = 0; i < r.length; i++)

           System.out.print(r[i] + ",");

       System.out.println("");

       System.out.println("这个矩阵链的最少乘法运算次数是:" + MATCHAIN());

       printC();

       printS();

       System.out.printf("矩阵的结合方式:");

 

       Traceback(1, r.length - 1, s);

       // printSort();

    }

 

    /** 矩阵连算法 */

    public int MATCHAIN() {

       // order = new ArrayList<M>();

       int i, j, d;

       C = new int[r.length][r.length];

       s = new int[r.length][r.length];

       for (i = 1; i <= r.length - 1; i++) {

           C[i][i] = 0;

       }

       for (d = 1; d <= r.length - 2; d++)

           for (i = 1; i <= r.length - 1 - d; i++) {

              j = i + d;

              C[i][j] = Integer.MAX_VALUE;

              for (int k = i + 1; k <= j; k++) {

                  C[i][j] = min(C[i][j], C[i][k - 1] + C[k][j] + r[i - 1]// r的下标注意了

                         * r[k - 1] * r[j]);// 太关键了,这个位置花了一个小时调试好!汗!!

                  s[i][j] = k;//记录断点位置

              }

              // order.add(new M(i, j));

           }

       return C[1][r.length - 1];

    }

 

    /** 二者求最小 */

    public int min(int a, int b) {

       if (a >= b)

           return b;

       else

           return a;

    }

 

    /** 打印二维数组 */

    public void printC() {

       System.out.println("C:");

       for (int i = 0; i < C.length; i++) {

           for (int j = 0; j < C.length; j++) {

              // if (C[i][j] < 100)

              System.out.printf("%4d", C[i][j]);

              // else

              // System.out.print(C[i][j] + "  ");

           }

 

           System.out.println("");

       }

    }

 

    /** 打印断点数组 */

    public void printS() {

       System.out.println("s[][]:");

       for (int k = 0; k < s.length; k++) {

           for (int m = 0; m < s.length; m++)

              System.out.printf("%3d", s[k][m]);

           System.out.println("");

       }

    }

 

    /** 矩阵的括弧 */

    public void Traceback(int i, int j, int[][] s) {

 

       i = i - 1;

       j = j - 1;

       if (i == j) {

           // System.out.print("A" + (i+1));

           System.out.print("M");

       } else if (i + 1 == j) {

           // System.out.print("(A" + (i+1) + "A" + (j+1));

           System.out.print("(M " + "M");

       } else {

           System.out.print("(");

           Traceback(i, s[i][j], s);

           Traceback(s[i][j] + 1, j, s);

           System.out.print(")");

       }

    }

 

    public static void main(String[] args) throws IOException {

       new Task7_11();

    }

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 Java 实现矩阵分解推荐算法代码示例: ``` import java.util.*; import java.io.*; public class MatrixFactorization { int numUsers; int numItems; double[][] userFactors; double[][] itemFactors; double learningRate; double regularization; int numIterations; public MatrixFactorization(int numUsers, int numItems, int numFactors, double learningRate, double regularization, int numIterations) { this.numUsers = numUsers; this.numItems = numItems; userFactors = new double[numUsers][numFactors]; itemFactors = new double[numItems][numFactors]; this.learningRate = learningRate; this.regularization = regularization; this.numIterations = numIterations; } public void train(int[][] ratings) { for (int iter = 0; iter < numIterations; iter++) { for (int u = 0; u < numUsers; u++) { for (int i = 0; i < numItems; i++) { if (ratings[u][i] > 0) { double prediction = 0; for (int f = 0; f < userFactors[u].length; f++) { prediction += userFactors[u][f] * itemFactors[i][f]; } double error = ratings[u][i] - prediction; for (int f = 0; f < userFactors[u].length; f++) { userFactors[u][f] += learningRate * (error * itemFactors[i][f] - regularization * userFactors[u][f]); itemFactors[i][f] += learningRate * (error * userFactors[u][f] - regularization * itemFactors[i][f]); } } } } } } public double[][] getUserFactors() { return userFactors; } public double[][] getItemFactors() { return itemFactors; } public static void main(String[] args) { int numUsers = 5; int numItems = 4; int[][] ratings = {{5, 3, 0, 1}, {4, 0, 0, 1}, {1, 1, 0, 5}, {0, 0, 4, 4}, {0, 1, 5, 4}}; int numFactors = 2; double learningRate = 0.01; double regularization = 0.1; int numIterations = 100; MatrixFactorization mf = new MatrixFactorization(numUsers, numItems, numFactors, learningRate, regularization, numIterations); mf.train(ratings); double[][] userFactors = mf.getUserFactors(); double[][] itemFactors = mf.getItemFactors(); System.out.println("User factors:"); for (int u = 0; u < numUsers; u++) { System.out.print("User " + u + ": "); for (int f = 0; f < numFactors; f++) { System.out.print(userFactors[u][f] + " "); } System.out.println(); } System.out.println("Item factors:"); for (int i = 0; i < numItems; i++) { System.out.print("Item " + i + ": "); for (int f = 0; f < numFactors; f++) { System.out.print(itemFactors[i][f] + " "); } System.out.println(); } } } ``` 该代码实现了基于梯度下降的矩阵分解推荐算法。在本例中,我们使用一个大小为 5 x 4 的评分矩阵作为输入,其中每行代表一个用户,每列代表一个物品。为了简化问题,使用了隐含因子数量为 2 的模型。在模型训练期间,每次迭代都会使用随机梯度下降更新用户矩阵和物品矩阵的值,以尝试最小化预测值与实际值之间的误差。在训练完成后,输出用户因子矩阵和物品因子矩阵的值,以便进行推荐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值