fitlm 将能够很好地为您做到这一点。您使用fitlm 来训练 线性回归模型,因此您可以为其提供预测变量和响应。完成此操作后,您可以使用predict 根据您输入的新预测器预测新响应。
你的基本称呼是:
lmModel = fitlm(X, y, 'linear', 'RobustOpts', 'on');
X 是一个数据矩阵,其中每个 列 是一个预测变量,每个 行 是一个观察值。因此,您必须在运行此函数之前转置您的矩阵。基本上,您会使用P(1:3,:).',因为您只需要数据的前三行(现在是列)。 y 将是您每次观察的输出值,这是一个列向量,其行数与您的观察相同。关于您关于使用“最后”列作为响应向量的评论,您根本不必这样做。您在一个完全独立的输入变量中指定您的响应向量,即y。因此,您的 a1 将在此处提供服务,而您的预测变量和观察结果将存储在 X 中。您完全可以将响应向量作为矩阵中的一列;您只需要相应地对其进行子集化。
因此,y 将是您的a1 变量,并且确保它是一个列向量,因此您可以这样做a1(:) 以确保。 linear 标志指定线性回归,但无论如何这是默认标志。建议使用RobustOpts,以便您可以执行稳健的线性回归。对于您的情况,您必须以这种方式致电fitlm:
lmModel = fitlm(P(1:3,:).', a1(:), 'linear', 'RobustOpts', 'on');
现在要预测新的反应,你会这样做:
ypred = predict(lmModel, Xnew);
Xnew 将是您的新观察结果,其风格与X 相同。您必须与X 具有相同数量的列,但您可以拥有任意数量的行。输出 ypred 将为您提供对您拥有的 X 的每个观察的预测响应。例如,让我们使用 MATLAB 中内置的数据集,将数据拆分为训练和测试数据集,用训练集拟合模型,然后使用测试数据集并查看预测的响应是什么。让我们拆分数据,使其比例为 75% / 25%。我们将使用 carsmall 数据集,该数据集包含 100 个对各种汽车的观察结果,并具有诸如 Weight、Displacement、Model... 等通常用于描述汽车的描述符。我们将使用Weight, Cylinders 和Acceleration 作为预测变量,让我们尝试预测每加仑英里数MPG 作为我们的结果。一旦我这样做了,让我们计算预测值和真实值之间的差异并在它们之间进行比较。因此:
load carsmall; %// Load in dataset
%// Build predictors and outcome
X = [Weight Cylinders Acceleration];
y = MPG;
%// Set seed for reproducibility
rng(1234);
%// Generate training and test data sets
%// Randomly select 75 observations for the training
%// dataset. First generate the indices to select the data
indTrain = randperm(100, 75);
%// The above may generate an error if you have anything below R2012a
%// As such, try this if the above doesn't work
%//indTrain = randPerm(100);
%//indTrain = indTrain(1:75);
%// Get those indices that haven't been selected as the test dataset
indTest = 1 : 100;
indTest(indTrain) = [];
%// Now build our test and training data
trainX = X(indTrain, :);
trainy = y(indTrain);
testX = X(indTest, :);
testy = y(indTest);
%// Fit linear model
lmModel = fitlm(trainX, trainy, 'linear', 'RobustOpts', 'on');
%// Now predict
ypred = predict(lmModel, testX);
%// Show differences between predicted and true test output
diffPredict = abs(ypred - testy);
当你回显线性模型的样子时会发生这种情况:
lmModel =
Linear regression model (robust fit):
y ~ 1 + x1 + x2 + x3
Estimated Coefficients:
Estimate SE tStat pValue
__________ _________ _______ __________
(Intercept) 52.495 3.7425 14.027 1.7839e-21
x1 -0.0047557 0.0011591 -4.1031 0.00011432
x2 -2.0326 0.60512 -3.359 0.0013029
x3 -0.26011 0.1666 -1.5613 0.12323
Number of observations: 70, Error degrees of freedom: 66
Root Mean Squared Error: 3.64
R-squared: 0.788, Adjusted R-Squared 0.778
F-statistic vs. constant model: 81.7, p-value = 3.54e-22
这一切都来自统计分析,但对于新手来说,重要的是我们每个预测变量的p-values。 p 值越小,此预测器越适合您的模型。您可以看到前两个预测变量:Weight 和 Cylinders 是确定 MPG 的良好表示。 Acceleration... 没那么多。这意味着这个变量不是一个有意义的预测器,所以你应该使用别的东西。事实上,如果您要删除此预测器并重新训练您的模型,您很可能会看到预测值与包含 Acceleration 的值非常匹配。
这是解释p-values 的真正混蛋版本,因此我将您带到实际的回归模型或统计课程以了解更多详细信息。
这是我们预测的值,给定我们的测试集以及真正的值是什么:
>> [ypred testy]
ans =
17.0324 18.0000
12.9886 15.0000
13.1869 14.0000
14.1885 NaN
16.9899 14.0000
29.1824 24.0000
23.0753 18.0000
28.6148 28.0000
28.2572 25.0000
29.0365 26.0000
20.5819 22.0000
18.3324 20.0000
20.4845 17.5000
22.3334 19.0000
12.2569 16.5000
13.9280 13.0000
14.7350 13.0000
26.6757 27.0000
30.9686 36.0000
30.4179 31.0000
29.7588 36.0000
30.6631 38.0000
28.2995 26.0000
22.9933 22.0000
28.0751 32.0000
测试数据集的第四个实际输出值为NaN,表示该值缺失。但是,当我们将对应于该输出值的观察结果运行到我们的线性模型中时,它无论如何都会预测出一个预期值。您还有其他观察结果来帮助训练模型,当使用此观察结果来查找预测时,它自然会从其他观察结果中提取。
当我们计算这两者之间的差异时,我们得到:
diffPredict =
0.9676
2.0114
0.8131
NaN
2.9899
5.1824
5.0753
0.6148
3.2572
3.0365
1.4181
1.6676
2.9845
3.3334
4.2431
0.9280
1.7350
0.3243
5.0314
0.5821
6.2412
7.3369
2.2995
0.9933
3.9249
如您所见,在某些情况下预测非常接近,而在其他情况下预测与事实相去甚远......这确实是任何预测算法的症结所在。您将不得不使用您想要的预测变量,以及在您的训练中使用这些选项。请查看fitlm 文档,了解有关您可以使用的更多详细信息。
编辑 - 2014 年 7 月 30 日
由于您没有fitlm,您可以轻松使用LinearModel.fit。您可以使用与 fitlm 相同的输入来调用它。因此:
lmModel = LinearModel.fit(trainX, trainy, 'linear', 'RobustOpts', 'on');
这应该会给您完全相同的结果。 predict 应该存在于 R2014a 之前,因此您应该可以使用它。
祝你好运!