MATLAB FILM: Jak obliczyć korelacje

O korelacji na konkretnym przykładzie: czym się różnią funkcje cov, xcov, corrcoeff i xcorr? Jak interpretować wartości współczynników korelacji i kowariancji oraz funkcji podobieństwa?

O wspomnianych w nagłówku funkcjach oraz ich interpretacji taktuje film na moim kanale. Wyjaśniam w nim zawiłości związane z obliczaniem podobieństwa między sygnałami na przykładzie danych pomiarowych z zegarka biegowego. Dane można pobrać tutaj, a listing programu jest poniżej.

clear all; close all; clc
load 2022_garmin_data

%% Rysunki
figure; subplot(211); plot(t, V, 'LineWidth', 2); 
my_figure('', 'V [km/h]', 'Prędkość'); grid on;
subplot(212); plot(t, HR, 'r', 'LineWidth', 2);
my_figure('czas [min]', 'HR [bpm]', 'Tętno'); grid on;



%% Współczynnik KOWARIANCJI

%% 1 - Analitycznie
wsp_cov1 = dt * sum((V-mean(V)) .* (HR-mean(HR))) / to
wsp_cov2 = sum((V-mean(V)) .* (HR-mean(HR))) / (N-1)


%% 2 - Funkcja MATLABa
m_cov = cov(V,HR)



%% Funkcja kowariancji
[f_cov, lags] = xcov(V, HR, 'unbiased',N/2);
tal=lags*dt;
figure; plot(tal, f_cov, 'LineWidth', 2); 
my_figure('Tal [min]', 'Cxy', 'Funkcja kowariancji V-HR');
grid on;


%% Współczynnik kowariancji na podstawie funkcji kowariancji
wsp_f_cov = f_cov(tal==0)



%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Współczynnik KORELACJI

%% 1 - Analitycznie przez normowanie współczynnika kowariancji
varV = var(V);
varHR = var(HR);
stdV = std(V);
stdHR = std(HR);

wsp_kor1_1 = m_cov(1,1) / varV
wsp_kor1_2 = m_cov(1,2) / (stdV * stdHR)
wsp_kor2_2 = m_cov(2,2) / varHR

m_kor_cov = [wsp_kor1_1 wsp_kor1_2; wsp_kor1_2 wsp_kor2_2]


%% Funkcja MATLABa
m_kor = corrcoef(V, HR)


%% Funkcja korelacji

%% 1 - Bezpośrednie wywołanie funkcji xcorr
[f_kor_raw, lags] = xcorr(V, HR, 'unbiased', N/2);
figure; subplot(211);
plot(tal, f_kor_raw, 'LineWidth', 2);
my_figure('Tal [min]', 'Rxy raw', 'Funkcja korelacji V-HR');


%% 2 - xcorr z odjętymi wartościami średnimi i unormowana
[f_kor_norm, lags] = xcorr(V - mean(V), HR - mean(HR), 'coef', N/2);
tal=lags*dt;
subplot(212)
plot(tal, f_kor_norm, 'LineWidth', 2); 
my_figure('Tal [min]', 'Rxy', 'Unormowana funkcja korelacji V-HR');
grid on;


%% 3 - na podstawie funkcji kowariancji
f_kor_cov = f_cov / (stdV * stdHR);

hold on;
plot(tal, f_kor_cov, 'LineWidth', 2); 
my_figure('Tal [min]', 'Rxy', 'Unormowana funkcja korelacji V-HR');
grid on; legend('xcorr normowana', 'na podst. xcov')


%% Współczynnik korelacji na podstawie funkcji korelacji
wsp_f_kor = f_kor_norm(tal==0)

Funkcja do szablonu rysunków:

function my_figure(opisX, opisY, tytul)
%% Zmienione argumenty wejściowe funkcji na opisy osi!
 
%% CREATEFIGURE2(X1, Y1) <-- Taka była pierwotna składnia funkcji.
%  X1:  vector of x data
%  Y1:  vector of y data
 
%  Auto-generated by MATLAB on 18-Mar-2020 10:38:53
 
% Create figure
% figure1 = figure; % To usuwamy, gdyż rysunek będzie tworzony 
                    % na zewnątrz funkcji
 
% Create axes
% axes1 = axes;     % To również usuwamy, gdyż obiekt axes, jest już
                    % stworzony na aktywnym rysunku
axes1 = gca;
hold(axes1,'on');
 
% Create plot
% plot(X1,Y1,'LineWidth',2);    % To samo dotyczy linii
 
% Create ylabel
% ylabel({'Opis osi Y'});       % Podmieniamy, tak aby móc wprowadzać
ylabel(opisY);                  % swój tekst. Podobnie z xlabel i title
 
% Create xlabel
xlabel(opisX);
 
% Create title
title(tytul);
 
% Uncomment the following line to preserve the X-limits of the axes
% xlim(axes1,[0 1]);
box(axes1,'on');
% Set the remaining axes properties
set(axes1,'FontName','Century Gothic','FontSize',12,...
    'LabelFontSizeMultiplier',1.3,'TitleFontSizeMultiplier',1.1,'XGrid','on',...
    'LineWidth',1,'TickLength',[0.02 0.025],'XMinorTick','on','YGrid','on','YMinorTick','on');
 
%% Jeżeli rysunek zawiera więcej niż jedną linia, konieczna jest pętla:
 
% liczba_lini = size(axes1.Children);
% for k = 1 : liczba_lini
%     axes1.Children(k,1).LineWidth = 2;
% end
(Visited 438 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *