www.gusucode.com > matlab 案例源码 matlab代码程序 > matlab/ModelingDataExample.m

    %% Modeling Data
% This example shows model data.
%% Overview
% Parametric models translate an understanding of data relationships into
% analytic tools with predictive power. Polynomial and sinusoidal models
% are simple choices for the up and down trends in the traffic data.
%% Polynomial Regression
% Use the |polyfit| function to estimate coefficients of polynomial models,
% then use the |polyval| function to evaluate the model at arbitrary values
% of the predictor.
%%
% The following code fits the traffic data at the third intersection with a
% polynomial model of degree six:

% Copyright 2015 The MathWorks, Inc.

load count.dat
c3 = count(:,3); % Data at intersection 3 
tdata = (1:24)'; 
p_coeffs = polyfit(tdata,c3,6);

figure 
plot(c3,'o-') 
hold on 
tfit = (1:0.01:24)'; 
yfit = polyval(p_coeffs,tfit); 
plot(tfit,yfit,'r-','LineWidth',2)
legend('Data','Polynomial Fit','Location','NW')
%% 
% The model has the advantage of being simple while following the
% up-and-down trend. The accuracy of its predictive power, however, is
% questionable, especially at the ends of the data.
%% General Linear Regression
% Assuming that the data are periodic with a 12-hour period and a peak
% around hour 7, it is reasonable to fit a sinusoidal model of the form:
%% General Linear Regression - embed
% The coefficients _a_ and _b_ appear linearly. Use the MATLAB(R) |mldivide|
% (backslash) operator to fit general linear models:
%% 
load count.dat
c3 = count(:,3); % Data at intersection 3 
tdata = (1:24)'; 
X = [ones(size(tdata)) cos((2*pi/12)*(tdata-7))];
s_coeffs = X\c3;

figure
plot(c3,'o-')
hold on
tfit = (1:0.01:24)';
yfit = [ones(size(tfit)) cos((2*pi/12)*(tfit-7))]*s_coeffs; 
plot(tfit,yfit,'r-','LineWidth',2)
legend('Data','Sinusoidal Fit','Location','NW')
%% 
% Use the |lscov| function to compute statistics on the fit, such as
% estimated standard errors of the coefficients and the mean squared error:
[s_coeffs,stdx,mse] = lscov(X,c3)
%% 
% Check the assumption of a 12-hour period in the data with a _periodogram_,
% computed using the |fft| function:
Fs = 1; % Sample frequency (per hour)
n = length(c3); % Window length
Y = fft(c3); % DFT of data
f = (0:n-1)*(Fs/n); % Frequency range
P = Y.*conj(Y)/n; % Power of the DFT

figure
plot(f,P)
xlabel('Frequency')
ylabel('Power')

predicted_f = 1/12
%% 
% The peak near |0.0833| supports the assumption, although it occurs at a
% slightly higher frequency. The model can be adjusted accordingly.