线性回归——估计后卡在 Matlab 中的模型比较中?

Linear regression -- Stuck in model comparison in Matlab after estimation?

我想确定估计模型与未来新数据的拟合程度。为此,经常使用预测误差图。基本上,我想比较测量输出和模型输出。我使用最小均方算法作为均衡技术。有人可以帮忙绘制模型和测量数据之间比较的正确方法是什么吗?如果估计值接近真实,则曲线彼此应该非常接近。下面是代码。 u 是均衡器的输入,x 是有噪声的接收信号,y 是均衡器的输出,w 是均衡器的权重。图表应该使用 xy*w 绘制吗?但是 x 很吵。我很困惑,因为测量输出 x 有噪声,而模型输出 y*w 没有噪声。

%% Channel and noise level
h = [0.9 0.3 -0.1]; % Channel
SNRr = 10;              % Noise Level

%% Input/Output data
N = 1000;               % Number of samples
Bits = 2;               % Number of bits for modulation (2-bit for Binary modulation)
data = randi([0 1],1,N);        % Random signal
d = real(pskmod(data,Bits));    % BPSK Modulated signal (desired/output)
r = filter(h,1,d);              % Signal after passing through channel
x = awgn(r, SNRr);              % Noisy Signal after channel (given/input)

%% LMS parameters
epoch = 10;        % Number of epochs (training repetation)
eta = 1e-3;         % Learning rate / step size
order=10;           % Order of the equalizer

U = zeros(1,order); % Input frame
W = zeros(1,order); % Initial Weigths



%% Algorithm
for k = 1 : epoch
    for n = 1 : N
        U(1,2:end) = U(1,1:end-1);  % Sliding window
        U(1,1) = x(n);              % Present Input

        y = (W)*U';             % Calculating output of LMS
        e = d(n) - y;           % Instantaneous error 
        W = W +  eta * e * U ;  % Weight update rule of LMS
        J(k,n) = e * e';        % Instantaneous square error
    end
end

模型输出与观测数据的比较称为残差。

The difference between the observed value of the dependent variable (y) and the predicted value (ŷ) is called the residual (e). Each data point has one residual.

Residual = Observed value - Predicted value

e = y - ŷ

Both the sum and the mean of the residuals are equal to zero. That is, Σ e = 0 and e = 0.

A residual plot is a graph that shows the residuals on the vertical axis and the independent variable on the horizontal axis. If the points in a residual plot are randomly dispersed around the horizontal axis, a linear regression model is appropriate for the data; otherwise, a non-linear model is more appropriate.

这是我的模型的残差图示例。纵轴是模型输出与测量值之间的差异。横轴是模型中使用的自变量之一。

我们可以看到大部分残差都在0.2个单位以内,这恰好是我对这个模型的容忍度。因此,我可以对模型的价值做出结论。

有关类似问题,请参阅 here

关于您对模型输出中缺少噪声的问题。我们正在创建一个 线性 模型。有线索了。

让我们一步步开始:

  1. 首先,当使用一些拟合方法时,使用 RMS error 是一个好习惯。为此,我们必须找到输入和输出之间的错误。据我了解,x 是我们模型的输入,y 是输出。此外,您已经计算了它们之间的误差。但是你在没有保存的情况下循环使用了它。让我们修改您的代码:

    %% Algorithm
    for k = 1 : epoch
        for n = 1 : N
            U(1,2:end) = U(1,1:end-1);  % Sliding window
            U(1,1) = x(n);              % Present Input
    
            y(n) = (W)*U';             % Calculating output of LMS
            e(n) = x(n) - y(n);           % Instantaneous error 
            W = W +  eta * e(n) * U ;  % Weight update rule of LMS
            J(k,n) = e(n) * (e(n))';        % Instantaneous square error
        end
    end
    

    现在 e 包含最后一个纪元的错误。所以我们可以使用这样的东西:

    rms(e)
    

    另外我想用平均误差和标准差来比较结果:

    mean(e)
    std(e)
    

    还有一些可视化:

    histogram(e)
    

  2. 第二个时刻:我们不能只对向量使用 compare 函数!例如,您可以将它用于 dynamic system models. For it you have to made some workaround about using this method as dynamic model. But we can use some functions as goodnessOfFit。如果您希望在考虑所有先前数据点的每个步骤出现类似错误的情况,请进行一些数学解决方法 - 使用 [1:currentNumber] 在每个点计算它。

  3. 关于使用 LMS 方法。有内置函数计算LMS。让我们尝试将它用于您的数据集:

    alg = lms(0.001);
    eqobj = lineareq(10,alg);
    y1 = equalize(eqobj,x);
    

    让我们看看结果:

    plot(x)
    hold on
    plot(y1)
    

    有很多这样实现这个功能的例子:例如看here

希望对您有所帮助!