我正在尝试学习如何编码线性回归,其中数据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