java.lang.IllegalArgumentException: внутренние размеры матрицы должны совпадать

Вот мой код:

package algorithms;
import Jama.Matrix;
import java.io.File;
import java.util.Arrays;
public class ThetaGetter {
    //First column is one, second is price and third is BHK
    private static double[][] variables = {
        {1,1130,2},
        {1,1100,2},
        {1,2055,3},
        {1,1047,2},
        {1,1927,3},
        {1,2667,3},
        {1,1146,2},
        {1,2020,3},
        {1,1190,2},
        {1,2165,3},
        {1,1250,2},
        {1,1185,2},
        {1,2825,4},
        {1,1200,2},
        {1,1580,3},
        {1,3200,3},
        {1,715,1},
        {1,1270,2},
        {1,2403,3},
        {1,1465,3},
        {1,1345,2}
    };

    private static double[][] prices = {
        {69.65},
        {60},
        {115},
        {55},
        {140},
        {225},
        {76.78},
        {120},
        {73.11},
        {140},
        {56},
        {79.39},
        {161},
        {73.69},
        {80},
        {145},
        {34.87},
        {77.72},
        {165},
        {98},
        {82}
    };
    private static Matrix X = new Matrix(variables);
    private static Matrix y = new Matrix(prices);
    public static void main(String[] args) {
        File file = new File("theta.dat");
        if(file.exists()){
            System.out.println("Theta has already been calculated!");
            return;
        }
        //inverse(Tra(X)*X)*tra(X)*y
        Matrix transposeX = X.transpose();
        Matrix inverse = X.times(transposeX).inverse();
        System.out.println(y.getArray().length);
        System.out.println(X.getArray().length);
        Matrix test = inverse.times(transposeX);
        Matrix theta = test.times(y);
        System.out.println(Arrays.deepToString(theta.getArray()));
    }
}

Этот алгоритм в основном пытается взять цены на жилье, а затем получить несколько констант, которые затем используются для угадывания цен на дома. Однако я получаю исключение в строке «Matrix theta = test.times (y);» Сообщение об ошибке в значительной степени то, что в вопросе. Есть какая-то проблема с размерами? У обоих по 21 предмету, так что я не знаю, что происходит.


person Aadit Kolar    schedule 14.03.2018    source источник


Ответы (1)


Ошибка, которую вы делаете, заключается в следующей строке кода:

Matrix inverse = X.times(transposeX).inverse();

Формула, которую вы прокомментировали выше:

//inverse(Tra(X)*X)*tra(X)*y

но то, что вы на самом деле вычисляете в коде, это: (X * Tra (X) вместо Tra (X) * X)

//inverse(X*Tra(X))*tra(X)*y

Если размерность X равна (m,n), где

  • м = количество строк
  • n = количество столбцов

а размерность Y равна (м, 1), используя умножения, которые вы использовали выше, вы получите следующее:

обратный (X * Tra (X)) * Tra (X) * Y = обратный * Tra (X) * Y = результат * y

inverse((m,n)(n,m))(n,m)*(m,1)= (m,m) * (n,m) => что приводит к ошибке потому что внутренние размеры для матричного умножения должны быть равны

Что исправит ваш код, заменив следующую строку:

Matrix inverse = X.times(transposeX).inverse();

с

 Matrix inverse = transposeX.times(X).inverse();
person frozencure    schedule 14.03.2018