MATLAB中的多元线性回归

时间:2014-07-30 02:04:15

标签: matlab linear-regression

我已根据以下方式编制了数据:

p1=input1 %load of today current hour
p2=input2 %load of today past one hour
p3=input3 $load of today past two hours
a1=output %load of next day current hour

我在下面有以下代码:

%Input Set 1 For Weekday Load(d+1,t)
%(d,t),(d,t-1), (d,t-2)

L=xlsread('input_set1_weekday.xlsx',1); %2011

k=1;
size(L,1);

for a=5:2:size(L,1)-48 % L load for 2011    
    P(1,k)= L(a,1);
    P(2,k)= L(a-2,1);
    P(3,k)= L(a-4,1);
    P(4,k)= L(a+48,1);
    k=k+1;
end

我的数据排列方式是,在每一列中,p1, p2, p3是我的预测变量,a1是我的响应变量。

我现在如何将线性模型拟合到这组数据以检查我的预测的性能?顺便说一下,它是电力负荷预测模型。

我的另一个疑问是,在大多数消息来源显示的例子中,他们使用最后一列数据作为响应变量,这是我努力的部分。

1 个答案:

答案 0 :(得分:2)

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相同的风格。您必须拥有与<{1}}相同的相同数量的列,但您可以拥有任意数量的行。输出X将为您提供每个ypred观察的预测响应。例如,让我们使用内置于MATLAB中的数据集,将数据拆分为训练和测试数据集,使用训练集拟合模型,然后使用测试数据集并查看预测的响应是什么。让我们分开数据,使其达到75%/ 25%的比例。我们将使用X数据集,其中包含针对各种汽车的100个观测值,并具有carsmallWeightDisplacement等描述符...通常用于描述汽车。我们将使用ModelWeight, 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值越小,此预测器对您的模型越适合。您可以看到前两个预测变量:p-valuesWeight是确定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 文档,了解有关可以使用的内容的更多详细信息。


编辑 - 2014年7月30日

由于您没有fitlm,因此您可以轻松使用LinearModel.fit。您可以使用fitlm之类的相同输入来调用它。就这样:

fitlm

这应该给你完全相同的结果。 lmModel = LinearModel.fit(trainX, trainy, 'linear', 'RobustOpts', 'on'); 应该存在于R2014a之前,因此您应该可以使用。


祝你好运!