matlab多元线性回归
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab多元线性回归相关的知识,希望对你有一定的参考价值。
我想问一下我这里哪里有错呢
X=[ones(5,1),X1\',X2\',X3\',X4\',X5\']; 这句命令有问题,错误主要出在ones(5,1)中的5。ones(5,1)中的5应该是X1向量的长度,即X1的列数。可以这样更改一下就ok了。
n=length(X1)
X=[ones(n,1) X1\' X2\' X3\' X4\' X5\'];追问
我想知道怎么做多次去点拟合哦
追答对于线性拟合函数,用regress()函数拟合一次就行了。
追问怎么画图呢?
追答这么多变量不太好画啊复制去Google翻译翻译结果二人
参考技术A1、X里面的ones(5,1)应该是ones(length(X1),1);
2、最后一句的Y应该转置,即Y'。
MATLAB 中的多元线性回归
【中文标题】MATLAB 中的多元线性回归【英文标题】:Multivariate Linear Regression in MATLAB 【发布时间】:2014-09-21 13:19:15 【问题描述】:我的数据已经准备好:
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
是我的响应变量。
我现在如何为这组数据拟合线性模型来检查我的预测效果?顺便说一下,它是电力负荷预测模型。
我的另一个疑问是,在大多数来源显示的示例中,他们使用最后一列数据作为响应变量,这是我正在努力解决的部分。
【问题讨论】:
欢迎来到 Stack Overflow!由于我们想为您提供一些帮助,您能否首先通过数据示例、当前代码示例以及如何计算电力负荷预测模型来详细说明您的问题?老实说,我们是 Matlab 编码器,可能无法在您的研究领域工作。 %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;尺寸(L,1);对于 a=5:2:size(L,1)-48 % L 负载 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;结束 【参考方案1】: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 之前,因此您应该可以使用它。
祝你好运!
【讨论】:
非常感谢。非常欣赏它。但是,我使用的是没有 fitlm 功能的 2013a。我正在使用 LinearModel.fit 我认为它也具有相同的功能? @user3800114 -linearmodel.fit
可以。我会修改我的帖子。
@user3800114 - 完成。 LinearModel.fit
应该和fitlm
做同样的事情,但是有一个警告,这个函数将在以后的版本中被删除,所以每当你升级你的 MATLAB(如果你这样做),使用fitlm
。祝你好运!
@user3800114 - 帮我一个忙,如果这对您有帮助,请接受我的回答。 ***.com/help/someone-answers
我绘制了原始数据和预测数据。查看 P 值,我的值非常小,这表明预测变量非常显着,但是 RMSE 仍然很高,我将如何进一步改进它并可能删除一些异常值?谢谢以上是关于matlab多元线性回归的主要内容,如果未能解决你的问题,请参考以下文章