Error using * 内部矩阵尺寸必须在使用最小二乘法时一致 - 如何为多个自变量制作回归量数组
Error using * Inner matrix dimensions must agree in using Least Squares - how to make the regressor array for multiple independent variables
我正在尝试学习如何编写线性回归代码,其中数据 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));
因此 pred_year_val
的大小为 [1 2]
,而 theta
的大小为 [3 1]
。利用鸽巢原理可以确定pred_year_val
的列数不等于theta
的行数,因此不能进行矩阵乘法,即执行
pred_value = pred_year_val * theta;
注定要失败。因此,您似乎需要将化学成分的值添加到 pred_year_val
.
在 matlab 中,当您使用 *
运算符时,您引用的是矩阵乘法。矩阵乘法对相乘矩阵的维数有严格的规定。
检查你的代码,你的意图似乎不是做矩阵乘法....
您可以使用 *
将标量乘以矩阵,并相应地缩放矩阵中的每个值。
您还可以使用 .*
运算符进行向量乘法,有时称为 逐个元素乘法 。
要解决您的问题,您必须阐明您是打算进行矩阵乘法、标量乘法还是向量乘法。然后,您必须正确设置操作数和运算符以反映您的目标。
我不清楚您的代码中的数学应该如何执行,否则我可以帮助您说明必须更改运算符和操作数的位置。
您可以先查看此处的文档:https://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html
我正在尝试学习如何编写线性回归代码,其中数据 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));
因此 pred_year_val
的大小为 [1 2]
,而 theta
的大小为 [3 1]
。利用鸽巢原理可以确定pred_year_val
的列数不等于theta
的行数,因此不能进行矩阵乘法,即执行
pred_value = pred_year_val * theta;
注定要失败。因此,您似乎需要将化学成分的值添加到 pred_year_val
.
在 matlab 中,当您使用 *
运算符时,您引用的是矩阵乘法。矩阵乘法对相乘矩阵的维数有严格的规定。
检查你的代码,你的意图似乎不是做矩阵乘法....
您可以使用 *
将标量乘以矩阵,并相应地缩放矩阵中的每个值。
您还可以使用 .*
运算符进行向量乘法,有时称为 逐个元素乘法 。
要解决您的问题,您必须阐明您是打算进行矩阵乘法、标量乘法还是向量乘法。然后,您必须正确设置操作数和运算符以反映您的目标。
我不清楚您的代码中的数学应该如何执行,否则我可以帮助您说明必须更改运算符和操作数的位置。
您可以先查看此处的文档:https://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html