繁体   English   中英

MATLAB中的多元线性回归

[英]Multivariate Linear Regression in MATLAB

我已经根据以下方面准备了数据:

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是我的响应变量。

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

我的另一个疑问是,在大多数资料来源显示的示例中,它们都使用最后一列数据作为响应变量,而这正是我在努力的部分。

fitlm将能够为您很好地做到这一点。 您可以使用fitlm训练线性回归模型,因此可以为其提供预测变量和响应。 完成此操作后,您就可以使用predict基于您输入的新预测变量来预测新响应。

您称呼它的基本方式是:

lmModel = fitlm(X, y, 'linear', 'RobustOpts', 'on');

X是数据矩阵,其中每一都是预测变量,每一都是观察值。 因此,在运行此功能之前,必须先转置矩阵。 基本上,您会执行P(1:3,:).' 因为您只需要数据的前三行(现为列)。 y将是每个观察值的输出值,这是一个列向量,其行数与观察值相同。 关于使用“ last”列作为响应向量的评论,您完全不必这样做。 您可以在完全独立的输入变量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辆各种汽车的观测值,并具有通常用于描述汽车的描述符,例如WeightDisplacementModel ...。 我们将使用Weight, CylindersAcceleration作为预测变量,让我们尝试预测每加仑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值越小,该预测变量就越适合您的模型。 您会看到前两个预测变量: WeightCylinders是确定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之前存在,以便您可以使用。


祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM