Ошибка при использовании * Внутренние размеры матрицы должны согласовываться при использовании наименьших квадратов - как сделать массив регрессоров для нескольких независимых переменных - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь научиться кодировать для линейной регрессии, где данные statistics_data представляют год роста дрожжей в первом столбце, значение химического компонента во втором столбце и значение населения в третьем столбце. Как только theta вычислено с использованием формулы наименьших квадратов, я хочу предсказать значение населения, используя: pred_year = 2020; pred_year_val = [1 2020];, что дает эту ошибку:

Error using  * 
Inner matrix dimensions must agree.

Error in main_normal_equation (line 44)
pred_value = pred_year_val * theta;

Ниже приведен код:

    statistics_data = [2007, 9182927, 2;
2008,3,9256347;
2009,3.5,9340682;
2010,4,9415570;
2011,5,9482855;
2012,4.8,9555893;
2013,4.9,9644864;
2014,5,9747355;
2015,5,9851017;
2016,5,9995153;
2017,5,10120242;];


% Convert to independent variable matrix and response
X = (statistics_data(:,1:2));
y = (statistics_data(:,3));

% Convert matrix values to double
X = double(X);
y = double(y);

hold on;
% Set the x-axis label
xlabel('Year'); 
% Set the y-axis label
ylabel('Population'); 

% Plot population data
plot(X, y, 'rx', 'MarkerSize', 10);

m = length(y);
% Add ones column
X = [ones(m, 1) X];

%  Normal Equation
theta = (pinv(X'*X))*X'*y

% Predict population for 2020
pred_year = 2020;
pred_year_val = [1 2020];

% Calculate predicted value
pred_value = pred_year_val * theta;

% Plot linear regression line
plot(X(:,2), X*theta, '-')

   fprintf('Predicted population in 2020 is %d people\n ', int64(pred_value));

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

В Matlab, когда вы используете оператор *, вы ссылаетесь на матрицу умножения. Умножение матриц имеет строгие правила относительно размеров умноженных матриц.

Проверяя ваш код, не похоже, что вы намереваетесь сделать матричное умножение ....

Вы можете умножить скаляр на матрицу, используя *, и соответственно масштабировать каждое значение в матрице.

Вы также можете векторное умножение, которое иногда называется элемент умножением элемента , используя оператор .*.

Чтобы решить вашу проблему, вы должны уточнить, намеревались ли вы сделать умножение матриц, скалярное умножение или векторное умножение. Затем вы должны правильно настроить свои операнды и оператор для отражения того, чего вы хотите достичь.

Мне не совсем понятно, как должна выполняться математика в вашем коде, иначе я мог бы помочь вам показать, где должны быть изменены ваши операторы и операнды.

Вы можете начать с просмотра документации здесь: https://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html

0 голосов
/ 15 апреля 2019

Так что pred_year_val имеет размер [1 2], а theta имеет размер [3 1].Используя принцип дырки для голубей, мы можем определить, что число столбцов pred_year_val не равно количеству строк theta, и, следовательно, мы не можем выполнить умножение матриц, то есть выполнение

pred_value = pred_year_val * theta;
* 1009.* обязательно потерпит неудачу.Похоже, вам нужно добавить значение для химического компонента в pred_year_val.
...